admin roadmap done, reupload request, submission history, manual override
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import Link from "next/link";
|
||||
import { redirect } from "next/navigation";
|
||||
import { getServerSession } from "next-auth";
|
||||
import { authOptions } from "@/lib/auth";
|
||||
import { isAdminEmail } from "@/lib/admin";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { systemHealthService } from "@/server/services/system-health.service";
|
||||
|
||||
interface JobSummary {
|
||||
jobName: string;
|
||||
@@ -78,11 +80,20 @@ export default async function AdminSystemPage() {
|
||||
);
|
||||
}
|
||||
|
||||
const summaries = await Promise.all(TRACKED_JOBS.map(getJobSummary));
|
||||
const recentRuns = await prisma.cronRun.findMany({
|
||||
orderBy: { startedAt: "desc" },
|
||||
take: 20,
|
||||
});
|
||||
const [summaries, recentRuns, stale] = await Promise.all([
|
||||
Promise.all(TRACKED_JOBS.map(getJobSummary)),
|
||||
prisma.cronRun.findMany({
|
||||
orderBy: { startedAt: "desc" },
|
||||
take: 20,
|
||||
}),
|
||||
systemHealthService.detectStale(),
|
||||
]);
|
||||
|
||||
const hasAnyStale =
|
||||
stale.stalePaymentsCount > 0 ||
|
||||
stale.awaitingPayPastDepartureCount > 0 ||
|
||||
stale.overduePayoutsCount > 0 ||
|
||||
stale.stuckRefundsCount > 0;
|
||||
|
||||
return (
|
||||
<div className="mx-auto max-w-5xl px-4 py-8 sm:py-12">
|
||||
@@ -96,6 +107,55 @@ export default async function AdminSystemPage() {
|
||||
</p>
|
||||
</header>
|
||||
|
||||
{hasAnyStale && (
|
||||
<section className="mb-6 rounded-2xl border border-amber-300 bg-amber-50 p-4 sm:p-5">
|
||||
<h2 className="mb-2 text-sm font-bold text-amber-900">
|
||||
⚠️ Stale State Alerts
|
||||
</h2>
|
||||
<ul className="space-y-1 text-xs text-amber-900">
|
||||
{stale.stalePaymentsCount > 0 && (
|
||||
<li>
|
||||
• <strong>{stale.stalePaymentsCount}</strong> Payment MIDTRANS
|
||||
AWAITING > 25 jam — webhook mungkin tertunda. Cek manual lalu
|
||||
reconcile.
|
||||
</li>
|
||||
)}
|
||||
{stale.awaitingPayPastDepartureCount > 0 && (
|
||||
<li>
|
||||
• <strong>{stale.awaitingPayPastDepartureCount}</strong> Booking
|
||||
AWAITING_PAY tapi trip sudah lewat tanggal berangkat — peserta
|
||||
lupa bayar, butuh cleanup.
|
||||
</li>
|
||||
)}
|
||||
{stale.overduePayoutsCount > 0 && (
|
||||
<li>
|
||||
• <strong>{stale.overduePayoutsCount}</strong> Payout HELD lewat
|
||||
heldUntil > 1 hari — cron release mungkin tidak jalan, cek
|
||||
cron history di bawah.{" "}
|
||||
<Link
|
||||
href="/admin/payouts?tab=HELD"
|
||||
className="font-semibold text-amber-700 hover:underline"
|
||||
>
|
||||
Lihat HELD →
|
||||
</Link>
|
||||
</li>
|
||||
)}
|
||||
{stale.stuckRefundsCount > 0 && (
|
||||
<li>
|
||||
• <strong>{stale.stuckRefundsCount}</strong> Refund APPROVED
|
||||
> 7 hari belum di-process.{" "}
|
||||
<Link
|
||||
href="/admin/refunds?tab=APPROVED"
|
||||
className="font-semibold text-amber-700 hover:underline"
|
||||
>
|
||||
Lihat APPROVED →
|
||||
</Link>
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
</section>
|
||||
)}
|
||||
|
||||
<section className="mb-8">
|
||||
<h2 className="mb-3 text-xs font-bold uppercase tracking-wide text-neutral-500">
|
||||
Cron Jobs
|
||||
|
||||
Reference in New Issue
Block a user