2136 lines
104 KiB
C#
2136 lines
104 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Jiaowu.Api.Infrastructure.Persistence;
|
|
|
|
public sealed class DevelopmentSqliteMigrator(
|
|
AppDbContext db,
|
|
ILogger<DevelopmentSqliteMigrator> logger)
|
|
{
|
|
private const string PeopleAndCoursesMigration = "20260724_01_people_courses";
|
|
private const string CurriculumPlansMigration = "20260724_02_curriculum_plans";
|
|
private const string TeachingTasksMigration = "20260724_03_teaching_tasks";
|
|
private const string SchedulesMigration = "20260724_04_schedules";
|
|
private const string ClassCounselorMigration = "20260724_05_class_counselor";
|
|
private const string CourseSelectionMigration = "20260724_06_course_selection";
|
|
private const string GradesMigration = "20260724_07_grades";
|
|
private const string ExamsMigration = "20260724_08_exams";
|
|
private const string AttendanceMigration = "20260724_08b_attendance";
|
|
private const string StudentStatusChangesMigration = "20260724_09_student_status_changes";
|
|
private const string GraduationAuditsMigration = "20260724_10_graduation_audits";
|
|
private const string DegreeAwardsMigration = "20260724_11_degree_awards";
|
|
private const string GraduationClearanceMigration = "20260724_12_graduation_clearance";
|
|
private const string CourseCategoriesMigration = "20260724_13_course_categories";
|
|
private const string SchedulingOptimizationMigration =
|
|
"20260724_14_scheduling_optimization";
|
|
private const string TeacherCourseApplicationsMigration =
|
|
"20260724_15_teacher_course_applications";
|
|
private const string AutomaticScheduleJobsMigration =
|
|
"20260724_16_automatic_schedule_jobs";
|
|
private const string TeachingTaskSchedulingModesMigration =
|
|
"20260725_17_teaching_task_scheduling_modes";
|
|
private const string SchedulePublishJobsMigration =
|
|
"20260725_18_schedule_publish_jobs";
|
|
private const string FlexibleGradesMigration =
|
|
"20260725_19_flexible_grades";
|
|
private const string ExamSchedulingOptimizationMigration =
|
|
"20260725_20_exam_scheduling_optimization";
|
|
private const string RetakeEnrollmentMigration =
|
|
"20260725_21_retake_enrollment";
|
|
private const string CourseAdjustmentsMigration =
|
|
"20260725_22_course_adjustments";
|
|
private const string AttendanceAppealMigration =
|
|
"20260725_23_attendance_appeal";
|
|
private const string AttendanceCheckInMigration =
|
|
"20260726_26_attendance_check_in";
|
|
private const string ApprovalTablesMigration =
|
|
"20260725_24_approval_tables";
|
|
private const string AcademicWarningsMigration =
|
|
"20260725_25_academic_warnings";
|
|
private const string AcademicTermArchivingMigration =
|
|
"20260726_27_academic_term_archiving";
|
|
private const string CourseSelectionWaitlistMigration =
|
|
"20260726_28_course_selection_waitlist";
|
|
private const string PersonalCalendarSubscriptionMigration =
|
|
"20260726_29_personal_calendar_subscription";
|
|
private const string OfficialDocumentsMigration =
|
|
"20260726_30_official_documents";
|
|
private const string UnifiedMessageCenterMigration =
|
|
"20260726_31_unified_message_center";
|
|
private const string ClassroomReservationsMigration =
|
|
"20260726_32_classroom_reservations";
|
|
private const string BackgroundJobOutboxMigration =
|
|
"20260726_33_background_job_outbox";
|
|
private const string CourseAdjustmentOccurrencesMigration =
|
|
"20260727_34_course_adjustment_occurrences";
|
|
private const string AcademicPlanningPrerequisitesMigration =
|
|
"20260727_35_academic_planning_prerequisites";
|
|
|
|
public async Task MigrateAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
if (!db.Database.IsSqlite())
|
|
{
|
|
return;
|
|
}
|
|
|
|
await db.Database.ExecuteSqlRawAsync(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "__DevelopmentSchemaHistory" (
|
|
"MigrationId" TEXT NOT NULL CONSTRAINT "PK___DevelopmentSchemaHistory" PRIMARY KEY,
|
|
"AppliedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
cancellationToken);
|
|
|
|
await ApplyMigrationAsync(
|
|
PeopleAndCoursesMigration,
|
|
PeopleAndCoursesStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
CurriculumPlansMigration,
|
|
CurriculumPlansStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
TeachingTasksMigration,
|
|
TeachingTasksStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
SchedulesMigration,
|
|
SchedulesStatements,
|
|
cancellationToken);
|
|
var counselorColumnExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('AdministrativeClasses')
|
|
WHERE name = 'CounselorUserId'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
ClassCounselorMigration,
|
|
counselorColumnExists
|
|
? ClassCounselorStatements.Skip(1)
|
|
: ClassCounselorStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
CourseSelectionMigration,
|
|
CourseSelectionStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
GradesMigration,
|
|
GradesStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(ExamsMigration, ExamsStatements, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
StudentStatusChangesMigration,
|
|
StudentStatusChangesStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
GraduationAuditsMigration,
|
|
GraduationAuditsStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
DegreeAwardsMigration,
|
|
DegreeAwardsStatements,
|
|
cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
GraduationClearanceMigration,
|
|
GraduationClearanceStatements,
|
|
cancellationToken);
|
|
var courseCategoryColumnExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('Courses')
|
|
WHERE name = 'CourseCategoryId'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
CourseCategoriesMigration,
|
|
courseCategoryColumnExists
|
|
? CourseCategoriesStatements.Where(
|
|
statement => !statement.StartsWith(
|
|
"ALTER TABLE", StringComparison.OrdinalIgnoreCase))
|
|
: CourseCategoriesStatements,
|
|
cancellationToken);
|
|
var schedulingOptimizationExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'ScheduleTimeSlots'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
SchedulingOptimizationMigration,
|
|
schedulingOptimizationExists ? [] : SchedulingOptimizationStatements,
|
|
cancellationToken);
|
|
var teacherCourseApplicationsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'TeacherCourseApplications'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
TeacherCourseApplicationsMigration,
|
|
teacherCourseApplicationsExist ? [] : TeacherCourseApplicationStatements,
|
|
cancellationToken);
|
|
var automaticScheduleJobsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'AutomaticScheduleJobs'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AutomaticScheduleJobsMigration,
|
|
automaticScheduleJobsExist ? [] : AutomaticScheduleJobStatements,
|
|
cancellationToken);
|
|
var teachingTaskSchedulingModeExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('TeachingTasks')
|
|
WHERE name = 'SchedulingMode'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
TeachingTaskSchedulingModesMigration,
|
|
teachingTaskSchedulingModeExists ? [] : TeachingTaskSchedulingModeStatements,
|
|
cancellationToken);
|
|
var schedulePublishJobsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'SchedulePublishJobs'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
SchedulePublishJobsMigration,
|
|
schedulePublishJobsExist ? [] : SchedulePublishJobStatements,
|
|
cancellationToken);
|
|
|
|
var midtermWeightExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('GradeSheets')
|
|
WHERE name = 'MidtermWeight'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
FlexibleGradesMigration,
|
|
midtermWeightExists
|
|
? FlexibleGradesUpgradeStatements
|
|
: FlexibleGradesNewStatements,
|
|
cancellationToken);
|
|
|
|
var attendanceSheetsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'AttendanceSheets'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AttendanceMigration,
|
|
attendanceSheetsExist ? [] : AttendanceStatements,
|
|
cancellationToken);
|
|
|
|
var examSchedulingOptimizationExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('ExamSessions')
|
|
WHERE name = 'ExamDate'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
ExamSchedulingOptimizationMigration,
|
|
examSchedulingOptimizationExists
|
|
? []
|
|
: ExamSchedulingOptimizationStatements,
|
|
cancellationToken);
|
|
|
|
var retakeEnrollmentExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('CourseEnrollments')
|
|
WHERE name = 'EnrollmentType'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
RetakeEnrollmentMigration,
|
|
retakeEnrollmentExists ? [] : RetakeEnrollmentStatements,
|
|
cancellationToken);
|
|
|
|
var courseAdjustmentsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'CourseAdjustments'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
CourseAdjustmentsMigration,
|
|
courseAdjustmentsExist ? [] : CourseAdjustmentsStatements,
|
|
cancellationToken);
|
|
|
|
var courseAdjustmentOccurrencesExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('CourseAdjustments')
|
|
WHERE name = 'SourceScheduleEntryId'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
CourseAdjustmentOccurrencesMigration,
|
|
courseAdjustmentOccurrencesExist
|
|
? []
|
|
: CourseAdjustmentOccurrencesStatements,
|
|
cancellationToken);
|
|
|
|
var attendanceAppealExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('AttendanceRecords')
|
|
WHERE name = 'AppealStatus'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AttendanceAppealMigration,
|
|
attendanceAppealExists ? [] : AttendanceAppealStatements,
|
|
cancellationToken);
|
|
|
|
var attendanceCheckInExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('AttendanceSheets')
|
|
WHERE name = 'CheckInMethod'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AttendanceCheckInMigration,
|
|
attendanceCheckInExists ? [] : AttendanceCheckInStatements,
|
|
cancellationToken);
|
|
|
|
var approvalTablesExist = await db.Database
|
|
.SqlQueryRaw<int>("SELECT COUNT(*) AS \"Value\" FROM sqlite_master WHERE type = 'table' AND name = 'CourseExemptions'")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
ApprovalTablesMigration,
|
|
approvalTablesExist ? [] : ApprovalTableStatements,
|
|
cancellationToken);
|
|
|
|
var warningRulesExist = await db.Database
|
|
.SqlQueryRaw<int>("SELECT COUNT(*) AS \"Value\" FROM sqlite_master WHERE type = 'table' AND name = 'WarningRules'")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AcademicWarningsMigration,
|
|
warningRulesExist ? [] : AcademicWarningStatements,
|
|
cancellationToken);
|
|
|
|
var evaluationSetupsExist = await db.Database
|
|
.SqlQueryRaw<int>("SELECT COUNT(*) AS \"Value\" FROM sqlite_master WHERE type = 'table' AND name = 'EvaluationSetups'")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
TeachingEvaluationMigration,
|
|
evaluationSetupsExist ? [] : TeachingEvaluationStatements,
|
|
cancellationToken);
|
|
|
|
var makeupExamsExist = await db.Database
|
|
.SqlQueryRaw<int>("SELECT COUNT(*) AS \"Value\" FROM sqlite_master WHERE type = 'table' AND name = 'MakeupExamPlans'")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
MakeupExamsMigration,
|
|
makeupExamsExist ? [] : MakeupExamStatements,
|
|
cancellationToken);
|
|
|
|
var makeupAutoJobsExist = await db.Database
|
|
.SqlQueryRaw<int>("SELECT COUNT(*) AS \"Value\" FROM sqlite_master WHERE type = 'table' AND name = 'MakeupExamAutoJobs'")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
MakeupExamAutoJobsMigration,
|
|
makeupAutoJobsExist ? [] : MakeupExamAutoJobStatements,
|
|
cancellationToken);
|
|
|
|
var academicTermArchivingExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('AcademicTerms')
|
|
WHERE name = 'IsArchived'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AcademicTermArchivingMigration,
|
|
academicTermArchivingExists ? [] : AcademicTermArchivingStatements,
|
|
cancellationToken);
|
|
|
|
var courseSelectionWaitlistExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('CourseEnrollments')
|
|
WHERE name = 'WaitlistedAt'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
CourseSelectionWaitlistMigration,
|
|
courseSelectionWaitlistExists ? [] : CourseSelectionWaitlistStatements,
|
|
cancellationToken);
|
|
|
|
var personalCalendarSubscriptionExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM pragma_table_info('AspNetUsers')
|
|
WHERE name = 'CalendarSubscriptionStamp'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
PersonalCalendarSubscriptionMigration,
|
|
personalCalendarSubscriptionExists
|
|
? []
|
|
: PersonalCalendarSubscriptionStatements,
|
|
cancellationToken);
|
|
|
|
var officialDocumentsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'OfficialDocuments'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
OfficialDocumentsMigration,
|
|
officialDocumentsExist ? [] : OfficialDocumentStatements,
|
|
cancellationToken);
|
|
|
|
var messageDispatchesExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'MessageDispatches'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
UnifiedMessageCenterMigration,
|
|
messageDispatchesExist ? [] : UnifiedMessageCenterStatements,
|
|
cancellationToken);
|
|
|
|
var classroomReservationsExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'ClassroomReservations'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
ClassroomReservationsMigration,
|
|
classroomReservationsExist ? [] : ClassroomReservationStatements,
|
|
cancellationToken);
|
|
|
|
var backgroundJobOutboxExists = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'BackgroundJobOutboxMessages'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
BackgroundJobOutboxMigration,
|
|
backgroundJobOutboxExists ? [] : BackgroundJobOutboxStatements,
|
|
cancellationToken);
|
|
|
|
var coursePrerequisitesExist = await db.Database
|
|
.SqlQueryRaw<int>(
|
|
"""
|
|
SELECT COUNT(*) AS "Value"
|
|
FROM sqlite_master
|
|
WHERE type = 'table' AND name = 'CoursePrerequisites'
|
|
""")
|
|
.AnyAsync(value => value > 0, cancellationToken);
|
|
await ApplyMigrationAsync(
|
|
AcademicPlanningPrerequisitesMigration,
|
|
coursePrerequisitesExist ? [] : AcademicPlanningPrerequisiteStatements,
|
|
cancellationToken);
|
|
}
|
|
|
|
private async Task ApplyMigrationAsync(
|
|
string migrationId,
|
|
IEnumerable<string> statements,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var applied = await db.Database
|
|
.SqlQuery<string>(
|
|
$"""
|
|
SELECT "MigrationId" AS "Value"
|
|
FROM "__DevelopmentSchemaHistory"
|
|
WHERE "MigrationId" = {migrationId}
|
|
""")
|
|
.AnyAsync(cancellationToken);
|
|
if (applied)
|
|
{
|
|
return;
|
|
}
|
|
|
|
await using var transaction = await db.Database.BeginTransactionAsync(cancellationToken);
|
|
foreach (var statement in statements)
|
|
{
|
|
await db.Database.ExecuteSqlRawAsync(statement, cancellationToken);
|
|
}
|
|
|
|
await db.Database.ExecuteSqlInterpolatedAsync(
|
|
$"""
|
|
INSERT INTO "__DevelopmentSchemaHistory" ("MigrationId", "AppliedAt")
|
|
VALUES ({migrationId}, {DateTime.UtcNow});
|
|
""",
|
|
cancellationToken);
|
|
await transaction.CommitAsync(cancellationToken);
|
|
logger.LogInformation(
|
|
"Applied SQLite development schema migration {MigrationId}.",
|
|
migrationId);
|
|
}
|
|
|
|
private static readonly string[] PeopleAndCoursesStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "Teachers" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_Teachers" PRIMARY KEY,
|
|
"TeacherNumber" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"Gender" INTEGER NOT NULL,
|
|
"CollegeId" TEXT NOT NULL,
|
|
"Title" TEXT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"HireDate" TEXT NULL,
|
|
"IsExternal" INTEGER NOT NULL,
|
|
"Phone" TEXT NULL,
|
|
"Email" TEXT NULL,
|
|
"Notes" TEXT NULL,
|
|
"UserId" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_Teachers_Colleges_CollegeId"
|
|
FOREIGN KEY ("CollegeId") REFERENCES "Colleges" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_Teachers_AspNetUsers_UserId"
|
|
FOREIGN KEY ("UserId") REFERENCES "AspNetUsers" ("Id") ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Teachers_TeacherNumber"
|
|
ON "Teachers" ("TeacherNumber");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Teachers_CollegeId_Status"
|
|
ON "Teachers" ("CollegeId", "Status");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Teachers_UserId"
|
|
ON "Teachers" ("UserId");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "Students" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_Students" PRIMARY KEY,
|
|
"StudentNumber" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"Gender" INTEGER NOT NULL,
|
|
"AdministrativeClassId" TEXT NOT NULL,
|
|
"EnrollmentYear" INTEGER NOT NULL,
|
|
"EnrollmentDate" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"DateOfBirth" TEXT NULL,
|
|
"Phone" TEXT NULL,
|
|
"Email" TEXT NULL,
|
|
"Notes" TEXT NULL,
|
|
"UserId" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_Students_AdministrativeClasses_AdministrativeClassId"
|
|
FOREIGN KEY ("AdministrativeClassId") REFERENCES "AdministrativeClasses" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_Students_AspNetUsers_UserId"
|
|
FOREIGN KEY ("UserId") REFERENCES "AspNetUsers" ("Id") ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Students_StudentNumber"
|
|
ON "Students" ("StudentNumber");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Students_AdministrativeClassId_Status"
|
|
ON "Students" ("AdministrativeClassId", "Status");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Students_EnrollmentYear"
|
|
ON "Students" ("EnrollmentYear");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Students_UserId"
|
|
ON "Students" ("UserId");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "Courses" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_Courses" PRIMARY KEY,
|
|
"CollegeId" TEXT NOT NULL,
|
|
"EnglishName" TEXT NULL,
|
|
"Credits" TEXT NOT NULL,
|
|
"TotalHours" INTEGER NOT NULL,
|
|
"LectureHours" INTEGER NOT NULL,
|
|
"PracticeHours" INTEGER NOT NULL,
|
|
"Nature" INTEGER NOT NULL,
|
|
"AssessmentMethod" INTEGER NOT NULL,
|
|
"Description" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
"Code" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"SortOrder" INTEGER NOT NULL,
|
|
"IsEnabled" INTEGER NOT NULL,
|
|
CONSTRAINT "FK_Courses_Colleges_CollegeId"
|
|
FOREIGN KEY ("CollegeId") REFERENCES "Colleges" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_Courses_Code" ON "Courses" ("Code");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Courses_IsEnabled_SortOrder"
|
|
ON "Courses" ("IsEnabled", "SortOrder");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Courses_CollegeId_Nature"
|
|
ON "Courses" ("CollegeId", "Nature");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] CurriculumPlansStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CurriculumPlans" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CurriculumPlans" PRIMARY KEY,
|
|
"MajorId" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"Version" TEXT NOT NULL,
|
|
"EffectiveGrade" INTEGER NOT NULL,
|
|
"TotalCredits" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"Description" TEXT NULL,
|
|
"PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CurriculumPlans_Majors_MajorId"
|
|
FOREIGN KEY ("MajorId") REFERENCES "Majors" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CurriculumPlans_MajorId_EffectiveGrade_Version"
|
|
ON "CurriculumPlans" ("MajorId", "EffectiveGrade", "Version");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CurriculumPlans_Status_EffectiveGrade"
|
|
ON "CurriculumPlans" ("Status", "EffectiveGrade");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CurriculumModules" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CurriculumModules" PRIMARY KEY,
|
|
"CurriculumPlanId" TEXT NOT NULL,
|
|
"Code" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"RequiredCredits" TEXT NOT NULL,
|
|
"SortOrder" INTEGER NOT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CurriculumModules_CurriculumPlans_CurriculumPlanId"
|
|
FOREIGN KEY ("CurriculumPlanId") REFERENCES "CurriculumPlans" ("Id")
|
|
ON DELETE CASCADE
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CurriculumModules_CurriculumPlanId_Code"
|
|
ON "CurriculumModules" ("CurriculumPlanId", "Code");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CurriculumCourses" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CurriculumCourses" PRIMARY KEY,
|
|
"CurriculumModuleId" TEXT NOT NULL,
|
|
"CourseId" TEXT NOT NULL,
|
|
"RecommendedSemester" INTEGER NOT NULL,
|
|
"Type" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CurriculumCourses_CurriculumModules_CurriculumModuleId"
|
|
FOREIGN KEY ("CurriculumModuleId") REFERENCES "CurriculumModules" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_CurriculumCourses_Courses_CourseId"
|
|
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CurriculumCourses_CurriculumModuleId_CourseId"
|
|
ON "CurriculumCourses" ("CurriculumModuleId", "CourseId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CurriculumCourses_CourseId"
|
|
ON "CurriculumCourses" ("CourseId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] TeachingTasksStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "TeachingTasks" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_TeachingTasks" PRIMARY KEY,
|
|
"TaskNumber" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"CourseId" TEXT NOT NULL,
|
|
"Capacity" INTEGER NOT NULL,
|
|
"StartWeek" INTEGER NOT NULL,
|
|
"EndWeek" INTEGER NOT NULL,
|
|
"WeeklyHours" INTEGER NOT NULL,
|
|
"SchedulingMode" INTEGER NOT NULL DEFAULT 1,
|
|
"Status" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_TeachingTasks_AcademicTerms_AcademicTermId"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_TeachingTasks_Courses_CourseId"
|
|
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_TeachingTasks_TaskNumber"
|
|
ON "TeachingTasks" ("TaskNumber");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_TeachingTasks_AcademicTermId_Status"
|
|
ON "TeachingTasks" ("AcademicTermId", "Status");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_TeachingTasks_CourseId"
|
|
ON "TeachingTasks" ("CourseId");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "TeachingTaskTeachers" (
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"TeacherId" TEXT NOT NULL,
|
|
"IsPrimary" INTEGER NOT NULL,
|
|
CONSTRAINT "PK_TeachingTaskTeachers"
|
|
PRIMARY KEY ("TeachingTaskId", "TeacherId"),
|
|
CONSTRAINT "FK_TeachingTaskTeachers_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_TeachingTaskTeachers_Teachers_TeacherId"
|
|
FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_TeachingTaskTeachers_TeacherId"
|
|
ON "TeachingTaskTeachers" ("TeacherId");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "TeachingTaskClasses" (
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"AdministrativeClassId" TEXT NOT NULL,
|
|
CONSTRAINT "PK_TeachingTaskClasses"
|
|
PRIMARY KEY ("TeachingTaskId", "AdministrativeClassId"),
|
|
CONSTRAINT "FK_TeachingTaskClasses_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_TeachingTaskClasses_AdministrativeClasses_AdministrativeClassId"
|
|
FOREIGN KEY ("AdministrativeClassId") REFERENCES "AdministrativeClasses" ("Id")
|
|
ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_TeachingTaskClasses_AdministrativeClassId"
|
|
ON "TeachingTaskClasses" ("AdministrativeClassId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] SchedulesStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "SchedulePlans" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_SchedulePlans" PRIMARY KEY,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"Version" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_SchedulePlans_AcademicTerms_AcademicTermId"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_SchedulePlans_AcademicTermId_Version"
|
|
ON "SchedulePlans" ("AcademicTermId", "Version");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_SchedulePlans_AcademicTermId_Status"
|
|
ON "SchedulePlans" ("AcademicTermId", "Status");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "ScheduleEntries" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ScheduleEntries" PRIMARY KEY,
|
|
"SchedulePlanId" TEXT NOT NULL,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"ClassroomId" TEXT NOT NULL,
|
|
"DayOfWeek" INTEGER NOT NULL,
|
|
"StartPeriod" INTEGER NOT NULL,
|
|
"PeriodCount" INTEGER NOT NULL,
|
|
"StartWeek" INTEGER NOT NULL,
|
|
"EndWeek" INTEGER NOT NULL,
|
|
"WeekPattern" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ScheduleEntries_SchedulePlans_SchedulePlanId"
|
|
FOREIGN KEY ("SchedulePlanId") REFERENCES "SchedulePlans" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_ScheduleEntries_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ScheduleEntries_Classrooms_ClassroomId"
|
|
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_ScheduleEntries_SchedulePlanId_DayOfWeek_StartPeriod"
|
|
ON "ScheduleEntries" ("SchedulePlanId", "DayOfWeek", "StartPeriod");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_ScheduleEntries_TeachingTaskId"
|
|
ON "ScheduleEntries" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_ScheduleEntries_ClassroomId"
|
|
ON "ScheduleEntries" ("ClassroomId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] ClassCounselorStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "AdministrativeClasses"
|
|
ADD COLUMN "CounselorUserId" TEXT NULL;
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_AdministrativeClasses_CounselorUserId"
|
|
ON "AdministrativeClasses" ("CounselorUserId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] CourseSelectionStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CourseSelectionRounds" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseSelectionRounds" PRIMARY KEY,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"StartsAt" TEXT NOT NULL,
|
|
"EndsAt" TEXT NOT NULL,
|
|
"WithdrawalEndsAt" TEXT NOT NULL,
|
|
"MaxCredits" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CourseSelectionRounds_AcademicTerms_AcademicTermId"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CourseSelectionRounds_AcademicTermId_Status"
|
|
ON "CourseSelectionRounds" ("AcademicTermId", "Status");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CourseSelectionOfferings" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseSelectionOfferings" PRIMARY KEY,
|
|
"CourseSelectionRoundId" TEXT NOT NULL,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"Capacity" INTEGER NOT NULL,
|
|
"IsOpenToAll" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CourseSelectionOfferings_CourseSelectionRounds_CourseSelectionRoundId"
|
|
FOREIGN KEY ("CourseSelectionRoundId") REFERENCES "CourseSelectionRounds" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_CourseSelectionOfferings_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseSelectionOfferings_CourseSelectionRoundId_TeachingTaskId"
|
|
ON "CourseSelectionOfferings" ("CourseSelectionRoundId", "TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CourseSelectionOfferings_TeachingTaskId"
|
|
ON "CourseSelectionOfferings" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CourseEnrollments" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseEnrollments" PRIMARY KEY,
|
|
"CourseSelectionOfferingId" TEXT NOT NULL,
|
|
"StudentId" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"EnrolledAt" TEXT NOT NULL,
|
|
"WithdrawnAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CourseEnrollments_CourseSelectionOfferings_CourseSelectionOfferingId"
|
|
FOREIGN KEY ("CourseSelectionOfferingId") REFERENCES "CourseSelectionOfferings" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_CourseEnrollments_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseEnrollments_CourseSelectionOfferingId_StudentId"
|
|
ON "CourseEnrollments" ("CourseSelectionOfferingId", "StudentId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CourseEnrollments_StudentId_Status"
|
|
ON "CourseEnrollments" ("StudentId", "Status");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] GradesStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GradeSheets" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeSheets" PRIMARY KEY,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"RegularWeight" TEXT NOT NULL,
|
|
"FinalWeight" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"ReviewComment" TEXT NULL,
|
|
"SubmittedAt" TEXT NULL,
|
|
"ReviewedAt" TEXT NULL,
|
|
"PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GradeSheets_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeSheets_TeachingTaskId"
|
|
ON "GradeSheets" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_GradeSheets_Status"
|
|
ON "GradeSheets" ("Status");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GradeRecords" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeRecords" PRIMARY KEY,
|
|
"GradeSheetId" TEXT NOT NULL,
|
|
"StudentId" TEXT NOT NULL,
|
|
"RegularScore" TEXT NULL,
|
|
"FinalScore" TEXT NULL,
|
|
"TotalScore" TEXT NULL,
|
|
"GradePoint" TEXT NULL,
|
|
"ExamStatus" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GradeRecords_GradeSheets_GradeSheetId"
|
|
FOREIGN KEY ("GradeSheetId") REFERENCES "GradeSheets" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_GradeRecords_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeRecords_GradeSheetId_StudentId"
|
|
ON "GradeRecords" ("GradeSheetId", "StudentId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_GradeRecords_StudentId_TotalScore"
|
|
ON "GradeRecords" ("StudentId", "TotalScore");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] ExamsStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "ExamPlans" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ExamPlans" PRIMARY KEY,
|
|
"AcademicTermId" TEXT NOT NULL, "Name" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ExamPlans_AcademicTerms_AcademicTermId"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_ExamPlans_AcademicTermId_Status" ON "ExamPlans" ("AcademicTermId", "Status");""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "ExamSessions" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ExamSessions" PRIMARY KEY,
|
|
"ExamPlanId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL,
|
|
"ClassroomId" TEXT NOT NULL, "StartsAt" TEXT NOT NULL, "EndsAt" TEXT NOT NULL,
|
|
"Notes" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ExamSessions_ExamPlans_ExamPlanId" FOREIGN KEY ("ExamPlanId")
|
|
REFERENCES "ExamPlans" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_ExamSessions_TeachingTasks_TeachingTaskId" FOREIGN KEY ("TeachingTaskId")
|
|
REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ExamSessions_Classrooms_ClassroomId" FOREIGN KEY ("ClassroomId")
|
|
REFERENCES "Classrooms" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessions_ExamPlanId_StartsAt" ON "ExamSessions" ("ExamPlanId", "StartsAt");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessions_TeachingTaskId" ON "ExamSessions" ("TeachingTaskId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessions_ClassroomId" ON "ExamSessions" ("ClassroomId");""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "ExamSessionInvigilators" (
|
|
"ExamSessionId" TEXT NOT NULL, "TeacherId" TEXT NOT NULL,
|
|
CONSTRAINT "PK_ExamSessionInvigilators" PRIMARY KEY ("ExamSessionId", "TeacherId"),
|
|
CONSTRAINT "FK_ExamSessionInvigilators_ExamSessions_ExamSessionId"
|
|
FOREIGN KEY ("ExamSessionId") REFERENCES "ExamSessions" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_ExamSessionInvigilators_Teachers_TeacherId"
|
|
FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_ExamSessionInvigilators_TeacherId" ON "ExamSessionInvigilators" ("TeacherId");"""
|
|
];
|
|
|
|
private static readonly string[] FlexibleGradesNewStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GradeItems" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeItems" PRIMARY KEY,
|
|
"GradeSheetId" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"Weight" TEXT NOT NULL,
|
|
"SortOrder" INTEGER NOT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GradeItems_GradeSheets_GradeSheetId"
|
|
FOREIGN KEY ("GradeSheetId") REFERENCES "GradeSheets" ("Id") ON DELETE CASCADE
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_GradeItems_GradeSheetId_SortOrder"
|
|
ON "GradeItems" ("GradeSheetId", "SortOrder");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GradeItemScores" (
|
|
"GradeRecordId" TEXT NOT NULL,
|
|
"GradeItemId" TEXT NOT NULL,
|
|
"Score" TEXT NULL,
|
|
CONSTRAINT "PK_GradeItemScores" PRIMARY KEY ("GradeRecordId", "GradeItemId"),
|
|
CONSTRAINT "FK_GradeItemScores_GradeRecords_GradeRecordId"
|
|
FOREIGN KEY ("GradeRecordId") REFERENCES "GradeRecords" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_GradeItemScores_GradeItems_GradeItemId"
|
|
FOREIGN KEY ("GradeItemId") REFERENCES "GradeItems" ("Id") ON DELETE RESTRICT
|
|
);
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] FlexibleGradesUpgradeStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "GradeSheets_v2" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeSheets" PRIMARY KEY,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"RegularWeight" TEXT NOT NULL,
|
|
"FinalWeight" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"ReviewComment" TEXT NULL,
|
|
"SubmittedAt" TEXT NULL,
|
|
"ReviewedAt" TEXT NULL,
|
|
"PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GradeSheets_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
INSERT INTO "GradeSheets_v2" ("Id","TeachingTaskId","RegularWeight","FinalWeight",
|
|
"Status","ReviewComment","SubmittedAt","ReviewedAt","PublishedAt","CreatedAt","UpdatedAt")
|
|
SELECT "Id","TeachingTaskId","RegularWeight","FinalWeight",
|
|
"Status","ReviewComment","SubmittedAt","ReviewedAt","PublishedAt","CreatedAt","UpdatedAt"
|
|
FROM "GradeSheets";
|
|
""",
|
|
"DROP TABLE \"GradeSheets\";",
|
|
"ALTER TABLE \"GradeSheets_v2\" RENAME TO \"GradeSheets\";",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeSheets_TeachingTaskId"
|
|
ON "GradeSheets" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_GradeSheets_Status"
|
|
ON "GradeSheets" ("Status");
|
|
""",
|
|
"""
|
|
CREATE TABLE "GradeRecords_v2" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeRecords" PRIMARY KEY,
|
|
"GradeSheetId" TEXT NOT NULL,
|
|
"StudentId" TEXT NOT NULL,
|
|
"RegularScore" TEXT NULL,
|
|
"FinalScore" TEXT NULL,
|
|
"TotalScore" TEXT NULL,
|
|
"GradePoint" TEXT NULL,
|
|
"ExamStatus" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GradeRecords_GradeSheets_GradeSheetId"
|
|
FOREIGN KEY ("GradeSheetId") REFERENCES "GradeSheets" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_GradeRecords_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
INSERT INTO "GradeRecords_v2" ("Id","GradeSheetId","StudentId","RegularScore","FinalScore",
|
|
"TotalScore","GradePoint","ExamStatus","Notes","CreatedAt","UpdatedAt")
|
|
SELECT "Id","GradeSheetId","StudentId","RegularScore","FinalScore",
|
|
"TotalScore","GradePoint","ExamStatus","Notes","CreatedAt","UpdatedAt"
|
|
FROM "GradeRecords";
|
|
""",
|
|
"DROP TABLE \"GradeRecords\";",
|
|
"ALTER TABLE \"GradeRecords_v2\" RENAME TO \"GradeRecords\";",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_GradeRecords_GradeSheetId_StudentId"
|
|
ON "GradeRecords" ("GradeSheetId", "StudentId");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_GradeRecords_StudentId_TotalScore"
|
|
ON "GradeRecords" ("StudentId", "TotalScore");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GradeItems" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GradeItems" PRIMARY KEY,
|
|
"GradeSheetId" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"Weight" TEXT NOT NULL,
|
|
"SortOrder" INTEGER NOT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GradeItems_GradeSheets_GradeSheetId"
|
|
FOREIGN KEY ("GradeSheetId") REFERENCES "GradeSheets" ("Id") ON DELETE CASCADE
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_GradeItems_GradeSheetId_SortOrder"
|
|
ON "GradeItems" ("GradeSheetId", "SortOrder");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GradeItemScores" (
|
|
"GradeRecordId" TEXT NOT NULL,
|
|
"GradeItemId" TEXT NOT NULL,
|
|
"Score" TEXT NULL,
|
|
CONSTRAINT "PK_GradeItemScores" PRIMARY KEY ("GradeRecordId", "GradeItemId"),
|
|
CONSTRAINT "FK_GradeItemScores_GradeRecords_GradeRecordId"
|
|
FOREIGN KEY ("GradeRecordId") REFERENCES "GradeRecords" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_GradeItemScores_GradeItems_GradeItemId"
|
|
FOREIGN KEY ("GradeItemId") REFERENCES "GradeItems" ("Id") ON DELETE RESTRICT
|
|
);
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] AttendanceStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "AttendanceSheets" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_AttendanceSheets" PRIMARY KEY,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"AttendanceDate" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"SubmittedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_AttendanceSheets_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_AttendanceSheets_TeachingTaskId_AttendanceDate"
|
|
ON "AttendanceSheets" ("TeachingTaskId", "AttendanceDate");
|
|
""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "AttendanceRecords" (
|
|
"AttendanceSheetId" TEXT NOT NULL,
|
|
"StudentId" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
CONSTRAINT "PK_AttendanceRecords" PRIMARY KEY ("AttendanceSheetId", "StudentId"),
|
|
CONSTRAINT "FK_AttendanceRecords_AttendanceSheets_AttendanceSheetId"
|
|
FOREIGN KEY ("AttendanceSheetId") REFERENCES "AttendanceSheets" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_AttendanceRecords_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_AttendanceRecords_AttendanceSheetId_StudentId"
|
|
ON "AttendanceRecords" ("AttendanceSheetId", "StudentId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] StudentStatusChangesStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "StudentStatusChanges" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_StudentStatusChanges" PRIMARY KEY,
|
|
"StudentId" TEXT NOT NULL, "Type" INTEGER NOT NULL,
|
|
"OriginalStatus" INTEGER NOT NULL, "TargetStatus" INTEGER NOT NULL,
|
|
"Reason" TEXT NOT NULL, "State" INTEGER NOT NULL,
|
|
"ReviewComment" TEXT NULL, "SubmittedAt" TEXT NOT NULL,
|
|
"ReviewedAt" TEXT NULL, "ApprovedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_StudentStatusChanges_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_StudentStatusChanges_StudentId_State" ON "StudentStatusChanges" ("StudentId", "State");"""
|
|
];
|
|
|
|
private static readonly string[] GraduationAuditsStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GraduationAuditBatches" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationAuditBatches" PRIMARY KEY,
|
|
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
|
|
"EnrollmentYear" INTEGER NOT NULL, "Status" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL, "CalculatedAt" TEXT NULL, "PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditBatches_GraduationYear_EnrollmentYear" ON "GraduationAuditBatches" ("GraduationYear", "EnrollmentYear");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditBatches_Status" ON "GraduationAuditBatches" ("Status");""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GraduationAuditResults" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationAuditResults" PRIMARY KEY,
|
|
"GraduationAuditBatchId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
|
|
"CurriculumPlanId" TEXT NULL, "StudentStatusSnapshot" INTEGER NOT NULL,
|
|
"RequiredCredits" TEXT NOT NULL, "EarnedCredits" TEXT NOT NULL,
|
|
"RequiredCourseCount" INTEGER NOT NULL,
|
|
"PassedRequiredCourseCount" INTEGER NOT NULL,
|
|
"FailedCourseCount" INTEGER NOT NULL,
|
|
"MissingCourseNames" TEXT NOT NULL,
|
|
"CalculatedConclusion" INTEGER NOT NULL, "Conclusion" INTEGER NOT NULL,
|
|
"IsOverridden" INTEGER NOT NULL, "ReviewComment" TEXT NULL,
|
|
"ReviewedAt" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GraduationAuditResults_GraduationAuditBatches_GraduationAuditBatchId"
|
|
FOREIGN KEY ("GraduationAuditBatchId") REFERENCES "GraduationAuditBatches" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_GraduationAuditResults_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_GraduationAuditResults_CurriculumPlans_CurriculumPlanId"
|
|
FOREIGN KEY ("CurriculumPlanId") REFERENCES "CurriculumPlans" ("Id") ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationAuditResults_GraduationAuditBatchId_StudentId" ON "GraduationAuditResults" ("GraduationAuditBatchId", "StudentId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_StudentId" ON "GraduationAuditResults" ("StudentId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_CurriculumPlanId" ON "GraduationAuditResults" ("CurriculumPlanId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationAuditResults_Conclusion_IsOverridden" ON "GraduationAuditResults" ("Conclusion", "IsOverridden");"""
|
|
];
|
|
|
|
private static readonly string[] DegreeAwardsStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "DegreeAwardBatches" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_DegreeAwardBatches" PRIMARY KEY,
|
|
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
|
|
"DegreeName" TEXT NOT NULL, "MinimumGradePoint" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL, "Notes" TEXT NULL,
|
|
"CalculatedAt" TEXT NULL, "PublishedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardBatches_GraduationYear_Status" ON "DegreeAwardBatches" ("GraduationYear", "Status");""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "DegreeAwardResults" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_DegreeAwardResults" PRIMARY KEY,
|
|
"DegreeAwardBatchId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
|
|
"GraduationAuditResultId" TEXT NOT NULL, "AverageGradePoint" TEXT NOT NULL,
|
|
"CalculatedConclusion" INTEGER NOT NULL, "Conclusion" INTEGER NOT NULL,
|
|
"ExceptionReason" TEXT NOT NULL, "IsOverridden" INTEGER NOT NULL,
|
|
"ReviewComment" TEXT NULL, "ReviewedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_DegreeAwardResults_DegreeAwardBatches_DegreeAwardBatchId"
|
|
FOREIGN KEY ("DegreeAwardBatchId") REFERENCES "DegreeAwardBatches" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_DegreeAwardResults_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_DegreeAwardResults_GraduationAuditResults_GraduationAuditResultId"
|
|
FOREIGN KEY ("GraduationAuditResultId") REFERENCES "GraduationAuditResults" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_DegreeAwardResults_DegreeAwardBatchId_StudentId" ON "DegreeAwardResults" ("DegreeAwardBatchId", "StudentId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_StudentId" ON "DegreeAwardResults" ("StudentId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_GraduationAuditResultId" ON "DegreeAwardResults" ("GraduationAuditResultId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_DegreeAwardResults_Conclusion_IsOverridden" ON "DegreeAwardResults" ("Conclusion", "IsOverridden");"""
|
|
];
|
|
|
|
private static readonly string[] GraduationClearanceStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GraduationClearanceBatches" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceBatches" PRIMARY KEY,
|
|
"Name" TEXT NOT NULL, "GraduationYear" INTEGER NOT NULL,
|
|
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "ClosedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationClearanceBatches_GraduationYear_Status" ON "GraduationClearanceBatches" ("GraduationYear", "Status");""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GraduationClearanceItems" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceItems" PRIMARY KEY,
|
|
"GraduationClearanceBatchId" TEXT NOT NULL, "Code" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL, "ResponsibleUnit" TEXT NOT NULL,
|
|
"ResponsibleRole" TEXT NOT NULL, "IsRequired" INTEGER NOT NULL,
|
|
"SortOrder" INTEGER NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GraduationClearanceItems_GraduationClearanceBatches_GraduationClearanceBatchId"
|
|
FOREIGN KEY ("GraduationClearanceBatchId") REFERENCES "GraduationClearanceBatches" ("Id") ON DELETE CASCADE
|
|
);
|
|
""",
|
|
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationClearanceItems_GraduationClearanceBatchId_Code" ON "GraduationClearanceItems" ("GraduationClearanceBatchId", "Code");""",
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "GraduationClearanceRecords" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_GraduationClearanceRecords" PRIMARY KEY,
|
|
"GraduationClearanceItemId" TEXT NOT NULL, "StudentId" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL, "Notes" TEXT NULL, "CompletedAt" TEXT NULL,
|
|
"CompletedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_GraduationClearanceRecords_GraduationClearanceItems_GraduationClearanceItemId"
|
|
FOREIGN KEY ("GraduationClearanceItemId") REFERENCES "GraduationClearanceItems" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_GraduationClearanceRecords_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_GraduationClearanceRecords_GraduationClearanceItemId_StudentId" ON "GraduationClearanceRecords" ("GraduationClearanceItemId", "StudentId");""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_GraduationClearanceRecords_StudentId_Status" ON "GraduationClearanceRecords" ("StudentId", "Status");"""
|
|
];
|
|
|
|
private static readonly string[] CourseCategoriesStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS "CourseCategories" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseCategories" PRIMARY KEY,
|
|
"Code" TEXT NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"SortOrder" INTEGER NOT NULL,
|
|
"IsEnabled" INTEGER NOT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseCategories_Code"
|
|
ON "CourseCategories" ("Code");
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CourseCategories_IsEnabled_SortOrder"
|
|
ON "CourseCategories" ("IsEnabled", "SortOrder");
|
|
""",
|
|
"""
|
|
ALTER TABLE "Courses" ADD COLUMN "CourseCategoryId" TEXT NULL;
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_Courses_CourseCategoryId"
|
|
ON "Courses" ("CourseCategoryId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] SchedulingOptimizationStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "ScheduleEntries_New" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ScheduleEntries" PRIMARY KEY,
|
|
"SchedulePlanId" TEXT NOT NULL,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"ClassroomId" TEXT NULL,
|
|
"DayOfWeek" INTEGER NOT NULL,
|
|
"StartPeriod" INTEGER NOT NULL,
|
|
"PeriodCount" INTEGER NOT NULL,
|
|
"StartWeek" INTEGER NOT NULL,
|
|
"EndWeek" INTEGER NOT NULL,
|
|
"WeekPattern" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ScheduleEntries_SchedulePlans_SchedulePlanId"
|
|
FOREIGN KEY ("SchedulePlanId") REFERENCES "SchedulePlans" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_ScheduleEntries_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ScheduleEntries_Classrooms_ClassroomId"
|
|
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
|
|
ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
INSERT INTO "ScheduleEntries_New"
|
|
SELECT "Id", "SchedulePlanId", "TeachingTaskId", "ClassroomId",
|
|
"DayOfWeek", "StartPeriod", "PeriodCount", "StartWeek", "EndWeek",
|
|
"WeekPattern", "Notes", "CreatedAt", "UpdatedAt"
|
|
FROM "ScheduleEntries";
|
|
""",
|
|
"""DROP TABLE "ScheduleEntries";""",
|
|
"""ALTER TABLE "ScheduleEntries_New" RENAME TO "ScheduleEntries";""",
|
|
"""
|
|
CREATE INDEX "IX_ScheduleEntries_SchedulePlanId_DayOfWeek_StartPeriod"
|
|
ON "ScheduleEntries" ("SchedulePlanId", "DayOfWeek", "StartPeriod");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ScheduleEntries_TeachingTaskId"
|
|
ON "ScheduleEntries" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ScheduleEntries_ClassroomId"
|
|
ON "ScheduleEntries" ("ClassroomId");
|
|
""",
|
|
"""
|
|
CREATE TABLE "ScheduleTimeSlots" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ScheduleTimeSlots" PRIMARY KEY,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"PeriodNumber" INTEGER NOT NULL,
|
|
"Name" TEXT NOT NULL,
|
|
"StartsAt" TEXT NOT NULL,
|
|
"EndsAt" TEXT NOT NULL,
|
|
"IsEnabled" INTEGER NOT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ScheduleTimeSlots_AcademicTerms_AcademicTermId"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id")
|
|
ON DELETE CASCADE
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_ScheduleTimeSlots_AcademicTermId_PeriodNumber"
|
|
ON "ScheduleTimeSlots" ("AcademicTermId", "PeriodNumber");
|
|
""",
|
|
"""
|
|
CREATE TABLE "TeachingTaskScheduleConstraints" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_TeachingTaskScheduleConstraints" PRIMARY KEY,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"RequiresClassroom" INTEGER NOT NULL,
|
|
"RequiredCampusId" TEXT NULL,
|
|
"RequiredBuildingId" TEXT NULL,
|
|
"AllowedDayOfWeeks" TEXT NULL,
|
|
"EarliestPeriod" INTEGER NULL,
|
|
"LatestPeriod" INTEGER NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_TeachingTaskScheduleConstraints_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_TeachingTaskScheduleConstraints_Campuses_RequiredCampusId"
|
|
FOREIGN KEY ("RequiredCampusId") REFERENCES "Campuses" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_TeachingTaskScheduleConstraints_Buildings_RequiredBuildingId"
|
|
FOREIGN KEY ("RequiredBuildingId") REFERENCES "Buildings" ("Id")
|
|
ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_TeachingTaskScheduleConstraints_TeachingTaskId"
|
|
ON "TeachingTaskScheduleConstraints" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeachingTaskScheduleConstraints_RequiredCampusId"
|
|
ON "TeachingTaskScheduleConstraints" ("RequiredCampusId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeachingTaskScheduleConstraints_RequiredBuildingId"
|
|
ON "TeachingTaskScheduleConstraints" ("RequiredBuildingId");
|
|
""",
|
|
"""
|
|
CREATE TABLE "TeachingTaskAllowedClassrooms" (
|
|
"TeachingTaskScheduleConstraintId" TEXT NOT NULL,
|
|
"ClassroomId" TEXT NOT NULL,
|
|
CONSTRAINT "PK_TeachingTaskAllowedClassrooms"
|
|
PRIMARY KEY ("TeachingTaskScheduleConstraintId", "ClassroomId"),
|
|
CONSTRAINT "FK_TeachingTaskAllowedClassrooms_Constraints"
|
|
FOREIGN KEY ("TeachingTaskScheduleConstraintId")
|
|
REFERENCES "TeachingTaskScheduleConstraints" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_TeachingTaskAllowedClassrooms_Classrooms_ClassroomId"
|
|
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
|
|
ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeachingTaskAllowedClassrooms_ClassroomId"
|
|
ON "TeachingTaskAllowedClassrooms" ("ClassroomId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] TeacherCourseApplicationStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "TeachingTasks" ADD COLUMN "GenerationBatchCode" TEXT NULL;
|
|
""",
|
|
"""
|
|
CREATE TABLE "TeacherCourseApplications" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_TeacherCourseApplications" PRIMARY KEY,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"TeacherId" TEXT NOT NULL,
|
|
"CourseId" TEXT NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"Statement" TEXT NULL,
|
|
"ReviewComment" TEXT NULL,
|
|
"SubmittedAt" TEXT NOT NULL,
|
|
"ReviewedAt" TEXT NULL,
|
|
"ReviewedByUserId" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_TeacherCourseApplications_AcademicTerms"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_TeacherCourseApplications_Teachers"
|
|
FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_TeacherCourseApplications_Courses"
|
|
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_TeacherCourseApplications_ReviewedBy"
|
|
FOREIGN KEY ("ReviewedByUserId") REFERENCES "AspNetUsers" ("Id")
|
|
ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_TeacherCourseApplications_Term_Teacher_Course"
|
|
ON "TeacherCourseApplications" ("AcademicTermId", "TeacherId", "CourseId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeacherCourseApplications_Status_AcademicTermId"
|
|
ON "TeacherCourseApplications" ("Status", "AcademicTermId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeacherCourseApplications_TeacherId"
|
|
ON "TeacherCourseApplications" ("TeacherId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeacherCourseApplications_CourseId"
|
|
ON "TeacherCourseApplications" ("CourseId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_TeacherCourseApplications_ReviewedByUserId"
|
|
ON "TeacherCourseApplications" ("ReviewedByUserId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] AutomaticScheduleJobStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "AutomaticScheduleJobs" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_AutomaticScheduleJobs" PRIMARY KEY,
|
|
"SchedulePlanId" TEXT NOT NULL,
|
|
"ActiveSchedulePlanId" TEXT NULL,
|
|
"RequestedByUserId" TEXT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"TotalTasks" INTEGER NOT NULL,
|
|
"ProcessedTasks" INTEGER NOT NULL,
|
|
"CreatedEntries" INTEGER NOT NULL,
|
|
"CompletedTasks" INTEGER NOT NULL,
|
|
"MessagesJson" TEXT NULL,
|
|
"ErrorMessage" TEXT NULL,
|
|
"StartedAt" TEXT NULL,
|
|
"CompletedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_AutomaticScheduleJobs_SchedulePlans"
|
|
FOREIGN KEY ("SchedulePlanId") REFERENCES "SchedulePlans" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_AutomaticScheduleJobs_RequestedBy"
|
|
FOREIGN KEY ("RequestedByUserId") REFERENCES "AspNetUsers" ("Id")
|
|
ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_AutomaticScheduleJobs_ActiveSchedulePlanId"
|
|
ON "AutomaticScheduleJobs" ("ActiveSchedulePlanId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_AutomaticScheduleJobs_SchedulePlanId_CreatedAt"
|
|
ON "AutomaticScheduleJobs" ("SchedulePlanId", "CreatedAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_AutomaticScheduleJobs_Status_CreatedAt"
|
|
ON "AutomaticScheduleJobs" ("Status", "CreatedAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_AutomaticScheduleJobs_RequestedByUserId"
|
|
ON "AutomaticScheduleJobs" ("RequestedByUserId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] TeachingTaskSchedulingModeStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "TeachingTasks"
|
|
ADD COLUMN "SchedulingMode" INTEGER NOT NULL DEFAULT 1;
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] SchedulePublishJobStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "SchedulePublishJobs" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_SchedulePublishJobs" PRIMARY KEY,
|
|
"SchedulePlanId" TEXT NOT NULL,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"ActiveAcademicTermId" TEXT NULL,
|
|
"RequestedByUserId" TEXT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"TotalSteps" INTEGER NOT NULL,
|
|
"CompletedSteps" INTEGER NOT NULL,
|
|
"CurrentStep" TEXT NULL,
|
|
"ErrorMessage" TEXT NULL,
|
|
"StartedAt" TEXT NULL,
|
|
"CompletedAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_SchedulePublishJobs_SchedulePlans"
|
|
FOREIGN KEY ("SchedulePlanId") REFERENCES "SchedulePlans" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_SchedulePublishJobs_RequestedBy"
|
|
FOREIGN KEY ("RequestedByUserId") REFERENCES "AspNetUsers" ("Id")
|
|
ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_SchedulePublishJobs_ActiveAcademicTermId"
|
|
ON "SchedulePublishJobs" ("ActiveAcademicTermId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_SchedulePublishJobs_SchedulePlanId_CreatedAt"
|
|
ON "SchedulePublishJobs" ("SchedulePlanId", "CreatedAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_SchedulePublishJobs_Status_CreatedAt"
|
|
ON "SchedulePublishJobs" ("Status", "CreatedAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_SchedulePublishJobs_RequestedByUserId"
|
|
ON "SchedulePublishJobs" ("RequestedByUserId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] ExamSchedulingOptimizationStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "ExamSessions" ADD COLUMN "ExamDate" TEXT NOT NULL DEFAULT '2027-01-01';
|
|
""",
|
|
"""
|
|
ALTER TABLE "ExamSessions" ADD COLUMN "StartPeriod" INTEGER NOT NULL DEFAULT 1;
|
|
""",
|
|
"""
|
|
ALTER TABLE "ExamSessions" ADD COLUMN "PeriodCount" INTEGER NOT NULL DEFAULT 2;
|
|
""",
|
|
"""
|
|
ALTER TABLE "ExamSessions" ADD COLUMN "RequiredBuildingId" TEXT NULL;
|
|
""",
|
|
"""
|
|
ALTER TABLE "ExamSessions" ADD COLUMN "RequiredInvigilatorCount" INTEGER NOT NULL DEFAULT 2;
|
|
""",
|
|
"""
|
|
CREATE TABLE "ExamSessions_Temp" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ExamSessions" PRIMARY KEY,
|
|
"ExamPlanId" TEXT NOT NULL,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"ClassroomId" TEXT NULL,
|
|
"ExamDate" TEXT NOT NULL,
|
|
"StartPeriod" INTEGER NOT NULL,
|
|
"PeriodCount" INTEGER NOT NULL,
|
|
"StartsAt" TEXT NOT NULL,
|
|
"EndsAt" TEXT NOT NULL,
|
|
"RequiredBuildingId" TEXT NULL,
|
|
"RequiredInvigilatorCount" INTEGER NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ExamSessions_ExamPlans_ExamPlanId"
|
|
FOREIGN KEY ("ExamPlanId") REFERENCES "ExamPlans" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_ExamSessions_TeachingTasks_TeachingTaskId"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ExamSessions_Classrooms_ClassroomId"
|
|
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id") ON DELETE SET NULL,
|
|
CONSTRAINT "FK_ExamSessions_Buildings_RequiredBuildingId"
|
|
FOREIGN KEY ("RequiredBuildingId") REFERENCES "Buildings" ("Id") ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
INSERT INTO "ExamSessions_Temp"
|
|
("Id","ExamPlanId","TeachingTaskId","ClassroomId","ExamDate",
|
|
"StartPeriod","PeriodCount","StartsAt","EndsAt",
|
|
"RequiredBuildingId","RequiredInvigilatorCount",
|
|
"Notes","CreatedAt","UpdatedAt")
|
|
SELECT "Id","ExamPlanId","TeachingTaskId","ClassroomId",
|
|
'2027-01-01',
|
|
1,2,
|
|
"StartsAt","EndsAt",
|
|
NULL,2,
|
|
"Notes","CreatedAt","UpdatedAt"
|
|
FROM "ExamSessions";
|
|
""",
|
|
"DROP TABLE \"ExamSessions\";",
|
|
"ALTER TABLE \"ExamSessions_Temp\" RENAME TO \"ExamSessions\";",
|
|
"""
|
|
CREATE INDEX "IX_ExamSessions_ExamPlanId_StartsAt"
|
|
ON "ExamSessions" ("ExamPlanId", "StartsAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ExamSessions_TeachingTaskId"
|
|
ON "ExamSessions" ("TeachingTaskId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ExamSessions_ExamPlanId_ExamDate"
|
|
ON "ExamSessions" ("ExamPlanId", "ExamDate");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ExamSessions_RequiredBuildingId"
|
|
ON "ExamSessions" ("RequiredBuildingId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] RetakeEnrollmentStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "CourseEnrollments"
|
|
ADD COLUMN "EnrollmentType" INTEGER NOT NULL DEFAULT 1;
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] CourseSelectionWaitlistStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "CourseEnrollments"
|
|
ADD COLUMN "WaitlistedAt" TEXT NULL;
|
|
""",
|
|
"""
|
|
CREATE INDEX IF NOT EXISTS "IX_CE_Offering_Status_WaitlistedAt"
|
|
ON "CourseEnrollments" ("CourseSelectionOfferingId", "Status", "WaitlistedAt");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] PersonalCalendarSubscriptionStatements =
|
|
[
|
|
"""
|
|
ALTER TABLE "AspNetUsers"
|
|
ADD COLUMN "CalendarSubscriptionStamp" TEXT NULL;
|
|
""",
|
|
"""
|
|
ALTER TABLE "AspNetUsers"
|
|
ADD COLUMN "CalendarSubscriptionCreatedAt" TEXT NULL;
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] OfficialDocumentStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "OfficialDocuments" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_OfficialDocuments" PRIMARY KEY,
|
|
"DocumentNumber" TEXT NOT NULL,
|
|
"VerificationCodeHash" TEXT NOT NULL,
|
|
"Type" INTEGER NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"StudentId" TEXT NOT NULL,
|
|
"IssuedByUserId" TEXT NOT NULL,
|
|
"IssuedAt" TEXT NOT NULL,
|
|
"Purpose" TEXT NULL,
|
|
"SnapshotJson" TEXT NOT NULL,
|
|
"PdfContent" BLOB NOT NULL,
|
|
"PdfSha256" TEXT NOT NULL,
|
|
"InvalidatedAt" TEXT NULL,
|
|
"InvalidatedByUserId" TEXT NULL,
|
|
"InvalidationReason" TEXT NULL,
|
|
"ReissuedFromDocumentId" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_OfficialDocuments_Students_StudentId"
|
|
FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_OfficialDocuments_AspNetUsers_IssuedByUserId"
|
|
FOREIGN KEY ("IssuedByUserId") REFERENCES "AspNetUsers" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_OfficialDocuments_AspNetUsers_InvalidatedByUserId"
|
|
FOREIGN KEY ("InvalidatedByUserId") REFERENCES "AspNetUsers" ("Id") ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_OfficialDocuments_ReissuedFromDocumentId"
|
|
FOREIGN KEY ("ReissuedFromDocumentId") REFERENCES "OfficialDocuments" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE UNIQUE INDEX "IX_OfficialDocuments_DocumentNumber" ON "OfficialDocuments" ("DocumentNumber");""",
|
|
"""CREATE UNIQUE INDEX "IX_OfficialDocuments_VerificationCodeHash" ON "OfficialDocuments" ("VerificationCodeHash");""",
|
|
"""CREATE INDEX "IX_OfficialDocuments_StudentId_IssuedAt" ON "OfficialDocuments" ("StudentId", "IssuedAt");""",
|
|
"""CREATE INDEX "IX_OfficialDocuments_Status_IssuedAt" ON "OfficialDocuments" ("Status", "IssuedAt");""",
|
|
"""CREATE INDEX "IX_OfficialDocuments_IssuedByUserId" ON "OfficialDocuments" ("IssuedByUserId");""",
|
|
"""CREATE INDEX "IX_OfficialDocuments_InvalidatedByUserId" ON "OfficialDocuments" ("InvalidatedByUserId");""",
|
|
"""CREATE UNIQUE INDEX "IX_OfficialDocuments_ReissuedFromDocumentId" ON "OfficialDocuments" ("ReissuedFromDocumentId");""",
|
|
"""
|
|
CREATE TABLE "OfficialDocumentDownloads" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_OfficialDocumentDownloads" PRIMARY KEY,
|
|
"OfficialDocumentId" TEXT NOT NULL,
|
|
"DownloadedByUserId" TEXT NOT NULL,
|
|
"IpAddress" TEXT NULL,
|
|
"UserAgent" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_OfficialDocumentDownloads_OfficialDocuments"
|
|
FOREIGN KEY ("OfficialDocumentId") REFERENCES "OfficialDocuments" ("Id") ON DELETE CASCADE,
|
|
CONSTRAINT "FK_OfficialDocumentDownloads_AspNetUsers"
|
|
FOREIGN KEY ("DownloadedByUserId") REFERENCES "AspNetUsers" ("Id") ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""CREATE INDEX "IX_OfficialDocumentDownloads_OfficialDocumentId_CreatedAt" ON "OfficialDocumentDownloads" ("OfficialDocumentId", "CreatedAt");""",
|
|
"""CREATE INDEX "IX_OfficialDocumentDownloads_DownloadedByUserId_CreatedAt" ON "OfficialDocumentDownloads" ("DownloadedByUserId", "CreatedAt");"""
|
|
];
|
|
|
|
private static readonly string[] CourseAdjustmentsStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "CourseAdjustments" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CourseAdjustments" PRIMARY KEY,
|
|
"TeachingTaskId" TEXT NOT NULL,
|
|
"Type" INTEGER NOT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"ApplicantUserId" TEXT NOT NULL,
|
|
"SourceScheduleEntryId" TEXT NULL,
|
|
"SourceWeek" INTEGER NULL,
|
|
"SourceDate" TEXT NULL,
|
|
"SourceStartPeriod" INTEGER NULL,
|
|
"SourcePeriodCount" INTEGER NULL,
|
|
"SourceClassroomId" TEXT NULL,
|
|
"TargetDate" TEXT NULL,
|
|
"DayOfWeek" INTEGER NULL,
|
|
"StartPeriod" INTEGER NULL,
|
|
"PeriodCount" INTEGER NULL,
|
|
"ClassroomId" TEXT NULL,
|
|
"SubstituteTeacherId" TEXT NULL,
|
|
"CancelWeek" INTEGER NULL,
|
|
"CancelDate" TEXT NULL,
|
|
"Reason" TEXT NOT NULL,
|
|
"ReviewComment" TEXT NULL,
|
|
"SubmittedAt" TEXT NULL,
|
|
"ReviewedAt" TEXT NULL,
|
|
"ReviewedByUserId" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CourseAdjustments_TeachingTasks"
|
|
FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_CourseAdjustments_Classrooms"
|
|
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
|
|
ON DELETE SET NULL,
|
|
CONSTRAINT "FK_CourseAdjustments_Teachers"
|
|
FOREIGN KEY ("SubstituteTeacherId") REFERENCES "Teachers" ("Id")
|
|
ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""CREATE INDEX "IX_CourseAdjustments_TeachingTaskId_Status" ON "CourseAdjustments" ("TeachingTaskId", "Status");""",
|
|
"""CREATE INDEX "IX_CourseAdjustments_ApplicantUserId" ON "CourseAdjustments" ("ApplicantUserId");""",
|
|
"""CREATE INDEX "IX_CourseAdjustments_Status_CreatedAt" ON "CourseAdjustments" ("Status", "CreatedAt");""",
|
|
"""
|
|
CREATE TABLE "Notifications" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_Notifications" PRIMARY KEY,
|
|
"UserId" TEXT NOT NULL,
|
|
"Title" TEXT NOT NULL,
|
|
"Content" TEXT NOT NULL,
|
|
"IsRead" INTEGER NOT NULL,
|
|
"LinkUrl" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""CREATE INDEX "IX_Notifications_UserId_IsRead" ON "Notifications" ("UserId", "IsRead");""",
|
|
"""CREATE INDEX "IX_Notifications_CreatedAt" ON "Notifications" ("CreatedAt");"""
|
|
];
|
|
|
|
private static readonly string[] CourseAdjustmentOccurrencesStatements =
|
|
[
|
|
"""ALTER TABLE "CourseAdjustments" ADD "SourceScheduleEntryId" TEXT NULL;""",
|
|
"""ALTER TABLE "CourseAdjustments" ADD "SourceWeek" INTEGER NULL;""",
|
|
"""ALTER TABLE "CourseAdjustments" ADD "SourceDate" TEXT NULL;""",
|
|
"""ALTER TABLE "CourseAdjustments" ADD "SourceStartPeriod" INTEGER NULL;""",
|
|
"""ALTER TABLE "CourseAdjustments" ADD "SourcePeriodCount" INTEGER NULL;""",
|
|
"""ALTER TABLE "CourseAdjustments" ADD "SourceClassroomId" TEXT NULL;""",
|
|
"""CREATE INDEX "IX_CourseAdjustments_SourceScheduleEntryId_SourceWeek" ON "CourseAdjustments" ("SourceScheduleEntryId", "SourceWeek");"""
|
|
];
|
|
|
|
private static readonly string[] AttendanceAppealStatements =
|
|
[
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "AppealStatus" INTEGER NOT NULL DEFAULT 0;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "AppealReason" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "AppealSubmittedAt" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "AppealReviewComment" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "AppealReviewedAt" TEXT NULL;""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_AttendanceRecords_AppealStatus" ON "AttendanceRecords" ("AppealStatus");"""
|
|
];
|
|
|
|
private static readonly string[] AttendanceCheckInStatements =
|
|
[
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "CheckInMethod" INTEGER NOT NULL DEFAULT 1;""",
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "CheckInToken" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "CheckInStartsAt" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "CheckInEndsAt" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "TargetLatitude" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "TargetLongitude" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceSheets" ADD COLUMN "LocationRadiusMeters" INTEGER NULL;""",
|
|
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_AttendanceSheets_CheckInToken" ON "AttendanceSheets" ("CheckInToken");""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "CheckInAt" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "CheckedInMethod" INTEGER NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "CheckInLatitude" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "CheckInLongitude" TEXT NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "CheckInAccuracyMeters" REAL NULL;""",
|
|
"""ALTER TABLE "AttendanceRecords" ADD COLUMN "CheckInDistanceMeters" REAL NULL;"""
|
|
];
|
|
|
|
private static readonly string[] ApprovalTableStatements =
|
|
[
|
|
"""CREATE TABLE "CourseExemptions" ("Id" TEXT NOT NULL CONSTRAINT "PK_CourseExemptions" PRIMARY KEY, "StudentId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL, "Reason" TEXT NOT NULL, "Status" INTEGER NOT NULL, "ReviewComment" TEXT NULL, "SubmittedAt" TEXT NOT NULL, "ReviewedAt" TEXT NULL, "ReviewedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_CourseExemptions_Students" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_CourseExemptions_TeachingTasks" FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE UNIQUE INDEX "IX_CourseExemptions_StudentId_TeachingTaskId" ON "CourseExemptions" ("StudentId", "TeachingTaskId");""",
|
|
"""CREATE INDEX "IX_CourseExemptions_Status_CreatedAt" ON "CourseExemptions" ("Status", "CreatedAt");""",
|
|
|
|
"""CREATE TABLE "DeferredExams" ("Id" TEXT NOT NULL CONSTRAINT "PK_DeferredExams" PRIMARY KEY, "StudentId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL, "Reason" TEXT NOT NULL, "Status" INTEGER NOT NULL, "ReviewComment" TEXT NULL, "SubmittedAt" TEXT NOT NULL, "ReviewedAt" TEXT NULL, "ReviewedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_DeferredExams_Students" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_DeferredExams_TeachingTasks" FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE UNIQUE INDEX "IX_DeferredExams_StudentId_TeachingTaskId" ON "DeferredExams" ("StudentId", "TeachingTaskId");""",
|
|
"""CREATE INDEX "IX_DeferredExams_Status_CreatedAt" ON "DeferredExams" ("Status", "CreatedAt");""",
|
|
|
|
"""CREATE TABLE "GradeModifications" ("Id" TEXT NOT NULL CONSTRAINT "PK_GradeModifications" PRIMARY KEY, "GradeRecordId" TEXT NOT NULL, "CurrentScore" TEXT NOT NULL, "RequestedScore" TEXT NOT NULL, "Reason" TEXT NOT NULL, "Status" INTEGER NOT NULL, "ReviewComment" TEXT NULL, "ApplicantUserId" TEXT NOT NULL, "SubmittedAt" TEXT NOT NULL, "CollegeReviewedAt" TEXT NULL, "CollegeReviewedByUserId" TEXT NULL, "FinalReviewedAt" TEXT NULL, "FinalReviewedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_GradeModifications_GradeRecords" FOREIGN KEY ("GradeRecordId") REFERENCES "GradeRecords" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE INDEX "IX_GradeModifications_Status_CreatedAt" ON "GradeModifications" ("Status", "CreatedAt");""",
|
|
|
|
"""CREATE TABLE "CourseSubstitutions" ("Id" TEXT NOT NULL CONSTRAINT "PK_CourseSubstitutions" PRIMARY KEY, "StudentId" TEXT NOT NULL, "OriginalCourseId" TEXT NOT NULL, "SubstituteCourseId" TEXT NOT NULL, "Reason" TEXT NOT NULL, "Status" INTEGER NOT NULL, "ReviewComment" TEXT NULL, "SubmittedAt" TEXT NOT NULL, "ReviewedAt" TEXT NULL, "ReviewedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_CourseSubstitutions_Students" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_CourseSubstitutions_OriginalCourse" FOREIGN KEY ("OriginalCourseId") REFERENCES "Courses" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_CourseSubstitutions_SubstituteCourse" FOREIGN KEY ("SubstituteCourseId") REFERENCES "Courses" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE UNIQUE INDEX "IX_CourseSubstitutions_StudentId_OriginalCourseId" ON "CourseSubstitutions" ("StudentId", "OriginalCourseId");""",
|
|
"""CREATE INDEX "IX_CourseSubstitutions_Status_CreatedAt" ON "CourseSubstitutions" ("Status", "CreatedAt");"""
|
|
];
|
|
|
|
private static readonly string[] AcademicWarningStatements =
|
|
[
|
|
"""CREATE TABLE "WarningRules" ("Id" TEXT NOT NULL CONSTRAINT "PK_WarningRules" PRIMARY KEY, "Type" INTEGER NOT NULL, "Name" TEXT NOT NULL, "Threshold" TEXT NOT NULL, "IsEnabled" INTEGER NOT NULL, "NotifyStudent" INTEGER NOT NULL, "NotifyCounselor" INTEGER NOT NULL, "AcademicTermId" TEXT NOT NULL, "Description" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_WarningRules_AcademicTerms" FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE CASCADE);""",
|
|
"""CREATE UNIQUE INDEX "IX_WarningRules_AcademicTermId_Type" ON "WarningRules" ("AcademicTermId", "Type");""",
|
|
"""CREATE TABLE "WarningRecords" ("Id" TEXT NOT NULL CONSTRAINT "PK_WarningRecords" PRIMARY KEY, "StudentId" TEXT NOT NULL, "Type" INTEGER NOT NULL, "Status" INTEGER NOT NULL, "TriggerValue" TEXT NOT NULL, "Detail" TEXT NOT NULL, "AcknowledgedAt" TEXT NULL, "AcknowledgeComment" TEXT NULL, "AcademicTermId" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_WarningRecords_Students" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE UNIQUE INDEX "IX_WarningRecords_StudentId_AcademicTermId_Type" ON "WarningRecords" ("StudentId", "AcademicTermId", "Type");""",
|
|
"""CREATE INDEX "IX_WarningRecords_Status" ON "WarningRecords" ("Status");""",
|
|
"""ALTER TABLE "WarningRules" ADD COLUMN "AutoCheckEnabled" INTEGER NOT NULL DEFAULT 0;""",
|
|
"""ALTER TABLE "WarningRules" ADD COLUMN "CheckDayOfWeek" INTEGER NULL;""",
|
|
"""ALTER TABLE "WarningRules" ADD COLUMN "CheckHour" INTEGER NOT NULL DEFAULT 8;""",
|
|
"""ALTER TABLE "WarningRules" ADD COLUMN "CheckMinute" INTEGER NOT NULL DEFAULT 0;""",
|
|
"""ALTER TABLE "WarningRules" ADD COLUMN "LastCheckAt" TEXT NULL;"""
|
|
];
|
|
|
|
private static readonly string[] AcademicTermArchivingStatements =
|
|
[
|
|
"""ALTER TABLE "AcademicTerms" ADD COLUMN "IsArchived" INTEGER NOT NULL DEFAULT 0;""",
|
|
"""ALTER TABLE "AcademicTerms" ADD COLUMN "ArchivedAt" TEXT NULL;""",
|
|
"""CREATE INDEX IF NOT EXISTS "IX_AcademicTerms_IsArchived" ON "AcademicTerms" ("IsArchived");"""
|
|
];
|
|
|
|
private const string TeachingEvaluationMigration = "TeachingEvaluation";
|
|
|
|
private static readonly string[] TeachingEvaluationStatements =
|
|
[
|
|
"""CREATE TABLE "EvaluationSetups" ("Id" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "AcademicTermId" TEXT NOT NULL, "Name" TEXT NOT NULL, "Status" INTEGER NOT NULL, "StartsAt" TEXT NULL, "EndsAt" TEXT NULL, CONSTRAINT "PK_EvaluationSetups" PRIMARY KEY ("Id"), CONSTRAINT "FK_EvaluationSetups_AcademicTerms_AcademicTermId" FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE INDEX "IX_EvaluationSetups_AcademicTermId_Status" ON "EvaluationSetups" ("AcademicTermId", "Status");""",
|
|
"""CREATE TABLE "EvaluationDimensions" ("Id" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "EvaluationSetupId" TEXT NOT NULL, "Name" TEXT NOT NULL, "MaxScore" INTEGER NOT NULL, "SortOrder" INTEGER NOT NULL, CONSTRAINT "PK_EvaluationDimensions" PRIMARY KEY ("Id"), CONSTRAINT "FK_EvaluationDimensions_EvaluationSetups_EvaluationSetupId" FOREIGN KEY ("EvaluationSetupId") REFERENCES "EvaluationSetups" ("Id") ON DELETE CASCADE);""",
|
|
"""CREATE INDEX "IX_EvaluationDimensions_EvaluationSetupId_SortOrder" ON "EvaluationDimensions" ("EvaluationSetupId", "SortOrder");""",
|
|
"""CREATE TABLE "EvaluationRecords" ("Id" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "EvaluationSetupId" TEXT NOT NULL, "StudentId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL, "SubmittedAt" TEXT NULL, CONSTRAINT "PK_EvaluationRecords" PRIMARY KEY ("Id"), CONSTRAINT "FK_EvaluationRecords_EvaluationSetups_EvaluationSetupId" FOREIGN KEY ("EvaluationSetupId") REFERENCES "EvaluationSetups" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_EvaluationRecords_Students_StudentId" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_EvaluationRecords_TeachingTasks_TeachingTaskId" FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE UNIQUE INDEX "IX_EvaluationRecords_SetupId_StudentId_TaskId" ON "EvaluationRecords" ("EvaluationSetupId", "StudentId", "TeachingTaskId");""",
|
|
"""CREATE TABLE "EvaluationScores" ("EvaluationRecordId" TEXT NOT NULL, "EvaluationDimensionId" TEXT NOT NULL, "Score" INTEGER NOT NULL, CONSTRAINT "PK_EvaluationScores" PRIMARY KEY ("EvaluationRecordId", "EvaluationDimensionId"), CONSTRAINT "FK_EvaluationScores_EvaluationRecords_EvaluationRecordId" FOREIGN KEY ("EvaluationRecordId") REFERENCES "EvaluationRecords" ("Id") ON DELETE CASCADE, CONSTRAINT "FK_EvaluationScores_EvaluationDimensions_EvaluationDimensionId" FOREIGN KEY ("EvaluationDimensionId") REFERENCES "EvaluationDimensions" ("Id") ON DELETE RESTRICT);""",
|
|
];
|
|
|
|
private const string MakeupExamsMigration = "MakeupExams";
|
|
|
|
private static readonly string[] MakeupExamStatements =
|
|
[
|
|
"""CREATE TABLE "MakeupExamPlans" ("Id" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "AcademicTermId" TEXT NOT NULL, "Name" TEXT NOT NULL, "Status" INTEGER NOT NULL, "Notes" TEXT NULL, "PublishedAt" TEXT NULL, CONSTRAINT "PK_MakeupExamPlans" PRIMARY KEY ("Id"), CONSTRAINT "FK_MakeupExamPlans_AcademicTerms_AcademicTermId" FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE INDEX "IX_MakeupExamPlans_AcademicTermId_Status" ON "MakeupExamPlans" ("AcademicTermId", "Status");""",
|
|
"""CREATE TABLE "MakeupExamSessions" ("Id" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "MakeupExamPlanId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL, "ClassroomId" TEXT NULL, "ExamDate" TEXT NOT NULL, "StartPeriod" INTEGER NOT NULL, "PeriodCount" INTEGER NOT NULL, "StartsAt" TEXT NOT NULL, "EndsAt" TEXT NOT NULL, "RequiredBuildingId" TEXT NULL, "RequiredInvigilatorCount" INTEGER NOT NULL, "Notes" TEXT NULL, CONSTRAINT "PK_MakeupExamSessions" PRIMARY KEY ("Id"), CONSTRAINT "FK_MakeupExamSessions_MakeupExamPlans_MakeupExamPlanId" FOREIGN KEY ("MakeupExamPlanId") REFERENCES "MakeupExamPlans" ("Id") ON DELETE CASCADE, CONSTRAINT "FK_MakeupExamSessions_TeachingTasks_TeachingTaskId" FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_MakeupExamSessions_Classrooms_ClassroomId" FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id") ON DELETE SET NULL, CONSTRAINT "FK_MakeupExamSessions_Buildings_RequiredBuildingId" FOREIGN KEY ("RequiredBuildingId") REFERENCES "Buildings" ("Id") ON DELETE SET NULL);""",
|
|
"""CREATE INDEX "IX_MakeupExamSessions_MakeupExamPlanId_StartsAt" ON "MakeupExamSessions" ("MakeupExamPlanId", "StartsAt");""",
|
|
"""CREATE INDEX "IX_MakeupExamSessions_TeachingTaskId" ON "MakeupExamSessions" ("TeachingTaskId");""",
|
|
"""CREATE INDEX "IX_MakeupExamSessions_MakeupExamPlanId_ExamDate" ON "MakeupExamSessions" ("MakeupExamPlanId", "ExamDate");""",
|
|
"""CREATE INDEX "IX_MakeupExamSessions_RequiredBuildingId" ON "MakeupExamSessions" ("RequiredBuildingId");""",
|
|
"""CREATE TABLE "MakeupExamSessionInvigilators" ("MakeupExamSessionId" TEXT NOT NULL, "TeacherId" TEXT NOT NULL, CONSTRAINT "PK_MakeupExamSessionInvigilators" PRIMARY KEY ("MakeupExamSessionId", "TeacherId"), CONSTRAINT "FK_MakeupExamSessionInvigilators_MakeupExamSessions_MakeupExamSessionId" FOREIGN KEY ("MakeupExamSessionId") REFERENCES "MakeupExamSessions" ("Id") ON DELETE CASCADE, CONSTRAINT "FK_MakeupExamSessionInvigilators_Teachers_TeacherId" FOREIGN KEY ("TeacherId") REFERENCES "Teachers" ("Id") ON DELETE RESTRICT);""",
|
|
"""CREATE TABLE "MakeupExamEnrollments" ("MakeupExamSessionId" TEXT NOT NULL, "StudentId" TEXT NOT NULL, "Reason" INTEGER NOT NULL, "SourceGradeRecordId" TEXT NULL, "SourceDeferredExamId" TEXT NULL, "MakeupScore" TEXT NULL, CONSTRAINT "PK_MakeupExamEnrollments" PRIMARY KEY ("MakeupExamSessionId", "StudentId"), CONSTRAINT "FK_MakeupExamEnrollments_MakeupExamSessions_MakeupExamSessionId" FOREIGN KEY ("MakeupExamSessionId") REFERENCES "MakeupExamSessions" ("Id") ON DELETE CASCADE, CONSTRAINT "FK_MakeupExamEnrollments_Students_StudentId" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_MakeupExamEnrollments_GradeRecords_SourceGradeRecordId" FOREIGN KEY ("SourceGradeRecordId") REFERENCES "GradeRecords" ("Id") ON DELETE SET NULL, CONSTRAINT "FK_MakeupExamEnrollments_DeferredExams_SourceDeferredExamId" FOREIGN KEY ("SourceDeferredExamId") REFERENCES "DeferredExams" ("Id") ON DELETE SET NULL);""",
|
|
"""CREATE INDEX "IX_MakeupExamEnrollments_StudentId_MakeupExamSessionId" ON "MakeupExamEnrollments" ("StudentId", "MakeupExamSessionId");""",
|
|
];
|
|
|
|
private const string MakeupExamAutoJobsMigration = "MakeupExamAutoJobs";
|
|
|
|
private static readonly string[] MakeupExamAutoJobStatements =
|
|
[
|
|
"""CREATE TABLE "MakeupExamAutoJobs" ("Id" TEXT NOT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, "MakeupExamPlanId" TEXT NOT NULL, "Status" INTEGER NOT NULL, "TotalCourses" INTEGER NOT NULL, "ProcessedCourses" INTEGER NOT NULL, "CreatedSessions" INTEGER NOT NULL, "EnrolledStudents" INTEGER NOT NULL, "MessagesJson" TEXT NULL, "ErrorMessage" TEXT NULL, "StartedAt" TEXT NULL, "CompletedAt" TEXT NULL, CONSTRAINT "PK_MakeupExamAutoJobs" PRIMARY KEY ("Id"), CONSTRAINT "FK_MakeupExamAutoJobs_MakeupExamPlans_MakeupExamPlanId" FOREIGN KEY ("MakeupExamPlanId") REFERENCES "MakeupExamPlans" ("Id") ON DELETE CASCADE);""",
|
|
"""CREATE INDEX "IX_MakeupExamAutoJobs_MakeupExamPlanId_CreatedAt" ON "MakeupExamAutoJobs" ("MakeupExamPlanId", "CreatedAt");""",
|
|
"""CREATE INDEX "IX_MakeupExamAutoJobs_Status_CreatedAt" ON "MakeupExamAutoJobs" ("Status", "CreatedAt");""",
|
|
];
|
|
|
|
private static readonly string[] UnifiedMessageCenterStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "MessageDispatches" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_MessageDispatches" PRIMARY KEY,
|
|
"SenderUserId" TEXT NOT NULL,
|
|
"SenderName" TEXT NOT NULL,
|
|
"Title" TEXT NOT NULL,
|
|
"Content" TEXT NOT NULL,
|
|
"Category" INTEGER NOT NULL,
|
|
"AudienceType" INTEGER NOT NULL,
|
|
"AudienceId" TEXT NULL,
|
|
"AudienceName" TEXT NOT NULL,
|
|
"RecipientCount" INTEGER NOT NULL,
|
|
"LinkUrl" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""CREATE INDEX "IX_MessageDispatches_SenderUserId_CreatedAt" ON "MessageDispatches" ("SenderUserId", "CreatedAt");""",
|
|
"""ALTER TABLE "Notifications" ADD COLUMN "Category" INTEGER NOT NULL DEFAULT 1;""",
|
|
"""ALTER TABLE "Notifications" ADD COLUMN "MessageDispatchId" TEXT NULL REFERENCES "MessageDispatches" ("Id") ON DELETE CASCADE;""",
|
|
"""CREATE INDEX "IX_Notifications_MessageDispatchId" ON "Notifications" ("MessageDispatchId");""",
|
|
"""CREATE INDEX "IX_Notifications_UserId_Category_CreatedAt" ON "Notifications" ("UserId", "Category", "CreatedAt");"""
|
|
];
|
|
|
|
private static readonly string[] ClassroomReservationStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "ClassroomReservations" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_ClassroomReservations" PRIMARY KEY,
|
|
"ApplicantUserId" TEXT NOT NULL,
|
|
"ApplicantName" TEXT NOT NULL,
|
|
"ApplicantCollegeId" TEXT NOT NULL,
|
|
"AcademicTermId" TEXT NOT NULL,
|
|
"ClassroomId" TEXT NOT NULL,
|
|
"ReservationDate" TEXT NOT NULL,
|
|
"StartPeriod" INTEGER NOT NULL,
|
|
"PeriodCount" INTEGER NOT NULL,
|
|
"AttendeeCount" INTEGER NOT NULL,
|
|
"Purpose" TEXT NOT NULL,
|
|
"ContactPhone" TEXT NOT NULL,
|
|
"Notes" TEXT NULL,
|
|
"Status" INTEGER NOT NULL,
|
|
"ReviewedByUserId" TEXT NULL,
|
|
"ReviewedAt" TEXT NULL,
|
|
"ReviewComment" TEXT NULL,
|
|
"CancelledAt" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_ClassroomReservations_AspNetUsers_ApplicantUserId"
|
|
FOREIGN KEY ("ApplicantUserId") REFERENCES "AspNetUsers" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ClassroomReservations_Colleges_ApplicantCollegeId"
|
|
FOREIGN KEY ("ApplicantCollegeId") REFERENCES "Colleges" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ClassroomReservations_AcademicTerms_AcademicTermId"
|
|
FOREIGN KEY ("AcademicTermId") REFERENCES "AcademicTerms" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ClassroomReservations_Classrooms_ClassroomId"
|
|
FOREIGN KEY ("ClassroomId") REFERENCES "Classrooms" ("Id")
|
|
ON DELETE RESTRICT,
|
|
CONSTRAINT "FK_ClassroomReservations_AspNetUsers_ReviewedByUserId"
|
|
FOREIGN KEY ("ReviewedByUserId") REFERENCES "AspNetUsers" ("Id")
|
|
ON DELETE SET NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ClassroomReservations_ApplicantUserId_Status_CreatedAt"
|
|
ON "ClassroomReservations" ("ApplicantUserId", "Status", "CreatedAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ClassroomReservations_ApplicantCollegeId_Status_ReservationDate"
|
|
ON "ClassroomReservations" (
|
|
"ApplicantCollegeId",
|
|
"Status",
|
|
"ReservationDate"
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ClassroomReservations_ClassroomId_ReservationDate_Status_StartPeriod"
|
|
ON "ClassroomReservations" (
|
|
"ClassroomId",
|
|
"ReservationDate",
|
|
"Status",
|
|
"StartPeriod"
|
|
);
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ClassroomReservations_AcademicTermId"
|
|
ON "ClassroomReservations" ("AcademicTermId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_ClassroomReservations_ReviewedByUserId"
|
|
ON "ClassroomReservations" ("ReviewedByUserId");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] BackgroundJobOutboxStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "BackgroundJobOutboxMessages" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_BackgroundJobOutboxMessages" PRIMARY KEY,
|
|
"JobKind" INTEGER NOT NULL,
|
|
"JobId" TEXT NOT NULL,
|
|
"State" INTEGER NOT NULL,
|
|
"PublishAttempts" INTEGER NOT NULL,
|
|
"ProcessingAttempts" INTEGER NOT NULL,
|
|
"PublishedAt" TEXT NULL,
|
|
"ProcessingToken" TEXT NULL,
|
|
"LeaseExpiresAt" TEXT NULL,
|
|
"CompletedAt" TEXT NULL,
|
|
"LastError" TEXT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_BackgroundJobOutboxMessages_JobKind_JobId"
|
|
ON "BackgroundJobOutboxMessages" ("JobKind", "JobId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_BackgroundJobOutboxMessages_LeaseExpiresAt"
|
|
ON "BackgroundJobOutboxMessages" ("LeaseExpiresAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_BackgroundJobOutboxMessages_State_CreatedAt"
|
|
ON "BackgroundJobOutboxMessages" ("State", "CreatedAt");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_BackgroundJobOutboxMessages_State_CompletedAt"
|
|
ON "BackgroundJobOutboxMessages" ("State", "CompletedAt");
|
|
"""
|
|
];
|
|
|
|
private static readonly string[] AcademicPlanningPrerequisiteStatements =
|
|
[
|
|
"""
|
|
CREATE TABLE "CoursePrerequisites" (
|
|
"Id" TEXT NOT NULL CONSTRAINT "PK_CoursePrerequisites" PRIMARY KEY,
|
|
"CourseId" TEXT NOT NULL,
|
|
"PrerequisiteCourseId" TEXT NOT NULL,
|
|
"CreatedAt" TEXT NOT NULL,
|
|
"UpdatedAt" TEXT NOT NULL,
|
|
CONSTRAINT "FK_CoursePrerequisites_Courses_CourseId"
|
|
FOREIGN KEY ("CourseId") REFERENCES "Courses" ("Id")
|
|
ON DELETE CASCADE,
|
|
CONSTRAINT "FK_CoursePrerequisites_Courses_PrerequisiteCourseId"
|
|
FOREIGN KEY ("PrerequisiteCourseId") REFERENCES "Courses" ("Id")
|
|
ON DELETE RESTRICT
|
|
);
|
|
""",
|
|
"""
|
|
CREATE UNIQUE INDEX "IX_CoursePrerequisites_CourseId_PrerequisiteCourseId"
|
|
ON "CoursePrerequisites" ("CourseId", "PrerequisiteCourseId");
|
|
""",
|
|
"""
|
|
CREATE INDEX "IX_CoursePrerequisites_PrerequisiteCourseId"
|
|
ON "CoursePrerequisites" ("PrerequisiteCourseId");
|
|
"""
|
|
];
|
|
}
|