- Add schema_audit.md documenting current schema issues - Add target_schema.md with complete target schema design - Add old_to_new_mapping.md with table mapping - Add migration_plan.md with phased migration strategy - Add Phase 1 migrations (core infrastructure): - user_sessions table - users missing columns - departments updates - designations updates - employees updates - Add Phase 2 migrations (profile domain - CRITICAL): - create user_role_profiles root table - backfill user_role_profiles from existing profiles - add user_role_profile_id to extension tables - remove forbidden external portfolio links - Add user_role_profile Rust model - Update photographer model to use user_role_profile_id
1052 lines
50 KiB
Markdown
1052 lines
50 KiB
Markdown
# Target Schema — Nxtgauge Database
|
|
|
|
This document defines the **target state** for the Nxtgauge PostgreSQL schema based on the single source of truth.
|
|
|
|
---
|
|
|
|
## 1. Identity & Access Control
|
|
|
|
### users
|
|
|
|
| Column | Type | Notes |
|
|
| ------------- | --------- | -------------------------- |
|
|
| id | UUID | Primary key |
|
|
| email | TEXT | Unique |
|
|
| phone | TEXT | Unique, nullable |
|
|
| password_hash | TEXT | |
|
|
| account_type | TEXT | INDIVIDUAL, COMPANY |
|
|
| status | TEXT | ACTIVE, PENDING, SUSPENDED |
|
|
| last_login_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### refresh_tokens
|
|
|
|
| Column | Type | Notes |
|
|
| ---------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| token_hash | TEXT | Unique |
|
|
| expires_at | TIMESTAMP | |
|
|
| revoked | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### user_sessions
|
|
|
|
| Column | Type | Notes |
|
|
| ------------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| session_token | TEXT | Unique |
|
|
| ip_address | TEXT | |
|
|
| user_agent | TEXT | |
|
|
| expires_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### user_settings
|
|
|
|
| Column | Type | Notes |
|
|
| ------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users, Unique |
|
|
| settings_json | JSONB | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### roles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| key | TEXT | Unique |
|
|
| name | TEXT | |
|
|
| audience | TEXT | INTERNAL, EXTERNAL |
|
|
| description | TEXT | |
|
|
| department_id | UUID | FK → departments |
|
|
| can_approve_requests | BOOLEAN | |
|
|
| can_manage_system_settings | BOOLEAN | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### permissions
|
|
|
|
| Column | Type | Notes |
|
|
| ----------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| key | TEXT | Unique |
|
|
| name | TEXT | |
|
|
| description | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### role_permissions
|
|
|
|
| Column | Type | Notes |
|
|
| -------------- | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| role_id | UUID | FK → roles |
|
|
| permission_key | TEXT | FK → permissions |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### user_roles
|
|
|
|
| Column | Type | Notes |
|
|
| ----------- | --------- | --------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| role_id | UUID | FK → roles |
|
|
| status | TEXT | PENDING, APPROVED, REJECTED |
|
|
| approved_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### employees
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ---------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users, Unique |
|
|
| employee_code | TEXT | |
|
|
| department_id | UUID | FK → departments |
|
|
| designation_id | UUID | FK → designations |
|
|
| joining_date | DATE | |
|
|
| employment_status | TEXT | ACTIVE, INACTIVE, TERMINATED |
|
|
| manager_employee_id | UUID | Self-reference |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### departments
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| name | TEXT | Unique |
|
|
| code | TEXT | Unique |
|
|
| description | TEXT | |
|
|
| department_head | TEXT | |
|
|
| department_email | TEXT | |
|
|
| is_active | BOOLEAN | |
|
|
| visibility | TEXT | INTERNAL |
|
|
| transfers_enabled | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### designations
|
|
|
|
| Column | Type | Notes |
|
|
| --------------- | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| name | TEXT | Unique |
|
|
| code | TEXT | Unique |
|
|
| department_id | UUID | FK → departments |
|
|
| description | TEXT | |
|
|
| level | TEXT | |
|
|
| can_manage_team | BOOLEAN | |
|
|
| can_approve | BOOLEAN | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 2. User Role Profiles (NEW ROOT)
|
|
|
|
### user_role_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ------------------------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| role_key | TEXT | photographer, tutor, developer, etc. |
|
|
| display_name | TEXT | |
|
|
| bio | TEXT | |
|
|
| location | TEXT | |
|
|
| avatar_url | TEXT | |
|
|
| phone | TEXT | |
|
|
| email | TEXT | |
|
|
| status | TEXT | DRAFT, ACTIVE, SUSPENDED |
|
|
| verification_status | TEXT | PENDING, VERIFIED, REJECTED |
|
|
| approval_status | TEXT | PENDING, APPROVED, REJECTED |
|
|
| rejection_reason | TEXT | |
|
|
| approved_at | TIMESTAMP | |
|
|
| verified_at | TIMESTAMP | |
|
|
| is_profile_public | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
**Indexes:**
|
|
|
|
- `UNIQUE(user_id, role_key)`
|
|
- `INDEX(status)`
|
|
- `INDEX(verification_status)`
|
|
- `INDEX(approval_status)`
|
|
|
|
---
|
|
|
|
## 3. Role Extension Tables
|
|
|
|
### photographer_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| specialties | TEXT[] | |
|
|
| camera_brands | TEXT[] | |
|
|
| studio_available | BOOLEAN | |
|
|
| outdoor_shoots | BOOLEAN | |
|
|
| travel_radius_km | INTEGER | |
|
|
| starting_price_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### tutor_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| subjects | TEXT[] | |
|
|
| board_types | TEXT[] | |
|
|
| qualification | TEXT | |
|
|
| teaches_online | BOOLEAN | |
|
|
| teaches_offline | BOOLEAN | |
|
|
| experience_years | INTEGER | |
|
|
| hourly_rate_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### makeup_artist_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| specializations | TEXT[] | |
|
|
| kit_brands | TEXT[] | |
|
|
| home_service | BOOLEAN | |
|
|
| studio_available | BOOLEAN | |
|
|
| starting_price_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### developer_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| tech_stack | TEXT[] | |
|
|
| experience_years | INTEGER | |
|
|
| availability | TEXT | FULL_TIME, PART_TIME, FREELANCE |
|
|
| hourly_rate_inr | INTEGER | in paise |
|
|
| remote_ok | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
**NO external links (github_url, portfolio_url removed)**
|
|
|
|
### video_editor_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| software_skills | TEXT[] | |
|
|
| style_tags | TEXT[] | |
|
|
| turnaround_days | INTEGER | |
|
|
| starting_price_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
**NO reel_url**
|
|
|
|
### graphic_designer_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| design_tools | TEXT[] | |
|
|
| style_tags | TEXT[] | |
|
|
| brand_experience | BOOLEAN | |
|
|
| starting_price_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
**NO portfolio_url**
|
|
|
|
### social_media_manager_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| platforms | TEXT[] | |
|
|
| industries | TEXT[] | |
|
|
| content_types | TEXT[] | |
|
|
| avg_follower_growth_pct | INTEGER | |
|
|
| starting_price_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### fitness_trainer_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| disciplines | TEXT[] | |
|
|
| certifications | TEXT[] | |
|
|
| online_sessions | BOOLEAN | |
|
|
| home_visits | BOOLEAN | |
|
|
| gym_based | BOOLEAN | |
|
|
| per_session_rate_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### catering_service_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| business_name | TEXT | |
|
|
| cuisine_types | TEXT[] | |
|
|
| event_types | TEXT[] | |
|
|
| min_guests | INTEGER | |
|
|
| max_guests | INTEGER | |
|
|
| has_setup_team | BOOLEAN | |
|
|
| has_serving_staff | BOOLEAN | |
|
|
| price_per_head_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### ugc_content_creator_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles, Unique |
|
|
| niche_tags | TEXT[] | |
|
|
| content_formats | TEXT[] | |
|
|
| platforms | TEXT[] | |
|
|
| turnaround_days | INTEGER | |
|
|
| starting_price_inr | INTEGER | in paise |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 4. Other Profiles
|
|
|
|
### company_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users, Unique |
|
|
| company_name | TEXT | |
|
|
| business_type | TEXT | |
|
|
| industry | TEXT | |
|
|
| contact_person_name | TEXT | |
|
|
| email | TEXT | |
|
|
| phone | TEXT | |
|
|
| location | TEXT | |
|
|
| bio | TEXT | |
|
|
| status | TEXT | |
|
|
| verification_status | TEXT | |
|
|
| approval_status | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### customer_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| ------------ | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users, Unique |
|
|
| display_name | TEXT | |
|
|
| phone | TEXT | |
|
|
| email | TEXT | |
|
|
| location | TEXT | |
|
|
| status | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### candidate_profiles
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users, Unique |
|
|
| display_name | TEXT | |
|
|
| bio | TEXT | |
|
|
| location | TEXT | |
|
|
| experience_years | INTEGER | |
|
|
| preferred_roles | TEXT[] | |
|
|
| expected_salary_inr | INTEGER | |
|
|
| resume_file_url | TEXT | |
|
|
| status | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 5. Portfolio Domain
|
|
|
|
### portfolio_items
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ----------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles |
|
|
| title | TEXT | |
|
|
| description | TEXT | |
|
|
| tags | TEXT[] | |
|
|
| display_order | INTEGER | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
**NO external links**
|
|
|
|
### portfolio_images
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------- | --------- | -------------------- |
|
|
| id | UUID | Primary key |
|
|
| portfolio_item_id | UUID | FK → portfolio_items |
|
|
| file_url | TEXT | |
|
|
| display_order | INTEGER | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### services
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ----------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles |
|
|
| name | TEXT | |
|
|
| description | TEXT | |
|
|
| price | INTEGER | in paise |
|
|
| duration_minutes | INTEGER | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 6. Verification Domain
|
|
|
|
### verification_requests
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ---------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles |
|
|
| verification_type | TEXT | IDENTITY, BUSINESS, DOCUMENT |
|
|
| status | TEXT | PENDING, APPROVED, REJECTED |
|
|
| submitted_at | TIMESTAMP | |
|
|
| reviewed_at | TIMESTAMP | |
|
|
| reviewed_by_user_id | UUID | FK → users |
|
|
| remarks | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### verification_documents
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------------- | --------- | --------------------------- |
|
|
| id | UUID | Primary key |
|
|
| verification_request_id | UUID | FK → verification_requests |
|
|
| document_type | TEXT | |
|
|
| file_url | TEXT | |
|
|
| file_name | TEXT | |
|
|
| mime_type | TEXT | |
|
|
| status | TEXT | PENDING, APPROVED, REJECTED |
|
|
| uploaded_at | TIMESTAMP | |
|
|
| reviewed_at | TIMESTAMP | |
|
|
| reviewed_by_user_id | UUID | FK → users |
|
|
| remarks | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### verification_logs
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------------- | --------- | ------------------------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| verification_request_id | UUID | FK → verification_requests |
|
|
| action | TEXT | SUBMITTED, APPROVED, REJECTED, DOCUMENT_REQUESTED |
|
|
| old_status | TEXT | |
|
|
| new_status | TEXT | |
|
|
| acted_by_user_id | UUID | FK → users |
|
|
| remarks | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 7. Approval Domain
|
|
|
|
### approval_requests
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | ------------------------------ |
|
|
| id | UUID | Primary key |
|
|
| entity_type | TEXT | job, lead, profile, company |
|
|
| entity_id | UUID | |
|
|
| approval_type | TEXT | CONTENT, VERIFICATION, FEATURE |
|
|
| status | TEXT | PENDING, APPROVED, REJECTED |
|
|
| submitted_by_user_id | UUID | FK → users |
|
|
| reviewed_by_user_id | UUID | FK → users |
|
|
| submitted_at | TIMESTAMP | |
|
|
| reviewed_at | TIMESTAMP | |
|
|
| remarks | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### approval_logs
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ----------------------------- |
|
|
| id | UUID | Primary key |
|
|
| approval_request_id | UUID | FK → approval_requests |
|
|
| action | TEXT | SUBMITTED, APPROVED, REJECTED |
|
|
| old_status | TEXT | |
|
|
| new_status | TEXT | |
|
|
| acted_by_user_id | UUID | FK → users |
|
|
| remarks | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 8. Marketplace Domain
|
|
|
|
### jobs
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------ | --------- | ------------------------------ |
|
|
| id | UUID | Primary key |
|
|
| company_profile_id | UUID | FK → company_profiles |
|
|
| posted_by_user_id | UUID | FK → users |
|
|
| title | TEXT | |
|
|
| description | TEXT | |
|
|
| location | TEXT | |
|
|
| employment_type | TEXT | FULL_TIME, PART_TIME, CONTRACT |
|
|
| mode_of_work | TEXT | ONSITE, REMOTE, HYBRID |
|
|
| budget_inr | INTEGER | |
|
|
| salary_range_json | JSONB | |
|
|
| status | TEXT | DRAFT, PENDING, LIVE, CLOSED |
|
|
| approved_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### job_applications (RENAMED from applications)
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------- | --------- | -------------------------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| job_id | UUID | FK → jobs |
|
|
| applicant_user_id | UUID | FK → users |
|
|
| status | TEXT | APPLIED, SHORTLISTED, INTERVIEW, OFFERED, REJECTED |
|
|
| cover_note | TEXT | |
|
|
| applied_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### leads (RENAMED from requirements)
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------ | --------- | ---------------------------- |
|
|
| id | UUID | Primary key |
|
|
| created_by_user_id | UUID | FK → users |
|
|
| profession_key | TEXT | |
|
|
| title | TEXT | |
|
|
| description | TEXT | |
|
|
| location | TEXT | |
|
|
| budget_inr | INTEGER | |
|
|
| required_date | DATE | |
|
|
| status | TEXT | DRAFT, PENDING, OPEN, CLOSED |
|
|
| approved_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### lead_requests
|
|
|
|
| Column | Type | Notes |
|
|
| -------------------- | --------- | --------------------------- |
|
|
| id | UUID | Primary key |
|
|
| lead_id | UUID | FK → leads |
|
|
| user_role_profile_id | UUID | FK → user_role_profiles |
|
|
| status | TEXT | PENDING, ACCEPTED, REJECTED |
|
|
| remarks | TEXT | |
|
|
| requested_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### reviews
|
|
|
|
| Column | Type | Notes |
|
|
| ---------------- | --------- | -------------------------- |
|
|
| id | UUID | Primary key |
|
|
| reviewer_user_id | UUID | FK → users |
|
|
| entity_type | TEXT | professional, company |
|
|
| entity_id | UUID | |
|
|
| rating | SMALLINT | 1-5 |
|
|
| review_text | TEXT | |
|
|
| status | TEXT | PENDING, PUBLISHED, HIDDEN |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 9. Finance Domain
|
|
|
|
### pricing_packages
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | -------------------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| name | TEXT | |
|
|
| description | TEXT | |
|
|
| package_type | TEXT | JOB_POSTING, CONTACT_VIEWS, TRACECOIN_BUNDLE |
|
|
| price_inr | INTEGER | in paise |
|
|
| tracecoins_included | INTEGER | |
|
|
| validity_days | INTEGER | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### tracecoin_wallets
|
|
|
|
| Column | Type | Notes |
|
|
| --------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users, Unique |
|
|
| current_balance | INTEGER | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### tracecoin_ledger (IMMUTABLE)
|
|
|
|
| Column | Type | Notes |
|
|
| ---------------- | --------- | -------------------------- |
|
|
| id | UUID | Primary key |
|
|
| wallet_id | UUID | FK → tracecoin_wallets |
|
|
| transaction_type | TEXT | CREDIT, DEBIT |
|
|
| amount | INTEGER | |
|
|
| balance_after | INTEGER | |
|
|
| reference_type | TEXT | JOB, LEAD, PURCHASE, BONUS |
|
|
| reference_id | UUID | |
|
|
| remarks | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### orders
|
|
|
|
| Column | Type | Notes |
|
|
| ------------ | --------- | ----------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| order_type | TEXT | PACKAGE, SERVICE |
|
|
| subtotal_inr | INTEGER | |
|
|
| discount_inr | INTEGER | |
|
|
| tax_inr | INTEGER | |
|
|
| total_inr | INTEGER | |
|
|
| status | TEXT | PENDING, COMPLETED, CANCELLED |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### order_items
|
|
|
|
| Column | Type | Notes |
|
|
| --------------- | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| order_id | UUID | FK → orders |
|
|
| item_type | TEXT | PACKAGE, SERVICE |
|
|
| item_id | UUID | |
|
|
| item_name | TEXT | |
|
|
| quantity | INTEGER | |
|
|
| unit_price_inr | INTEGER | |
|
|
| total_price_inr | INTEGER | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### invoices
|
|
|
|
| Column | Type | Notes |
|
|
| -------------- | --------- | ------------ |
|
|
| id | UUID | Primary key |
|
|
| order_id | UUID | FK → orders |
|
|
| user_id | UUID | FK → users |
|
|
| invoice_number | TEXT | Unique |
|
|
| subtotal_inr | INTEGER | |
|
|
| discount_inr | INTEGER | |
|
|
| tax_inr | INTEGER | |
|
|
| total_inr | INTEGER | |
|
|
| status | TEXT | ISSUED, PAID |
|
|
| issued_at | TIMESTAMP | |
|
|
| due_at | TIMESTAMP | |
|
|
| paid_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### payments
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------------- | --------- | ---------------------------- |
|
|
| id | UUID | Primary key |
|
|
| order_id | UUID | FK → orders |
|
|
| invoice_id | UUID | FK → invoices |
|
|
| user_id | UUID | FK → users |
|
|
| payment_gateway_config_id | UUID | FK → payment_gateway_configs |
|
|
| payment_method | TEXT | |
|
|
| provider_payment_ref | TEXT | |
|
|
| amount_inr | INTEGER | |
|
|
| currency_code | TEXT | INR |
|
|
| status | TEXT | PENDING, SUCCESS, FAILED |
|
|
| initiated_at | TIMESTAMP | |
|
|
| completed_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### payment_gateway_configs
|
|
|
|
| Column | Type | Notes |
|
|
| ------------ | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| gateway_key | TEXT | RAZORPAY, STRIPE |
|
|
| display_name | TEXT | |
|
|
| config_json | JSONB | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### payment_transactions
|
|
|
|
| Column | Type | Notes |
|
|
| --------------------- | --------- | ---------------------------- |
|
|
| id | UUID | Primary key |
|
|
| payment_id | UUID | FK → payments |
|
|
| transaction_type | TEXT | INITIATED, COMPLETED, FAILED |
|
|
| provider_reference | TEXT | |
|
|
| request_payload_json | JSONB | |
|
|
| response_payload_json | JSONB | |
|
|
| status | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### coupons
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| code | TEXT | Unique |
|
|
| description | TEXT | |
|
|
| discount_type | TEXT | PERCENT, FLAT |
|
|
| discount_value | INTEGER | |
|
|
| max_discount_inr | INTEGER | |
|
|
| min_order_value_inr | INTEGER | |
|
|
| valid_from | TIMESTAMP | |
|
|
| valid_to | TIMESTAMP | |
|
|
| usage_limit | INTEGER | NULL = unlimited |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### coupon_redemptions (RENAMED from coupon_uses)
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ------------ |
|
|
| id | UUID | Primary key |
|
|
| coupon_id | UUID | FK → coupons |
|
|
| user_id | UUID | FK → users |
|
|
| order_id | UUID | FK → orders |
|
|
| redeemed_at | TIMESTAMP | |
|
|
| discount_amount_inr | INTEGER | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### discount_rules
|
|
|
|
| Column | Type | Notes |
|
|
| -------------- | --------- | ------------------------- |
|
|
| id | UUID | Primary key |
|
|
| name | TEXT | |
|
|
| scope_type | TEXT | GLOBAL, CATEGORY, SERVICE |
|
|
| scope_id | UUID | |
|
|
| discount_type | TEXT | PERCENT, FLAT |
|
|
| discount_value | INTEGER | |
|
|
| starts_at | TIMESTAMP | |
|
|
| ends_at | TIMESTAMP | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### tax_rules
|
|
|
|
| Column | Type | Notes |
|
|
| ---------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| name | TEXT | |
|
|
| tax_type | TEXT | GST, TCS |
|
|
| tax_rate | DECIMAL | |
|
|
| applies_to | TEXT | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 10. Knowledge Base
|
|
|
|
### kb_categories
|
|
|
|
| Column | Type | Notes |
|
|
| ------------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| name | TEXT | |
|
|
| slug | TEXT | Unique |
|
|
| description | TEXT | |
|
|
| display_order | INTEGER | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### kb_sections
|
|
|
|
| Column | Type | Notes |
|
|
| ------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| category_id | UUID | FK → kb_categories |
|
|
| name | TEXT | |
|
|
| slug | TEXT | |
|
|
| description | TEXT | |
|
|
| display_order | INTEGER | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### kb_articles
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | --------------------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| category_id | UUID | FK → kb_categories |
|
|
| section_id | UUID | FK → kb_sections |
|
|
| title | TEXT | |
|
|
| slug | TEXT | Unique |
|
|
| summary | TEXT | |
|
|
| content_markdown | TEXT | |
|
|
| article_type | TEXT | HOW_TO, TROUBLESHOOTING, FAQ, FEATURE, POLICY |
|
|
| status | TEXT | DRAFT, PUBLISHED |
|
|
| audience_type | TEXT | INTERNAL, EXTERNAL, ALL |
|
|
| tags | TEXT[] | |
|
|
| author_user_id | UUID | FK → users |
|
|
| reviewed_by_user_id | UUID | FK → users |
|
|
| published_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### kb_article_feedback
|
|
|
|
| Column | Type | Notes |
|
|
| ------------- | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| article_id | UUID | FK → kb_articles |
|
|
| user_id | UUID | FK → users |
|
|
| is_helpful | BOOLEAN | |
|
|
| feedback_text | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 11. Support System
|
|
|
|
### support_tickets
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ------------------------------------ |
|
|
| id | UUID | Primary key |
|
|
| created_by_user_id | UUID | FK → users |
|
|
| assigned_to_user_id | UUID | FK → users |
|
|
| category | TEXT | GENERAL, BILLING, TECHNICAL, ACCOUNT |
|
|
| priority | TEXT | LOW, NORMAL, HIGH, URGENT |
|
|
| status | TEXT | OPEN, IN_PROGRESS, RESOLVED, CLOSED |
|
|
| subject | TEXT | |
|
|
| description | TEXT | |
|
|
| related_entity_type | TEXT | |
|
|
| related_entity_id | UUID | |
|
|
| closed_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### support_ticket_messages
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------- | --------- | -------------------- |
|
|
| id | UUID | Primary key |
|
|
| support_ticket_id | UUID | FK → support_tickets |
|
|
| sender_user_id | UUID | FK → users |
|
|
| message_body | TEXT | |
|
|
| attachment_url | TEXT | |
|
|
| is_internal | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 12. Notifications & Communication
|
|
|
|
### notification_templates
|
|
|
|
| Column | Type | Notes |
|
|
| -------------- | --------- | ---------------- |
|
|
| id | UUID | Primary key |
|
|
| template_key | TEXT | Unique |
|
|
| channel | TEXT | EMAIL, SMS, PUSH |
|
|
| title_template | TEXT | |
|
|
| body_template | TEXT | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### notifications
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ------------------------ |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| channel | TEXT | EMAIL, SMS, PUSH, IN_APP |
|
|
| title | TEXT | |
|
|
| body | TEXT | |
|
|
| status | TEXT | PENDING, SENT, READ |
|
|
| related_entity_type | TEXT | |
|
|
| related_entity_id | UUID | |
|
|
| sent_at | TIMESTAMP | |
|
|
| read_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### email_logs
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------------ | --------- | --------------------------- |
|
|
| id | UUID | Primary key |
|
|
| user_id | UUID | FK → users |
|
|
| notification_template_id | UUID | FK → notification_templates |
|
|
| to_email | TEXT | |
|
|
| subject | TEXT | |
|
|
| body_snapshot | TEXT | |
|
|
| status | TEXT | PENDING, SENT, FAILED |
|
|
| provider_reference | TEXT | |
|
|
| error_message | TEXT | |
|
|
| sent_at | TIMESTAMP | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### smtp_configs
|
|
|
|
| Column | Type | Notes |
|
|
| --------------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| provider_name | TEXT | |
|
|
| host | TEXT | |
|
|
| port | INTEGER | |
|
|
| username | TEXT | |
|
|
| encryption_mode | TEXT | SSL, TLS |
|
|
| from_name | TEXT | |
|
|
| from_email | TEXT | |
|
|
| is_default | BOOLEAN | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 13. Dashboard & Config
|
|
|
|
### dashboard_configs
|
|
|
|
| Column | Type | Notes |
|
|
| -------------- | --------- | ------------------ |
|
|
| id | UUID | Primary key |
|
|
| dashboard_type | TEXT | INTERNAL, EXTERNAL |
|
|
| owner_type | TEXT | ROLE, USER |
|
|
| owner_id | UUID | |
|
|
| name | TEXT | |
|
|
| layout_json | JSONB | |
|
|
| is_default | BOOLEAN | |
|
|
| is_active | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### dashboard_widgets
|
|
|
|
| Column | Type | Notes |
|
|
| ------------------- | --------- | ---------------------- |
|
|
| id | UUID | Primary key |
|
|
| dashboard_config_id | UUID | FK → dashboard_configs |
|
|
| widget_key | TEXT | |
|
|
| widget_title | TEXT | |
|
|
| config_json | JSONB | |
|
|
| display_order | INTEGER | |
|
|
| width_units | INTEGER | |
|
|
| height_units | INTEGER | |
|
|
| is_visible | BOOLEAN | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
### runtime_configs
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------- | --------- | ----------- |
|
|
| id | UUID | Primary key |
|
|
| config_group | TEXT | |
|
|
| config_key | TEXT | |
|
|
| config_value_json | JSONB | |
|
|
| is_active | BOOLEAN | |
|
|
| description | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
| updated_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 14. Audit Management
|
|
|
|
### audit_logs
|
|
|
|
| Column | Type | Notes |
|
|
| ----------------- | --------- | ----------------------------------------- |
|
|
| id | UUID | Primary key |
|
|
| actor_user_id | UUID | FK → users |
|
|
| actor_employee_id | UUID | FK → employees |
|
|
| actor_type | TEXT | USER, EMPLOYEE, SYSTEM, CRON |
|
|
| action | TEXT | CREATE, UPDATE, DELETE, APPROVE, REJECT |
|
|
| entity_type | TEXT | |
|
|
| entity_id | UUID | |
|
|
| entity_label | TEXT | |
|
|
| module_key | TEXT | users, verification, jobs, leads, finance |
|
|
| source_type | TEXT | UI, API, WORKER, CRON |
|
|
| source_id | UUID | |
|
|
| request_id | UUID | |
|
|
| correlation_id | UUID | |
|
|
| ip_address | TEXT | |
|
|
| user_agent | TEXT | |
|
|
| status | TEXT | SUCCESS, FAILED |
|
|
| summary | TEXT | |
|
|
| metadata_json | JSONB | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
### audit_log_changes
|
|
|
|
| Column | Type | Notes |
|
|
| -------------- | --------- | --------------- |
|
|
| id | UUID | Primary key |
|
|
| audit_log_id | UUID | FK → audit_logs |
|
|
| field_name | TEXT | |
|
|
| old_value_text | TEXT | |
|
|
| new_value_text | TEXT | |
|
|
| created_at | TIMESTAMP | |
|
|
|
|
---
|
|
|
|
## 15. Summary of Table Counts
|
|
|
|
| Domain | Tables | Status |
|
|
| ------------------ | ------ | --------------------------------------- |
|
|
| Identity & Access | 10 | Existing + user_sessions, user_settings |
|
|
| User Role Profiles | 1 | NEW |
|
|
| Role Extensions | 10 | Updated FK |
|
|
| Other Profiles | 3 | company, customer, candidate |
|
|
| Portfolio | 3 | Updated FK |
|
|
| Verification | 3 | NEW structure |
|
|
| Approval | 2 | NEW structure |
|
|
| Marketplace | 5 | Renamed tables |
|
|
| Finance | 12 | Expanded |
|
|
| Knowledge Base | 4 | Added sections, feedback |
|
|
| Support | 2 | Enhanced |
|
|
| Notifications | 4 | Added templates, smtp |
|
|
| Dashboard | 3 | Added widgets |
|
|
| Audit | 2 | NEW |
|
|
| **TOTAL** | **64** | |
|