import { notFound } from "next/navigation"; import Link from "next/link"; import { prisma } from "@/lib/prisma"; import { BackLink } from "@/components/back-link"; import { formatPrice, formatDate } from "@/lib/format"; import { updateOrderStatusAction, updateShipmentTrackingAction, createDhlLabelAction, deleteOrderAction, } from "../../actions"; import { ConfirmForm } from "@/components/confirm-form"; import { OrderStatusForm } from "@/components/order-status-form"; import { checkOrderDeletable } from "@/lib/order-delete"; import { getLocale } from "@/i18n/locale"; import { getDictionary } from "@/i18n/get-dictionary"; import { isDhlConfigured } from "@/lib/dhl"; import { OrderStatusBadge, OrderStatusTimeline } from "@/components/account-ui"; import { Button } from "@/components/ui"; export default async function AdminOrderDetailPage(props: PageProps<"/admin/bestellungen/[id]">) { const t = getDictionary(await getLocale()); const statusLabels = t.orderStatusBadge; const { id } = await props.params; const order = await prisma.order.findUnique({ where: { id }, include: { items: { include: { product: { select: { slug: true } }, batch: { select: { code: true } } } }, payment: true, shipment: true, pickup: true, invoice: { include: { cancellation: { select: { number: true } } } }, customer: { select: { email: true, firstName: true, lastName: true } }, discountCode: { select: { code: true } }, }, }); if (!order) notFound(); const dhlConfigured = isDhlConfigured(); // Dieselbe Regel, die deleteOrderAction serverseitig durchsetzt — geteilt // ueber lib/order-delete.ts, damit Anzeige und Durchsetzung nicht // auseinanderlaufen koennen. const isDeletable = checkOrderDeletable({ status: order.status, hasPayment: order.payment !== null, hasInvoice: order.invoice !== null, }).deletable; return (
{formatDate(order.createdAt)}
{order.giftMessage}
{order.firstName} {order.lastName}
{order.email}
{order.phone ?{order.phone}
: null} {order.customer ? ({t.adminOrderDetailPage.registeredAccount}
) : ({t.adminOrderDetailPage.guestOrder}
)}{order.street}
{order.zip} {order.city}
{/* Nur bei Packstation-Lieferung: ohne die Postnummer laesst sich keine Versandmarke erstellen, und ohne Anzeige hier waere nicht nachvollziehbar, warum DHL sie ablehnt. */} {order.packstationNumber ? ({t.adminOrderDetailPage.postNumberLabel}: {order.postNumber ?? "—"}
) : null}{order.shipment?.shippedAt ? t.adminOrderDetailPage.shippedOn(formatDate(order.shipment.shippedAt)) : t.adminOrderDetailPage.notShippedYet}
> ) : ({order.pickup?.pickedUpAt ? t.adminOrderDetailPage.pickedUpOn(formatDate(order.pickup.pickedUpAt)) : order.pickup?.readyAt ? t.adminOrderDetailPage.readySince(formatDate(order.pickup.readyAt)) : t.adminOrderDetailPage.notPickedUpYet}
)}{t.adminOrderDetailPage.dhlAlreadyCreated(order.shipment.trackingNumber)}
) : dhlConfigured ? ( ) : ({t.adminOrderDetailPage.dhlNotConfigured}
)}| {t.adminOrderDetailPage.colProduct} | {t.adminOrderDetailPage.colBatch} | {t.adminOrderDetailPage.colQuantity} | {t.adminOrderDetailPage.colTotal} |
|---|---|---|---|
| {item.productName} {" "} ({item.weightGrams} g) | {item.batch?.code ?? "—"} | {item.quantity} | {formatPrice(item.totalCents, order.currency)} |
{order.payment.status}
{formatPrice(order.payment.amountCents, order.payment.currency)}
{order.payment.paidAt ? ({t.adminOrderDetailPage.paidOn(formatDate(order.payment.paidAt))}
) : null} > ) : ({t.adminOrderDetailPage.noPaymentYet}
)}{t.adminOrderDetailPage.noInvoiceYet}
)}{t.adminOrderDetailPage.deleteHint}
{t.adminOrderDetailPage.deleteBlocked}
)}