CapUser |
Local id + Orchestrator userId + persona (entry/historical) + identityVerified + optional photoAssetId (person-level profile photo; not in onboarding JSON). Acting hat is request header X-CAP-PERSONA, not this column. Display URLs are API-only (ResolvedAsset: assetId + url) — CAP does not persist signed URLs. Photo, centre logo, and candidate signature GETs resolve at read time; nested onboarding data stays id-only. |
OnboardingRecord |
Unique (capUserId, persona); optional variant (staff | organisation) for centre. Staff onboarding is person-scoped. |
Candidate, AssessorProfile, CentreStaff[], AwardingBodyStaff |
Persona profiles → CapUser. A user may be candidate and staff at one or more centres. Assessors are not CentreStaff. AssessorProfile.status pending | approved | suspended | rejected — only approved may marketplace-apply or create retained requests. Platform admin list exposes snapshot + centreCount (approved retained only). Candidate may hold defaultSignatureAssetId (§28) |
Centre, AwardingBody |
Orgs; centre status pending | approved | suspended | rejected. Platform create starts approved + SUPER_ADMIN invite; org onboarding starts pending. Admin list DTOs expose joinedAt (= createdAt), totalCandidates (distinct candidates with ≥1 app), totalApplications (application rows), totalAssessors. Centre.address, supportContact, accountDetails JSON from organisation onboarding; exposed on GET /centre/profile (PATCH super_admin; registrationNo locked; GET also returns logoAssetId + resolved logo). Catalogue GET /centres and admin centre list/detail include the same logo pair. CentreStaff unique (capUserId, centreId); status PENDING/ACTIVE/INACTIVE |
Sector, Trade, NosDocument, QualificationLevel, Unit |
Platform catalogue; version-locked NOS/units. Trade.status active|archived (soft-archive). Sector/trade slug auto-generated from name. Admin mutations target the active NOS (create stub if missing); import supersedes prior active versions. LOs live in Unit.structure |
AssessorSectorExperience |
Assessor ↔ Sector M2M — marketplace eligibility basis (§27) |
WorkflowTemplate, StageDefinition |
Config-driven stages + handlerStrategy |
Application |
type RPL/NSQ, status, current stage, data JSONB, schemaVersion, optional receiptAssetId (§28), submittedAt (set on first submit; null while draft) |
ApplicationVersion, ApplicationUnit, ApplicationWorkflowState, StageHistory |
History + unit M2M + workflow pointer |
Feedback, Appeal, Resolution |
Stage-scoped cross-cutting |
FacilitatorAssignment, InterviewPanel, PanelMember, InterviewSchedule, InterviewEvaluation, InterviewForm |
RPL panel path — InterviewSchedule has mode (physical|online), link, useCentreAddress; InterviewPanel.centreInterviewId optional provenance from a centre template; InterviewForm is one row per formType (records | assessment_grid | practical_observation | skill_demonstration); lead writes flexible JSON data via PUT …/forms/{formType} (blocked after signoff); candidate signoff → wire status completed (§28) |
CentrePanel, CentrePanelMember, CentreInterview |
Centre templates for reusable panels/interviews (/centre/panels, /centre/interviews). Copy-on-assign via POST /centre/interviews/{id}/schedule. Centre diary GET/PATCH /centre/interview-bookings is seated InterviewSchedule (not a new table) — later template PATCH does not update seated copies |
ApplicationEvent |
RPL calendar (general-purpose; includes applicationId for cross-app dashboard) — GET /applications/{id}/events, GET /candidate/events, GET /assessor/events (§28–29) |
IvAssignment, EvAssignment |
IQA / EQA contextual roles |
AssessorAssignment |
NSQ UNIT_ASSESSOR contextual role (§25) — parallel to IV/EV |
Certificate |
issued_by, asset id, status — not created by centre certify bypass (CAP_CENTRE_CERTIFY_BYPASS) |
ApplicationShareToken |
One hashed token per application (tokenHash SHA-256 hex, no plaintext, no TTL). Centre POST/DELETE /applications/{id}/share-token after IV APPROVED; public GET /shared/applications/{token} (+ asset proxy). Grpc mode file URLs use ORCHESTRATOR_SERVICE_API_KEY → OL POST /storage/resolve. |
UnitAssessmentRecord, PerformanceCriteriaEvidence, UnitSignoff |
NSQ-only NOS evidence / sign-off |
InductionForm |
NSQ-only induction (form_submission strategy) |
DirectObservationSession |
NSQ DO (+ PRF fields as designed) |
GeneralEvidence, SelfAssessment, ThirdPartyReportEvidence |
RPL Evidence Vault (Folder Arrangement) — application-level, not NOS unit evidence (§28) |
Wallet, WalletTransaction, CentrePricing |
Centre finance — wallet credits on payment.completed (net of processing_fee_percentage), unique on payment paymentId / reference for idempotency. Centre payments page sums credits all-time; platform admin summary exposes fee slice (platformRevenue), Σ credits (walletDeposits), and pending gross only (pendingAmount). Admin list rows expose candidate gross + centreNet (null unless completed). CentrePricing latest-per-type, batch PUT is one transaction |
CentreActivity |
Centre-scoped staff activity (actor, role, action, metadata, UTC occurredAt) — not the Audit service (§14) |
Policy, Pricing, TermsVersion, TermsAcceptance |
Platform admin versioned config. Latest version per key/type is “current”. Form facade: GET/PATCH /admin/platform-config (dirty fields publish new rows with effectiveFrom=now). Direct POST /admin/policies, /admin/pricing, /admin/terms still publish versions |
PlatformDocument |
Admin-replaceable downloadable files (key closed set, today third_party_report). Stores OL assetId; GET /admin/templates lists the catalog with resolved asset.url; PUT /admin/templates/{key} replaces. Public GET /evidence/third-party-report-template reads this row (env fallback) |
JobPosting, JobPostingApplication |
Centre/AB-initiated postings; assessor applies (§27). Status open | filled (server-set when accepted ≥ slot) | closed (centre took it off marketplace) | cancelled. Shortlist → application accepted |
RetainedAssessorRequest |
Assessor-initiated standing request at a centre; approved row = retained relationship (§27). Includes required preferredRole (assignment-role wire: facilitator / panelist / lead_panelist / observer / iv / unit_assessor / ev) — preference at apply time, not an actual assignment |