nxtgauge-backend-rust/docs/target_schema.md
Tracewebstudio Dev 03376b9567 feat: Add database redesign documentation and Phase 1-2 migrations
- 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
2026-04-12 23:21:11 +02:00

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** | |