Phase2: Invoicecomputation/AdminpricingUI/Ainvoicemgnt
Some checks failed
Build and Push / build (push) Failing after 28s
Some checks failed
Build and Push / build (push) Failing after 28s
This commit is contained in:
44
src/app/api/admin/billing/invoices/route.ts
Normal file
44
src/app/api/admin/billing/invoices/route.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { requirePlatformRole } from "@/lib/session";
|
||||
import { listInvoices, syncOverdueInvoices } from "@/lib/db";
|
||||
import type { InvoiceStatus } from "@/types";
|
||||
|
||||
/**
|
||||
* GET /api/admin/billing/invoices
|
||||
*
|
||||
* List invoices for admin. Optional filters:
|
||||
* ?status=open|paid|overdue|void|uncollectible
|
||||
* ?orgId=...
|
||||
* ?month=YYYY-MM
|
||||
* ?limit=200
|
||||
*
|
||||
* Refreshes overdue status on each call (cheap UPDATE), so the
|
||||
* admin list always reflects the latest due-date math without
|
||||
* needing a cron.
|
||||
*/
|
||||
export async function GET(request: Request) {
|
||||
try {
|
||||
await requirePlatformRole();
|
||||
} catch {
|
||||
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
|
||||
}
|
||||
|
||||
await syncOverdueInvoices().catch((e) =>
|
||||
console.error("syncOverdueInvoices failed:", e)
|
||||
);
|
||||
|
||||
const { searchParams } = new URL(request.url);
|
||||
const status = searchParams.get("status") as InvoiceStatus | null;
|
||||
const orgId = searchParams.get("orgId");
|
||||
const month = searchParams.get("month");
|
||||
const limitParam = searchParams.get("limit");
|
||||
const limit = limitParam ? Math.max(1, Math.min(1000, parseInt(limitParam, 10))) : 200;
|
||||
|
||||
const invoices = await listInvoices({
|
||||
status: status ?? undefined,
|
||||
zitadelOrgId: orgId ?? undefined,
|
||||
periodMonth: month ?? undefined,
|
||||
limit,
|
||||
});
|
||||
return NextResponse.json(invoices);
|
||||
}
|
||||
Reference in New Issue
Block a user