feat: Partner Command Center Module

- Extend types/partner.ts: riskScore, KYCDocument, PartnerEvent, RiskLevel
- Extend mockPartnerData.ts: risk scores, 15 KYC docs, 9 partner events, 6th partner
- Create lib/actions/partner-governance.ts: KYC verification, event approval, impersonation, 2FA/password reset, suspend/unsuspend
- Rewrite PartnerDirectory.tsx: card grid → data table with stats, risk gauge, filter tabs
- Rewrite PartnerProfile.tsx: tabs → 3-column layout (Identity | KYC Vault | Event Governance)
- Create KYCVaultPanel.tsx: per-doc approve/reject with progress bar and auto-verification
- Create EventApprovalQueue.tsx: pending events list with review dialog
- Create ImpersonationDialog.tsx: audit-aware confirmation with token generation
- Extend prisma/schema.prisma: PartnerProfile, PartnerDoc models, KYC/Event enums
- Add partner governance permission scopes to staff.ts
This commit is contained in:
CycroftX
2026-02-11 10:06:30 +05:30
parent 04e2db6571
commit 49770dfe73
11 changed files with 1767 additions and 399 deletions

View File

@@ -158,3 +158,60 @@ model CampaignAuditLog {
createdAt DateTime @default(now())
}
// ===== PARTNER GOVERNANCE =====
enum KYCStatus {
PENDING
VERIFIED
REJECTED
}
enum KYCDocStatus {
PENDING
APPROVED
REJECTED
}
enum PartnerEventStatus {
PENDING_REVIEW
LIVE
DRAFT
COMPLETED
CANCELLED
REJECTED
}
model PartnerProfile {
id String @id @default(cuid())
userId String @unique // FK to User table
verification KYCStatus @default(PENDING)
riskScore Int @default(0)
documents PartnerDoc[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model PartnerDoc {
id String @id @default(cuid())
partnerId String
partner PartnerProfile @relation(fields: [partnerId], references: [id])
type String // "PAN", "GST", "AADHAAR", "CANCELLED_CHEQUE", "BUSINESS_REG"
name String
url String
status KYCDocStatus @default(PENDING)
mandatory Boolean @default(true)
adminNote String?
reviewedBy String?
reviewedAt DateTime?
uploadedBy String
uploadedAt DateTime @default(now())
@@index([partnerId, status])
}