Akses super-admin diperlukan.
);
}
const [tenantCountByStatus, planCount, lastInvoiceDate, channelStatus] = await Promise.all([
prisma.tenant.groupBy({
by: ["status"],
_count: { _all: true }
}),
prisma.subscriptionPlan.count(),
prisma.billingInvoice.findFirst({
orderBy: { createdAt: "desc" },
select: { createdAt: true }
}),
prisma.channel.groupBy({
by: ["status"],
_count: { _all: true }
})
]);
const modules = [
{
name: "Subscription plans",
purpose: "Plan catalog dan metadata harga",
route: "/super-admin/billing/plans",
status: `${planCount} plans`
},
{
name: "Tenant management",
purpose: "Pengelolaan tenant, status, dan limit",
route: "/super-admin/tenants",
status: `${tenantCountByStatus.reduce((acc, item) => acc + item._count._all, 0)} tenants`
},
{
name: "Channel registry",
purpose: "Provider channel dan health status",
route: "/super-admin/channels",
status: `Connected: ${channelStatus.find((item) => item.status === "CONNECTED")?._count._all ?? 0}`
},
{
name: "Webhook logs",
purpose: "Monitoring event provider",
route: "/super-admin/webhook-logs",
status: "Realtime stream"
},
{
name: "Template policy",
purpose: "Approval dan pembatasan template",
route: "/templates",
status: "Review by tenant"
},
{
name: "Invoice monitoring",
purpose: "Status pembayaran tenant",
route: "/super-admin/billing/invoices",
status: lastInvoiceDate ? `Last: ${formatDate(lastInvoiceDate.createdAt)}` : "No invoices"
}
];
return (