mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.7 KiB
135 lines
5.7 KiB
# Data Models and Schema Changes
|
|
|
|
## New Data Models
|
|
|
|
### **Cohort Model**
|
|
**Purpose:** Represents a training program cohort (learnership, internship, candidacy) managed by an institution. Contains program metadata, templates, and workflow state.
|
|
|
|
**Integration:** Links to existing `Account` (institution), `Template` (agreement templates), and manages `CohortEnrollment` records.
|
|
|
|
**Key Attributes:**
|
|
- `name`: string - Cohort identifier (e.g., "Q1 2025 Learnership Program")
|
|
- `program_type`: enum [learnership, internship, candidacy] - Fixed program types
|
|
- `institution_id`: bigint - Foreign key to new `Institutions` table
|
|
- `sponsor_email`: string - Email for sponsor notifications
|
|
- `student_count`: integer - Expected number of students
|
|
- `main_template_id`: bigint - Foreign key to existing `Template` (main agreement)
|
|
- `supporting_templates`: jsonb - Array of supporting document template IDs
|
|
- `admin_signed_at`: datetime - When admin signed main agreement
|
|
- `state`: enum [draft, active, completed, cancelled] - Workflow state
|
|
- `start_date`, `end_date`: datetime - Program timeline
|
|
|
|
**Relationships:**
|
|
- **With Existing:** `Account` (institution), `Template` (agreement templates), `User` (admin creator)
|
|
- **With New:** `CohortEnrollment` (has_many), `DocumentVerification` (has_many)
|
|
|
|
### **CohortEnrollment Model**
|
|
**Purpose:** Represents a student's enrollment in a cohort, tracking their document submission progress and state through the workflow.
|
|
|
|
**Integration:** Links to existing `User` (student), `Submission` (document signing workflows), and manages verification state.
|
|
|
|
**Key Attributes:**
|
|
- `cohort_id`: bigint - Foreign key to Cohort
|
|
- `user_id`: bigint - Foreign key to existing User (student)
|
|
- `submission_id`: bigint - Foreign key to existing Submission (main agreement)
|
|
- `supporting_submission_ids`: jsonb - Array of submission IDs for supporting documents
|
|
- `state`: enum [waiting, in_progress, complete] - Student workflow state
|
|
- `document_verification_state`: enum [pending, verified, rejected] - Admin verification state
|
|
- `rejection_reason`: text - Reason for document rejection
|
|
- `student_data`: jsonb - Student demographics (age, race, city, gender, disability)
|
|
- `uploaded_documents`: jsonb - Metadata about uploaded files (matric, ID, etc.)
|
|
|
|
**Relationships:**
|
|
- **With Existing:** `User` (student), `Submission` (main agreement), `Template` (supporting docs)
|
|
- **With New:** `Cohort` (belongs_to), `DocumentVerification` (has_many)
|
|
|
|
### **Institution Model**
|
|
**Purpose:** Represents a private training institution, providing multi-tenancy for the cohort management system.
|
|
|
|
**Integration:** Extends existing `Account` concept but adds institution-specific metadata and relationships.
|
|
|
|
**Key Attributes:**
|
|
- `account_id`: bigint - Foreign key to existing Account (for backward compatibility)
|
|
- `name`: string - Institution name
|
|
- `registration_number`: string - Industry registration number
|
|
- `address`: text - Physical address
|
|
- `contact_email`: string - Primary contact
|
|
- `contact_phone`: string - Contact number
|
|
- `super_admin_id`: bigint - Foreign key to User (institution super admin)
|
|
- `settings`: jsonb - Institution-specific configurations
|
|
|
|
**Relationships:**
|
|
- **With Existing:** `Account` (has_one), `User` (has_many admins)
|
|
- **With New:** `Cohort` (has_many), `Sponsor` (has_many)
|
|
|
|
### **Sponsor Model**
|
|
**Purpose:** Represents program sponsors (companies/organizations) who sign agreements for cohorts.
|
|
|
|
**Integration:** Independent model for sponsor management, linked to cohorts via email and approval workflow.
|
|
|
|
**Key Attributes:**
|
|
- `company_name`: string - Sponsor organization name
|
|
- `contact_email`: string - Primary contact email
|
|
- `contact_name`: string - Contact person name
|
|
- `contact_phone`: string - Contact number
|
|
- `tax_number`: string - Tax/registration number
|
|
- `institution_id`: bigint - Foreign key to Institution
|
|
- `user_id`: bigint - Foreign key to User (if sponsor creates account)
|
|
|
|
**Relationships:**
|
|
- **With Existing:** `User` (optional account), `Submission` (signing workflows)
|
|
- **With New:** `Institution` (belongs_to), `Cohort` (referenced via email)
|
|
|
|
### **DocumentVerification Model**
|
|
**Purpose:** Audit trail for admin document verification actions (approvals/rejections).
|
|
|
|
**Integration:** Links to `CohortEnrollment` and existing `User` (admin who performed verification).
|
|
|
|
**Key Attributes:**
|
|
- `cohort_enrollment_id`: bigint - Foreign key to enrollment
|
|
- `admin_id`: bigint - Foreign key to User (admin)
|
|
- `document_type`: string - Type of document verified
|
|
- `action`: enum [approved, rejected] - Verification decision
|
|
- `reason`: text - Rejection reason (if rejected)
|
|
- `metadata`: jsonb - Additional verification context
|
|
|
|
**Relationships:**
|
|
- **With Existing:** `User` (admin), `Submission` (document reference)
|
|
- **With New:** `CohortEnrollment` (belongs_to)
|
|
|
|
## Schema Integration Strategy
|
|
|
|
**Database Changes Required:**
|
|
|
|
**New Tables:**
|
|
```sql
|
|
cohorts
|
|
cohort_enrollments
|
|
institutions
|
|
sponsors
|
|
document_verifications
|
|
```
|
|
|
|
**Modified Tables:** None (100% backward compatible)
|
|
|
|
**New Indexes:**
|
|
- `cohorts.account_id` - Institution lookup
|
|
- `cohort_enrollments.cohort_id, user_id` - Enrollment uniqueness
|
|
- `cohort_enrollments.state` - Workflow state queries
|
|
- `institutions.account_id` - Multi-tenancy isolation
|
|
- `document_verifications.cohort_enrollment_id` - Audit trail queries
|
|
|
|
**Migration Strategy:**
|
|
1. **Phase 1:** Create new tables with foreign keys (no data dependencies)
|
|
2. **Phase 2:** Add indexes for performance
|
|
3. **Phase 3:** Backfill any required default data
|
|
4. **Rollback Plan:** Reverse migration order, preserve existing data
|
|
|
|
**Backward Compatibility:**
|
|
- ✅ Existing tables unchanged
|
|
- ✅ Existing relationships preserved
|
|
- ✅ No breaking schema changes
|
|
- ✅ Additive-only modifications
|
|
|
|
---
|