"use client"; import Link from "next/link"; import { useQuery } from "@tanstack/react-query"; import { Button, Card, CardContent, PageHeader, Badge } from "@/components/ds"; import { HospitalityBreadcrumbs } from "@/modules/hospitality/components/HospitalityBreadcrumbs"; import { HospitalityStatGrid } from "@/modules/hospitality/design-system"; import { HospitalityPageLoader, HospitalityPageError } from "@/modules/hospitality/pages/shared"; import { HospitalityBundleGate } from "@/modules/hospitality/components/HospitalityBundleGate"; import { hospitalityApi } from "@/modules/hospitality/services/hospitality-api"; import { useTenantId } from "@/hooks/useTenantId"; function useOpsCounts(tenantId: string | null) { return useQuery({ queryKey: ["hospitality", tenantId, "ops-counts"], queryFn: async () => { const [reservations, waitlist, tables, tickets, kitchen, serviceReqs] = await Promise.all([ hospitalityApi.reservations.list(tenantId!, { page: 1, page_size: 200 }), hospitalityApi.waitlist.list(tenantId!, { page: 1, page_size: 200 }), hospitalityApi.tables.list(tenantId!, { page: 1, page_size: 200 }), hospitalityApi.posTickets.list(tenantId!, { page: 1, page_size: 200 }), hospitalityApi.kitchenTickets.list(tenantId!, { page: 1, page_size: 200 }), hospitalityApi.serviceRequests.list(tenantId!, { page: 1, page_size: 200 }), ]); return { reservations: reservations.filter((r) => ["pending", "confirmed"].includes(String(r.status))).length, waitlist: waitlist.filter((w) => String(w.status) !== "seated" && String(w.status) !== "cancelled").length, freeTables: tables.filter((t) => String(t.status) === "available").length, openTickets: tickets.filter((t) => ["open", "draft"].includes(String(t.status))).length, kitchenActive: kitchen.filter((k) => !["completed", "cancelled"].includes(String(k.status))).length, serviceOpen: serviceReqs.filter((s) => String(s.status) === "open" || String(s.status) === "pending").length, }; }, enabled: !!tenantId, refetchInterval: 15_000, }); } export function OpsCenterPage() { const { tenantId } = useTenantId(); const q = useOpsCounts(tenantId); if (!tenantId || q.isLoading) return ; if (q.error) return q.refetch()} />; const c = q.data!; return (
q.refetch()}> بروزرسانی } />
); } export function KitchenOpsDashboard() { const { tenantId } = useTenantId(); const q = useQuery({ queryKey: ["hospitality", tenantId, "kitchen-ops"], queryFn: async () => { const [tickets, items] = await Promise.all([ hospitalityApi.kitchenTickets.list(tenantId!, { page: 1, page_size: 100 }), hospitalityApi.kitchenTicketItems.list(tenantId!, { page: 1, page_size: 200 }), ]); const active = tickets.filter((t) => !["completed", "cancelled"].includes(String(t.status))); return { active, pendingItems: items.filter((i) => String(i.status) !== "ready" && String(i.status) !== "completed") }; }, enabled: !!tenantId, refetchInterval: 8_000, }); return (
} /> {!tenantId || q.isLoading ? ( ) : q.error ? ( q.refetch()} /> ) : ( <> {q.data!.active.length === 0 ? (

بلیت فعالی در صف آشپزخانه نیست.

) : ( q.data!.active.slice(0, 12).map((t) => (
{String(t.id).slice(0, 8)} {String(t.status)}
)) )}
)}
); } export function WaiterOpsDashboard() { const { tenantId } = useTenantId(); const q = useOpsCounts(tenantId); return (
{!tenantId || q.isLoading ? ( ) : q.error ? ( q.refetch()} /> ) : ( <>
)}
); } export function CashierOpsDashboard() { const { tenantId } = useTenantId(); const q = useQuery({ queryKey: ["hospitality", tenantId, "cashier-ops"], queryFn: async () => { const [tickets, payments, registers] = await Promise.all([ hospitalityApi.posTickets.list(tenantId!, { page: 1, page_size: 100 }), hospitalityApi.posPayments.list(tenantId!, { page: 1, page_size: 100 }), hospitalityApi.posRegisters.list(tenantId!, { page: 1, page_size: 50 }), ]); return { open: tickets.filter((t) => ["open", "draft"].includes(String(t.status))).length, paymentsToday: payments.length, registers: registers.length, }; }, enabled: !!tenantId, refetchInterval: 12_000, }); return (
{!tenantId || q.isLoading ? ( ) : q.error ? ( q.refetch()} /> ) : ( <>
)}
); }