"""add_partners_mentorship_documents_tables

Revision ID: 6ef20a788379
Revises: add_educational_partner
Create Date: 2026-02-12 07:14:00.253187

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = '6ef20a788379'
down_revision: Union[str, Sequence[str], None] = 'add_educational_partner'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    """Upgrade schema."""
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('academic_sessions',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('name', sa.String(length=50), nullable=False),
    sa.Column('start_date', sa.Date(), nullable=False),
    sa.Column('end_date', sa.Date(), nullable=False),
    sa.Column('is_current', sa.Boolean(), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_academic_sessions_id'), 'academic_sessions', ['id'], unique=False)
    op.create_index(op.f('ix_academic_sessions_is_current'), 'academic_sessions', ['is_current'], unique=False)
    op.create_index(op.f('ix_academic_sessions_name'), 'academic_sessions', ['name'], unique=True)
    op.create_table('programmes',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=False),
    sa.Column('name', sa.String(length=255), nullable=False),
    sa.Column('department', sa.String(length=255), nullable=False),
    sa.Column('faculty', sa.String(length=255), nullable=True),
    sa.Column('duration_years', sa.Integer(), nullable=False),
    sa.Column('is_active', sa.Boolean(), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_programmes_code'), 'programmes', ['code'], unique=True)
    op.create_index(op.f('ix_programmes_department'), 'programmes', ['department'], unique=False)
    op.create_index(op.f('ix_programmes_faculty'), 'programmes', ['faculty'], unique=False)
    op.create_index(op.f('ix_programmes_id'), 'programmes', ['id'], unique=False)
    op.create_table('courses',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('programme_id', sa.UUID(), nullable=False),
    sa.Column('code', sa.String(length=20), nullable=False),
    sa.Column('title', sa.String(length=255), nullable=False),
    sa.Column('description', sa.Text(), nullable=True),
    sa.Column('level', sa.Integer(), nullable=False),
    sa.Column('semester', sa.Integer(), nullable=False),
    sa.Column('credit_units', sa.Integer(), nullable=False),
    sa.Column('is_elective', sa.Boolean(), nullable=False),
    sa.Column('is_active', sa.Boolean(), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['programme_id'], ['programmes.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_courses_code'), 'courses', ['code'], unique=False)
    op.create_index(op.f('ix_courses_id'), 'courses', ['id'], unique=False)
    op.create_index(op.f('ix_courses_programme_id'), 'courses', ['programme_id'], unique=False)
    op.create_table('attendance_sessions',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('course_id', sa.UUID(), nullable=False),
    sa.Column('academic_session_id', sa.UUID(), nullable=True),
    sa.Column('lecturer_id', sa.UUID(), nullable=False),
    sa.Column('session_date', sa.Date(), nullable=False),
    sa.Column('session_time', sa.String(length=20), nullable=True),
    sa.Column('topic', sa.String(length=255), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['academic_session_id'], ['academic_sessions.id'], ),
    sa.ForeignKeyConstraint(['course_id'], ['courses.id'], ),
    sa.ForeignKeyConstraint(['lecturer_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_attendance_sessions_academic_session_id'), 'attendance_sessions', ['academic_session_id'], unique=False)
    op.create_index(op.f('ix_attendance_sessions_course_id'), 'attendance_sessions', ['course_id'], unique=False)
    op.create_index(op.f('ix_attendance_sessions_id'), 'attendance_sessions', ['id'], unique=False)
    op.create_index(op.f('ix_attendance_sessions_lecturer_id'), 'attendance_sessions', ['lecturer_id'], unique=False)
    op.create_index(op.f('ix_attendance_sessions_session_date'), 'attendance_sessions', ['session_date'], unique=False)
    op.create_table('corporate_partners',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('user_id', sa.UUID(), nullable=False),
    sa.Column('company_name', sa.String(length=255), nullable=False),
    sa.Column('industry', sa.String(length=100), nullable=True),
    sa.Column('company_size', sa.String(length=50), nullable=True),
    sa.Column('website', sa.String(length=255), nullable=True),
    sa.Column('contact_person', sa.String(length=255), nullable=True),
    sa.Column('contact_email', sa.String(length=255), nullable=True),
    sa.Column('contact_phone', sa.String(length=20), nullable=True),
    sa.Column('partnership_start_date', sa.DateTime(), nullable=True),
    sa.Column('is_active', sa.Boolean(), nullable=False),
    sa.Column('extra_data', postgresql.JSON(astext_type=sa.Text()), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_corporate_partners_id'), 'corporate_partners', ['id'], unique=False)
    op.create_index(op.f('ix_corporate_partners_is_active'), 'corporate_partners', ['is_active'], unique=False)
    op.create_index(op.f('ix_corporate_partners_user_id'), 'corporate_partners', ['user_id'], unique=True)
    op.create_table('device_loans',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('device_type', sa.String(length=100), nullable=False),
    sa.Column('device_model', sa.String(length=255), nullable=True),
    sa.Column('device_serial', sa.String(length=100), nullable=True),
    sa.Column('loan_amount', sa.Numeric(precision=10, scale=2), nullable=False),
    sa.Column('monthly_payment', sa.Numeric(precision=10, scale=2), nullable=False),
    sa.Column('total_months', sa.Integer(), nullable=False),
    sa.Column('months_paid', sa.Integer(), nullable=False),
    sa.Column('status', sa.Enum('PENDING', 'ACTIVE', 'COMPLETED', 'DEFAULTED', 'CANCELLED', name='deviceloanstatus'), nullable=False),
    sa.Column('disbursement_date', sa.Date(), nullable=True),
    sa.Column('start_date', sa.Date(), nullable=True),
    sa.Column('completion_date', sa.Date(), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_device_loans_device_serial'), 'device_loans', ['device_serial'], unique=True)
    op.create_index(op.f('ix_device_loans_id'), 'device_loans', ['id'], unique=False)
    op.create_index(op.f('ix_device_loans_status'), 'device_loans', ['status'], unique=False)
    op.create_index(op.f('ix_device_loans_student_id'), 'device_loans', ['student_id'], unique=False)
    op.create_table('documents',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('user_id', sa.UUID(), nullable=True),
    sa.Column('application_id', sa.UUID(), nullable=True),
    sa.Column('document_type', sa.Enum('ID_CARD', 'PASSPORT', 'BIRTH_CERTIFICATE', 'WAEC_RESULT', 'TRANSCRIPT', 'CERTIFICATE', 'ADMISSION_LETTER', 'OTHER', name='documenttype'), nullable=False),
    sa.Column('file_name', sa.String(length=255), nullable=False),
    sa.Column('file_url', sa.String(length=500), nullable=False),
    sa.Column('file_size', sa.Integer(), nullable=True),
    sa.Column('mime_type', sa.String(length=100), nullable=True),
    sa.Column('status', sa.Enum('PENDING', 'VERIFIED', 'REJECTED', name='documentstatus'), nullable=False),
    sa.Column('verified_by', sa.UUID(), nullable=True),
    sa.Column('verified_at', sa.DateTime(), nullable=True),
    sa.Column('verification_notes', sa.Text(), nullable=True),
    sa.Column('description', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['application_id'], ['applications.id'], ),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
    sa.ForeignKeyConstraint(['verified_by'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_documents_application_id'), 'documents', ['application_id'], unique=False)
    op.create_index(op.f('ix_documents_document_type'), 'documents', ['document_type'], unique=False)
    op.create_index(op.f('ix_documents_id'), 'documents', ['id'], unique=False)
    op.create_index(op.f('ix_documents_status'), 'documents', ['status'], unique=False)
    op.create_index(op.f('ix_documents_user_id'), 'documents', ['user_id'], unique=False)
    op.create_table('educational_partners',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('user_id', sa.UUID(), nullable=False),
    sa.Column('institution_name', sa.String(length=255), nullable=False),
    sa.Column('institution_type', sa.String(length=100), nullable=True),
    sa.Column('country', sa.String(length=100), nullable=True),
    sa.Column('website', sa.String(length=255), nullable=True),
    sa.Column('contact_person', sa.String(length=255), nullable=True),
    sa.Column('contact_email', sa.String(length=255), nullable=True),
    sa.Column('contact_phone', sa.String(length=20), nullable=True),
    sa.Column('partnership_start_date', sa.DateTime(), nullable=True),
    sa.Column('revenue_share_percentage', sa.Numeric(precision=5, scale=2), nullable=True),
    sa.Column('is_active', sa.Boolean(), nullable=False),
    sa.Column('extra_data', postgresql.JSON(astext_type=sa.Text()), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_educational_partners_id'), 'educational_partners', ['id'], unique=False)
    op.create_index(op.f('ix_educational_partners_is_active'), 'educational_partners', ['is_active'], unique=False)
    op.create_index(op.f('ix_educational_partners_user_id'), 'educational_partners', ['user_id'], unique=True)
    op.create_table('enrollments',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('programme_id', sa.UUID(), nullable=False),
    sa.Column('course_id', sa.UUID(), nullable=False),
    sa.Column('academic_session_id', sa.UUID(), nullable=True),
    sa.Column('status', sa.Enum('ACTIVE', 'COMPLETED', 'DROPPED', 'FAILED', name='enrollmentstatus'), nullable=False),
    sa.Column('enrollment_date', sa.DateTime(), nullable=False),
    sa.Column('ca_score', sa.Numeric(precision=5, scale=2), nullable=True),
    sa.Column('exam_score', sa.Numeric(precision=5, scale=2), nullable=True),
    sa.Column('total_score', sa.Numeric(precision=5, scale=2), nullable=True),
    sa.Column('grade', sa.String(length=2), nullable=True),
    sa.Column('grade_point', sa.Numeric(precision=3, scale=2), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['academic_session_id'], ['academic_sessions.id'], ),
    sa.ForeignKeyConstraint(['course_id'], ['courses.id'], ),
    sa.ForeignKeyConstraint(['programme_id'], ['programmes.id'], ),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_enrollments_academic_session_id'), 'enrollments', ['academic_session_id'], unique=False)
    op.create_index(op.f('ix_enrollments_course_id'), 'enrollments', ['course_id'], unique=False)
    op.create_index(op.f('ix_enrollments_id'), 'enrollments', ['id'], unique=False)
    op.create_index(op.f('ix_enrollments_programme_id'), 'enrollments', ['programme_id'], unique=False)
    op.create_index(op.f('ix_enrollments_status'), 'enrollments', ['status'], unique=False)
    op.create_index(op.f('ix_enrollments_student_id'), 'enrollments', ['student_id'], unique=False)
    op.create_table('mentors',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('user_id', sa.UUID(), nullable=True),
    sa.Column('full_name', sa.String(length=255), nullable=False),
    sa.Column('email', sa.String(length=255), nullable=False),
    sa.Column('phone', sa.String(length=20), nullable=True),
    sa.Column('gender', sa.String(length=10), nullable=True),
    sa.Column('sector', sa.Enum('FINANCE', 'TECHNOLOGY', 'CREATIVE_MEDIA', 'OTHER', name='sectortype'), nullable=False),
    sa.Column('years_experience', sa.Integer(), nullable=True),
    sa.Column('expertise', sa.String(length=255), nullable=True),
    sa.Column('company', sa.String(length=255), nullable=True),
    sa.Column('job_title', sa.String(length=255), nullable=True),
    sa.Column('status', sa.Enum('PENDING', 'APPROVED', 'ACTIVE', 'INACTIVE', 'REJECTED', name='mentorstatus'), nullable=False),
    sa.Column('applied_date', sa.DateTime(), nullable=False),
    sa.Column('approved_date', sa.DateTime(), nullable=True),
    sa.Column('approved_by', sa.UUID(), nullable=True),
    sa.Column('bio', sa.Text(), nullable=True),
    sa.Column('extra_data', postgresql.JSON(astext_type=sa.Text()), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['approved_by'], ['users.id'], ),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_mentors_email'), 'mentors', ['email'], unique=True)
    op.create_index(op.f('ix_mentors_id'), 'mentors', ['id'], unique=False)
    op.create_index(op.f('ix_mentors_sector'), 'mentors', ['sector'], unique=False)
    op.create_index(op.f('ix_mentors_status'), 'mentors', ['status'], unique=False)
    op.create_index(op.f('ix_mentors_user_id'), 'mentors', ['user_id'], unique=True)
    op.create_table('student_ledger',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('academic_session_id', sa.UUID(), nullable=True),
    sa.Column('entry_type', sa.Enum('TUITION', 'ACCEPTANCE_FEE', 'APPLICATION_FEE', 'DEVICE_LOAN', 'MISCELLANEOUS', name='ledgerentrytype'), nullable=False),
    sa.Column('description', sa.String(length=255), nullable=False),
    sa.Column('amount', sa.Numeric(precision=10, scale=2), nullable=False),
    sa.Column('status', sa.Enum('PENDING', 'PAID', 'OVERDUE', 'CANCELLED', name='ledgerentrystatus'), nullable=False),
    sa.Column('due_date', sa.Date(), nullable=True),
    sa.Column('paid_date', sa.DateTime(), nullable=True),
    sa.Column('payment_reference', sa.String(length=100), nullable=True),
    sa.Column('payment_gateway', sa.String(length=50), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['academic_session_id'], ['academic_sessions.id'], ),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_student_ledger_academic_session_id'), 'student_ledger', ['academic_session_id'], unique=False)
    op.create_index(op.f('ix_student_ledger_entry_type'), 'student_ledger', ['entry_type'], unique=False)
    op.create_index(op.f('ix_student_ledger_id'), 'student_ledger', ['id'], unique=False)
    op.create_index(op.f('ix_student_ledger_payment_reference'), 'student_ledger', ['payment_reference'], unique=False)
    op.create_index(op.f('ix_student_ledger_status'), 'student_ledger', ['status'], unique=False)
    op.create_index(op.f('ix_student_ledger_student_id'), 'student_ledger', ['student_id'], unique=False)
    op.create_table('support_tickets',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('ticket_type', sa.Enum('FINANCE', 'REGISTRAR', 'IT', 'ACADEMIC', 'GENERAL', name='tickettype'), nullable=False),
    sa.Column('subject', sa.String(length=255), nullable=False),
    sa.Column('description', sa.Text(), nullable=False),
    sa.Column('status', sa.Enum('OPEN', 'IN_PROGRESS', 'RESOLVED', 'CLOSED', name='ticketstatus'), nullable=False),
    sa.Column('assigned_to', sa.String(length=100), nullable=True),
    sa.Column('internal_notes', sa.Text(), nullable=True),
    sa.Column('resolution', sa.Text(), nullable=True),
    sa.Column('resolved_at', sa.DateTime(), nullable=True),
    sa.Column('resolved_by', sa.UUID(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['resolved_by'], ['users.id'], ),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_support_tickets_id'), 'support_tickets', ['id'], unique=False)
    op.create_index(op.f('ix_support_tickets_status'), 'support_tickets', ['status'], unique=False)
    op.create_index(op.f('ix_support_tickets_student_id'), 'support_tickets', ['student_id'], unique=False)
    op.create_index(op.f('ix_support_tickets_ticket_type'), 'support_tickets', ['ticket_type'], unique=False)
    op.create_table('assessments',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('course_id', sa.UUID(), nullable=False),
    sa.Column('enrollment_id', sa.UUID(), nullable=False),
    sa.Column('lecturer_id', sa.UUID(), nullable=False),
    sa.Column('assessment_type', sa.Enum('CA', 'QUIZ', 'ASSIGNMENT', 'PROJECT', 'MIDTERM', 'FINAL', name='assessmenttype'), nullable=False),
    sa.Column('title', sa.String(length=255), nullable=False),
    sa.Column('max_score', sa.Numeric(precision=5, scale=2), nullable=False),
    sa.Column('score', sa.Numeric(precision=5, scale=2), nullable=False),
    sa.Column('weight', sa.Numeric(precision=5, scale=2), nullable=True),
    sa.Column('assessment_date', sa.Date(), nullable=False),
    sa.Column('remarks', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['course_id'], ['courses.id'], ),
    sa.ForeignKeyConstraint(['enrollment_id'], ['enrollments.id'], ),
    sa.ForeignKeyConstraint(['lecturer_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_assessments_assessment_type'), 'assessments', ['assessment_type'], unique=False)
    op.create_index(op.f('ix_assessments_course_id'), 'assessments', ['course_id'], unique=False)
    op.create_index(op.f('ix_assessments_enrollment_id'), 'assessments', ['enrollment_id'], unique=False)
    op.create_index(op.f('ix_assessments_id'), 'assessments', ['id'], unique=False)
    op.create_index(op.f('ix_assessments_lecturer_id'), 'assessments', ['lecturer_id'], unique=False)
    op.create_table('attendance_records',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('enrollment_id', sa.UUID(), nullable=False),
    sa.Column('session_id', sa.UUID(), nullable=False),
    sa.Column('status', sa.Enum('PRESENT', 'ABSENT', 'LATE', 'EXCUSED', name='attendancestatus'), nullable=False),
    sa.Column('remarks', sa.Text(), nullable=True),
    sa.Column('recorded_at', sa.DateTime(), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['enrollment_id'], ['enrollments.id'], ),
    sa.ForeignKeyConstraint(['session_id'], ['attendance_sessions.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_attendance_records_enrollment_id'), 'attendance_records', ['enrollment_id'], unique=False)
    op.create_index(op.f('ix_attendance_records_id'), 'attendance_records', ['id'], unique=False)
    op.create_index(op.f('ix_attendance_records_session_id'), 'attendance_records', ['session_id'], unique=False)
    op.create_table('device_loan_payments',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('loan_id', sa.UUID(), nullable=False),
    sa.Column('amount', sa.Numeric(precision=10, scale=2), nullable=False),
    sa.Column('payment_date', sa.DateTime(), nullable=False),
    sa.Column('payment_reference', sa.String(length=100), nullable=True),
    sa.Column('payment_gateway', sa.String(length=50), nullable=True),
    sa.Column('month_number', sa.Integer(), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['loan_id'], ['device_loans.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_device_loan_payments_id'), 'device_loan_payments', ['id'], unique=False)
    op.create_index(op.f('ix_device_loan_payments_loan_id'), 'device_loan_payments', ['loan_id'], unique=False)
    op.create_index(op.f('ix_device_loan_payments_payment_reference'), 'device_loan_payments', ['payment_reference'], unique=True)
    op.create_table('mentor_mentees',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('mentor_id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('assigned_date', sa.DateTime(), nullable=False),
    sa.Column('assigned_by', sa.UUID(), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('is_active', sa.Boolean(), nullable=False),
    sa.Column('ended_date', sa.DateTime(), nullable=True),
    sa.Column('end_reason', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['assigned_by'], ['users.id'], ),
    sa.ForeignKeyConstraint(['mentor_id'], ['mentors.id'], ),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_mentor_mentees_id'), 'mentor_mentees', ['id'], unique=False)
    op.create_index(op.f('ix_mentor_mentees_is_active'), 'mentor_mentees', ['is_active'], unique=False)
    op.create_index(op.f('ix_mentor_mentees_mentor_id'), 'mentor_mentees', ['mentor_id'], unique=False)
    op.create_index(op.f('ix_mentor_mentees_student_id'), 'mentor_mentees', ['student_id'], unique=False)
    op.create_table('partner_cohorts',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('educational_partner_id', sa.UUID(), nullable=False),
    sa.Column('programme_id', sa.UUID(), nullable=False),
    sa.Column('academic_session_id', sa.UUID(), nullable=True),
    sa.Column('cohort_name', sa.String(length=255), nullable=False),
    sa.Column('start_date', sa.DateTime(), nullable=False),
    sa.Column('end_date', sa.DateTime(), nullable=True),
    sa.Column('total_enrollments', sa.Integer(), nullable=False),
    sa.Column('revenue_generated', sa.Numeric(precision=10, scale=2), nullable=False),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['academic_session_id'], ['academic_sessions.id'], ),
    sa.ForeignKeyConstraint(['educational_partner_id'], ['educational_partners.id'], ),
    sa.ForeignKeyConstraint(['programme_id'], ['programmes.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_partner_cohorts_academic_session_id'), 'partner_cohorts', ['academic_session_id'], unique=False)
    op.create_index(op.f('ix_partner_cohorts_educational_partner_id'), 'partner_cohorts', ['educational_partner_id'], unique=False)
    op.create_index(op.f('ix_partner_cohorts_id'), 'partner_cohorts', ['id'], unique=False)
    op.create_index(op.f('ix_partner_cohorts_programme_id'), 'partner_cohorts', ['programme_id'], unique=False)
    op.create_table('partner_enrollments',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('corporate_partner_id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('enrollment_date', sa.DateTime(), nullable=False),
    sa.Column('sponsorship_type', sa.String(length=50), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['corporate_partner_id'], ['corporate_partners.id'], ),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_partner_enrollments_corporate_partner_id'), 'partner_enrollments', ['corporate_partner_id'], unique=False)
    op.create_index(op.f('ix_partner_enrollments_id'), 'partner_enrollments', ['id'], unique=False)
    op.create_index(op.f('ix_partner_enrollments_student_id'), 'partner_enrollments', ['student_id'], unique=False)
    op.create_table('partner_opportunities',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('partner_id', sa.UUID(), nullable=False),
    sa.Column('title', sa.String(length=255), nullable=False),
    sa.Column('description', sa.Text(), nullable=False),
    sa.Column('opportunity_type', sa.Enum('FULL_TIME', 'PART_TIME', 'INTERNSHIP', 'CONTRACT', name='opportunitytype'), nullable=False),
    sa.Column('department', sa.String(length=100), nullable=True),
    sa.Column('requirements', sa.Text(), nullable=True),
    sa.Column('location', sa.String(length=255), nullable=True),
    sa.Column('salary_range', sa.String(length=100), nullable=True),
    sa.Column('is_active', sa.Boolean(), nullable=False),
    sa.Column('application_deadline', sa.DateTime(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['partner_id'], ['corporate_partners.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_partner_opportunities_id'), 'partner_opportunities', ['id'], unique=False)
    op.create_index(op.f('ix_partner_opportunities_is_active'), 'partner_opportunities', ['is_active'], unique=False)
    op.create_index(op.f('ix_partner_opportunities_opportunity_type'), 'partner_opportunities', ['opportunity_type'], unique=False)
    op.create_index(op.f('ix_partner_opportunities_partner_id'), 'partner_opportunities', ['partner_id'], unique=False)
    op.create_table('mentorship_sessions',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('assignment_id', sa.UUID(), nullable=False),
    sa.Column('mentor_id', sa.UUID(), nullable=False),
    sa.Column('session_date', sa.DateTime(), nullable=False),
    sa.Column('duration_minutes', sa.Integer(), nullable=True),
    sa.Column('status', sa.Enum('SCHEDULED', 'COMPLETED', 'CANCELLED', 'NO_SHOW', name='mentorshipsessionstatus'), nullable=False),
    sa.Column('topic', sa.String(length=255), nullable=True),
    sa.Column('notes', sa.Text(), nullable=True),
    sa.Column('student_feedback', sa.Text(), nullable=True),
    sa.Column('mentor_feedback', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=False),
    sa.Column('updated_at', sa.DateTime(), nullable=False),
    sa.ForeignKeyConstraint(['assignment_id'], ['mentor_mentees.id'], ),
    sa.ForeignKeyConstraint(['mentor_id'], ['mentors.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_mentorship_sessions_assignment_id'), 'mentorship_sessions', ['assignment_id'], unique=False)
    op.create_index(op.f('ix_mentorship_sessions_id'), 'mentorship_sessions', ['id'], unique=False)
    op.create_index(op.f('ix_mentorship_sessions_mentor_id'), 'mentorship_sessions', ['mentor_id'], unique=False)
    op.create_index(op.f('ix_mentorship_sessions_session_date'), 'mentorship_sessions', ['session_date'], unique=False)
    op.create_index(op.f('ix_mentorship_sessions_status'), 'mentorship_sessions', ['status'], unique=False)
    op.create_table('opportunity_applications',
    sa.Column('id', sa.UUID(), nullable=False),
    sa.Column('opportunity_id', sa.UUID(), nullable=False),
    sa.Column('student_id', sa.UUID(), nullable=False),
    sa.Column('cover_letter', sa.Text(), nullable=True),
    sa.Column('status', sa.String(length=50), nullable=False),
    sa.Column('applied_at', sa.DateTime(), nullable=False),
    sa.Column('reviewed_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['opportunity_id'], ['partner_opportunities.id'], ),
    sa.ForeignKeyConstraint(['student_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_opportunity_applications_id'), 'opportunity_applications', ['id'], unique=False)
    op.create_index(op.f('ix_opportunity_applications_opportunity_id'), 'opportunity_applications', ['opportunity_id'], unique=False)
    op.create_index(op.f('ix_opportunity_applications_status'), 'opportunity_applications', ['status'], unique=False)
    op.create_index(op.f('ix_opportunity_applications_student_id'), 'opportunity_applications', ['student_id'], unique=False)
    # ### end Alembic commands ###


def downgrade() -> None:
    """Downgrade schema."""
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(op.f('ix_opportunity_applications_student_id'), table_name='opportunity_applications')
    op.drop_index(op.f('ix_opportunity_applications_status'), table_name='opportunity_applications')
    op.drop_index(op.f('ix_opportunity_applications_opportunity_id'), table_name='opportunity_applications')
    op.drop_index(op.f('ix_opportunity_applications_id'), table_name='opportunity_applications')
    op.drop_table('opportunity_applications')
    op.drop_index(op.f('ix_mentorship_sessions_status'), table_name='mentorship_sessions')
    op.drop_index(op.f('ix_mentorship_sessions_session_date'), table_name='mentorship_sessions')
    op.drop_index(op.f('ix_mentorship_sessions_mentor_id'), table_name='mentorship_sessions')
    op.drop_index(op.f('ix_mentorship_sessions_id'), table_name='mentorship_sessions')
    op.drop_index(op.f('ix_mentorship_sessions_assignment_id'), table_name='mentorship_sessions')
    op.drop_table('mentorship_sessions')
    op.drop_index(op.f('ix_partner_opportunities_partner_id'), table_name='partner_opportunities')
    op.drop_index(op.f('ix_partner_opportunities_opportunity_type'), table_name='partner_opportunities')
    op.drop_index(op.f('ix_partner_opportunities_is_active'), table_name='partner_opportunities')
    op.drop_index(op.f('ix_partner_opportunities_id'), table_name='partner_opportunities')
    op.drop_table('partner_opportunities')
    op.drop_index(op.f('ix_partner_enrollments_student_id'), table_name='partner_enrollments')
    op.drop_index(op.f('ix_partner_enrollments_id'), table_name='partner_enrollments')
    op.drop_index(op.f('ix_partner_enrollments_corporate_partner_id'), table_name='partner_enrollments')
    op.drop_table('partner_enrollments')
    op.drop_index(op.f('ix_partner_cohorts_programme_id'), table_name='partner_cohorts')
    op.drop_index(op.f('ix_partner_cohorts_id'), table_name='partner_cohorts')
    op.drop_index(op.f('ix_partner_cohorts_educational_partner_id'), table_name='partner_cohorts')
    op.drop_index(op.f('ix_partner_cohorts_academic_session_id'), table_name='partner_cohorts')
    op.drop_table('partner_cohorts')
    op.drop_index(op.f('ix_mentor_mentees_student_id'), table_name='mentor_mentees')
    op.drop_index(op.f('ix_mentor_mentees_mentor_id'), table_name='mentor_mentees')
    op.drop_index(op.f('ix_mentor_mentees_is_active'), table_name='mentor_mentees')
    op.drop_index(op.f('ix_mentor_mentees_id'), table_name='mentor_mentees')
    op.drop_table('mentor_mentees')
    op.drop_index(op.f('ix_device_loan_payments_payment_reference'), table_name='device_loan_payments')
    op.drop_index(op.f('ix_device_loan_payments_loan_id'), table_name='device_loan_payments')
    op.drop_index(op.f('ix_device_loan_payments_id'), table_name='device_loan_payments')
    op.drop_table('device_loan_payments')
    op.drop_index(op.f('ix_attendance_records_session_id'), table_name='attendance_records')
    op.drop_index(op.f('ix_attendance_records_id'), table_name='attendance_records')
    op.drop_index(op.f('ix_attendance_records_enrollment_id'), table_name='attendance_records')
    op.drop_table('attendance_records')
    op.drop_index(op.f('ix_assessments_lecturer_id'), table_name='assessments')
    op.drop_index(op.f('ix_assessments_id'), table_name='assessments')
    op.drop_index(op.f('ix_assessments_enrollment_id'), table_name='assessments')
    op.drop_index(op.f('ix_assessments_course_id'), table_name='assessments')
    op.drop_index(op.f('ix_assessments_assessment_type'), table_name='assessments')
    op.drop_table('assessments')
    op.drop_index(op.f('ix_support_tickets_ticket_type'), table_name='support_tickets')
    op.drop_index(op.f('ix_support_tickets_student_id'), table_name='support_tickets')
    op.drop_index(op.f('ix_support_tickets_status'), table_name='support_tickets')
    op.drop_index(op.f('ix_support_tickets_id'), table_name='support_tickets')
    op.drop_table('support_tickets')
    op.drop_index(op.f('ix_student_ledger_student_id'), table_name='student_ledger')
    op.drop_index(op.f('ix_student_ledger_status'), table_name='student_ledger')
    op.drop_index(op.f('ix_student_ledger_payment_reference'), table_name='student_ledger')
    op.drop_index(op.f('ix_student_ledger_id'), table_name='student_ledger')
    op.drop_index(op.f('ix_student_ledger_entry_type'), table_name='student_ledger')
    op.drop_index(op.f('ix_student_ledger_academic_session_id'), table_name='student_ledger')
    op.drop_table('student_ledger')
    op.drop_index(op.f('ix_mentors_user_id'), table_name='mentors')
    op.drop_index(op.f('ix_mentors_status'), table_name='mentors')
    op.drop_index(op.f('ix_mentors_sector'), table_name='mentors')
    op.drop_index(op.f('ix_mentors_id'), table_name='mentors')
    op.drop_index(op.f('ix_mentors_email'), table_name='mentors')
    op.drop_table('mentors')
    op.drop_index(op.f('ix_enrollments_student_id'), table_name='enrollments')
    op.drop_index(op.f('ix_enrollments_status'), table_name='enrollments')
    op.drop_index(op.f('ix_enrollments_programme_id'), table_name='enrollments')
    op.drop_index(op.f('ix_enrollments_id'), table_name='enrollments')
    op.drop_index(op.f('ix_enrollments_course_id'), table_name='enrollments')
    op.drop_index(op.f('ix_enrollments_academic_session_id'), table_name='enrollments')
    op.drop_table('enrollments')
    op.drop_index(op.f('ix_educational_partners_user_id'), table_name='educational_partners')
    op.drop_index(op.f('ix_educational_partners_is_active'), table_name='educational_partners')
    op.drop_index(op.f('ix_educational_partners_id'), table_name='educational_partners')
    op.drop_table('educational_partners')
    op.drop_index(op.f('ix_documents_user_id'), table_name='documents')
    op.drop_index(op.f('ix_documents_status'), table_name='documents')
    op.drop_index(op.f('ix_documents_id'), table_name='documents')
    op.drop_index(op.f('ix_documents_document_type'), table_name='documents')
    op.drop_index(op.f('ix_documents_application_id'), table_name='documents')
    op.drop_table('documents')
    op.drop_index(op.f('ix_device_loans_student_id'), table_name='device_loans')
    op.drop_index(op.f('ix_device_loans_status'), table_name='device_loans')
    op.drop_index(op.f('ix_device_loans_id'), table_name='device_loans')
    op.drop_index(op.f('ix_device_loans_device_serial'), table_name='device_loans')
    op.drop_table('device_loans')
    op.drop_index(op.f('ix_corporate_partners_user_id'), table_name='corporate_partners')
    op.drop_index(op.f('ix_corporate_partners_is_active'), table_name='corporate_partners')
    op.drop_index(op.f('ix_corporate_partners_id'), table_name='corporate_partners')
    op.drop_table('corporate_partners')
    op.drop_index(op.f('ix_attendance_sessions_session_date'), table_name='attendance_sessions')
    op.drop_index(op.f('ix_attendance_sessions_lecturer_id'), table_name='attendance_sessions')
    op.drop_index(op.f('ix_attendance_sessions_id'), table_name='attendance_sessions')
    op.drop_index(op.f('ix_attendance_sessions_course_id'), table_name='attendance_sessions')
    op.drop_index(op.f('ix_attendance_sessions_academic_session_id'), table_name='attendance_sessions')
    op.drop_table('attendance_sessions')
    op.drop_index(op.f('ix_courses_programme_id'), table_name='courses')
    op.drop_index(op.f('ix_courses_id'), table_name='courses')
    op.drop_index(op.f('ix_courses_code'), table_name='courses')
    op.drop_table('courses')
    op.drop_index(op.f('ix_programmes_id'), table_name='programmes')
    op.drop_index(op.f('ix_programmes_faculty'), table_name='programmes')
    op.drop_index(op.f('ix_programmes_department'), table_name='programmes')
    op.drop_index(op.f('ix_programmes_code'), table_name='programmes')
    op.drop_table('programmes')
    op.drop_index(op.f('ix_academic_sessions_name'), table_name='academic_sessions')
    op.drop_index(op.f('ix_academic_sessions_is_current'), table_name='academic_sessions')
    op.drop_index(op.f('ix_academic_sessions_id'), table_name='academic_sessions')
    op.drop_table('academic_sessions')
    # ### end Alembic commands ###
