feat: add platform subscription invoice batching

This commit is contained in:
Codex
2026-06-30 04:56:28 +08:00
parent d5d32e84b3
commit 5320558d13
16 changed files with 670 additions and 126 deletions

View File

@@ -138,6 +138,26 @@ export interface PlatformUsageItem {
metadata?: Record<string, unknown> | null;
}
export interface PlatformSubscriptionInvoiceCandidate {
tenantId: string;
tenantSlug?: string | null;
tenantName?: string | null;
billingStatus?: string | null;
subscriptionId: string;
planCode?: string | null;
planName?: string | null;
status?: string | null;
startsAt?: string | null;
expiresAt?: string | null;
billingCycle?: string | null;
amountCents?: number | string | null;
existingInvoiceId?: string | null;
existingInvoiceNo?: string | null;
existingInvoiceStatus?: string | null;
hasExistingInvoice?: boolean | null;
wouldCreate?: boolean | null;
}
export interface PlatformQuestionBankItem {
id: string;
tenantId?: string | null;
@@ -226,6 +246,16 @@ export interface CreatePlatformInvoiceFromSubscriptionInput {
note?: string;
}
export interface CreatePlatformInvoicesBatchFromSubscriptionsInput {
tenantIds?: string[];
subscriptionIds?: string[];
daysAhead?: number;
status?: string;
dueDate?: string;
note?: string;
dryRun?: boolean;
}
export interface ConfirmPlatformInvoicePaymentInput {
tenantId: string;
invoiceId: string;
@@ -302,6 +332,13 @@ export async function loadPlatformUsage(query: { tenantId?: string; limit?: numb
});
}
export async function loadPlatformSubscriptionInvoiceCandidates(query: { tenantIds?: string; subscriptionIds?: string; daysAhead?: number; includeExisting?: boolean; limit?: number } = {}) {
return apiRequest<{ items?: PlatformSubscriptionInvoiceCandidate[] }>('/api/platform-admin/invoices/subscription-candidates', {
query: { ...query, limit: query.limit || 100 },
tenantId: null,
});
}
export async function loadPlatformQuestionBanks(query: { q?: string; status?: string; includeTenantBanks?: boolean; limit?: number } = {}) {
return apiRequest<{ items?: PlatformQuestionBankItem[] }>('/api/platform-admin/question-banks', {
query: { status: 'active', ...query, limit: query.limit || 80 },
@@ -356,6 +393,22 @@ export async function createPlatformInvoiceFromSubscription(input: CreatePlatfor
});
}
export async function createPlatformInvoicesBatchFromSubscriptions(input: CreatePlatformInvoicesBatchFromSubscriptionsInput) {
return apiRequest<{
item?: {
dryRun?: boolean;
createdCount?: number;
skippedCount?: number;
items?: Array<PlatformSubscriptionInvoiceCandidate & { invoice?: PlatformInvoiceItem }>;
skipped?: Array<Record<string, unknown>>;
};
}>('/api/platform-admin/invoices/from-subscriptions-batch', {
method: 'POST',
body: input,
tenantId: null,
});
}
export async function confirmPlatformInvoicePayment(input: ConfirmPlatformInvoicePaymentInput) {
return apiRequest<{ item?: Record<string, unknown> }>('/api/platform-admin/invoices/payments/manual-confirm', {
method: 'POST',