Update Saqel Platform: 2026-09-08 13:43:36

This commit is contained in:
Hamza-Ayed
2026-09-08 13:43:36 +03:00
parent 0f424062fe
commit bb37b31cab
76 changed files with 3617 additions and 3059 deletions
+57 -14
View File
@@ -26,6 +26,8 @@ DROP TABLE IF EXISTS `lessons`;
DROP TABLE IF EXISTS `courses`;
DROP TABLE IF EXISTS `subjects`;
DROP TABLE IF EXISTS `guardian_students`;
DROP TABLE IF EXISTS `guardian_link_requests`;
DROP TABLE IF EXISTS `staff_accounts`;
DROP TABLE IF EXISTS `guardians`;
DROP TABLE IF EXISTS `teachers`;
DROP TABLE IF EXISTS `teacher_profiles`;
@@ -64,10 +66,10 @@ CREATE TABLE IF NOT EXISTS `directorates` (
`type` ENUM('military_culture', 'private_group', 'ministry') NOT NULL DEFAULT 'military_culture',
`commander_name` VARCHAR(255) DEFAULT NULL,
`phone` VARCHAR(50) DEFAULT NULL,
`total_schools` INT UNSIGNED NOT NULL DEFAULT 43,
`total_students` INT UNSIGNED NOT NULL DEFAULT 19000,
`total_teachers` INT UNSIGNED NOT NULL DEFAULT 800,
`annual_contract_value` DECIMAL(10, 2) NOT NULL DEFAULT 20000.00,
`total_schools` INT UNSIGNED NOT NULL DEFAULT 0,
`total_students` INT UNSIGNED NOT NULL DEFAULT 0,
`total_teachers` INT UNSIGNED NOT NULL DEFAULT 0,
`annual_contract_value` DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
@@ -85,8 +87,8 @@ CREATE TABLE IF NOT EXISTS `schools` (
`name` VARCHAR(255) NOT NULL,
`type` ENUM('military_culture', 'private', 'public', 'center') NOT NULL DEFAULT 'military_culture',
`weight_tier` ENUM('tier_a_small', 'tier_b_medium', 'tier_c_large') NOT NULL DEFAULT 'tier_b_medium',
`student_count` INT UNSIGNED NOT NULL DEFAULT 450,
`teacher_count` INT UNSIGNED NOT NULL DEFAULT 25,
`student_count` INT UNSIGNED NOT NULL DEFAULT 0,
`teacher_count` INT UNSIGNED NOT NULL DEFAULT 0,
`director_name` VARCHAR(255) DEFAULT NULL,
`phone` VARCHAR(50) DEFAULT NULL,
`city` VARCHAR(100) DEFAULT 'Amman',
@@ -116,8 +118,8 @@ CREATE TABLE IF NOT EXISTS `field_recorded_lessons` (
`grade_level` VARCHAR(50) NOT NULL,
`lesson_title` VARCHAR(255) NOT NULL,
`video_path` VARCHAR(500) NOT NULL,
`file_size_mb` DECIMAL(8, 2) NOT NULL DEFAULT 350.00,
`duration_minutes` INT UNSIGNED NOT NULL DEFAULT 45,
`file_size_mb` DECIMAL(8, 2) NOT NULL DEFAULT 0.00,
`duration_minutes` INT UNSIGNED NOT NULL DEFAULT 0,
`ai_alignment_score` DECIMAL(5, 2) DEFAULT NULL,
`teacher_talk_ratio` DECIMAL(5, 2) DEFAULT NULL,
`pedagogical_report_json` JSON DEFAULT NULL,
@@ -185,7 +187,8 @@ CREATE TABLE IF NOT EXISTS `exam_school_sessions` (
CREATE TABLE IF NOT EXISTS `school_rosters` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`school_id` BIGINT UNSIGNED NOT NULL,
`national_id` VARCHAR(20) NOT NULL,
`national_id` TEXT NOT NULL,
`national_id_hash` CHAR(64) NOT NULL,
`student_full_name` VARCHAR(255) NOT NULL,
`grade_level` VARCHAR(50) NOT NULL DEFAULT 'tawjihi_2008',
`stream` ENUM('scientific', 'literary', 'vocational', 'general') NOT NULL DEFAULT 'scientific',
@@ -193,8 +196,8 @@ CREATE TABLE IF NOT EXISTS `school_rosters` (
`claimed_student_id` BIGINT UNSIGNED DEFAULT NULL,
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_school_national_id` (`school_id`, `national_id`),
KEY `idx_roster_national_id` (`national_id`),
UNIQUE KEY `idx_school_national_id` (`school_id`, `national_id_hash`),
KEY `idx_roster_national_id` (`national_id_hash`),
CONSTRAINT `fk_roster_school` FOREIGN KEY (`school_id`) REFERENCES `schools` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -206,19 +209,20 @@ CREATE TABLE IF NOT EXISTS `students` (
`uuid` CHAR(36) NOT NULL UNIQUE,
`identity_id` BIGINT UNSIGNED DEFAULT NULL,
`school_id` BIGINT UNSIGNED DEFAULT NULL,
`national_id` VARCHAR(20) NOT NULL UNIQUE,
`national_id` TEXT NOT NULL,
`national_id_hash` CHAR(64) NOT NULL UNIQUE,
`full_name` VARCHAR(255) NOT NULL,
`pin_code_hash` VARCHAR(255) DEFAULT NULL,
`grade_level` VARCHAR(50) NOT NULL DEFAULT 'tawjihi_2008',
`stream` ENUM('scientific', 'literary', 'vocational', 'general') NOT NULL DEFAULT 'scientific',
`is_school_sponsored` TINYINT(1) NOT NULL DEFAULT 0,
`readiness_score` DECIMAL(5, 2) NOT NULL DEFAULT 85.00,
`readiness_score` DECIMAL(5, 2) NOT NULL DEFAULT 0.00,
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_students_identity` (`identity_id`),
KEY `idx_students_school` (`school_id`),
KEY `idx_students_national_id` (`national_id`),
KEY `idx_students_national_id` (`national_id_hash`),
CONSTRAINT `fk_student_identity` FOREIGN KEY (`identity_id`) REFERENCES `auth_identities` (`id`) ON DELETE SET NULL,
CONSTRAINT `fk_student_school` FOREIGN KEY (`school_id`) REFERENCES `schools` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -254,6 +258,45 @@ CREATE TABLE IF NOT EXISTS `guardian_students` (
CONSTRAINT `fk_gsp_student` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `guardian_link_requests` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`uuid` CHAR(36) NOT NULL UNIQUE,
`guardian_id` BIGINT UNSIGNED NOT NULL,
`student_id` BIGINT UNSIGNED NOT NULL,
`relationship_type` ENUM('father', 'mother', 'brother', 'guardian') NOT NULL DEFAULT 'guardian',
`status` ENUM('pending', 'approved', 'rejected', 'cancelled') NOT NULL DEFAULT 'pending',
`reviewed_at` TIMESTAMP NULL DEFAULT NULL,
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_guardian_link_pending` (`guardian_id`, `student_id`, `status`),
CONSTRAINT `fk_link_request_guardian` FOREIGN KEY (`guardian_id`) REFERENCES `guardians` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_link_request_student` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------------------------
-- Institutional staff are provisioned by an existing super admin. OTP login
-- never creates these privileged accounts from a client-supplied role.
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `staff_accounts` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`uuid` CHAR(36) NOT NULL UNIQUE,
`identity_id` BIGINT UNSIGNED NOT NULL,
`full_name` VARCHAR(255) NOT NULL,
`role` ENUM('school_admin', 'directorate_admin', 'supervisor', 'super_admin') NOT NULL,
`school_id` BIGINT UNSIGNED DEFAULT NULL,
`directorate_id` BIGINT UNSIGNED DEFAULT NULL,
`status` ENUM('active', 'suspended') NOT NULL DEFAULT 'active',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_staff_identity_role` (`identity_id`, `role`),
KEY `idx_staff_school` (`school_id`),
KEY `idx_staff_directorate` (`directorate_id`),
CONSTRAINT `fk_staff_identity` FOREIGN KEY (`identity_id`) REFERENCES `auth_identities` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_staff_school` FOREIGN KEY (`school_id`) REFERENCES `schools` (`id`) ON DELETE SET NULL,
CONSTRAINT `fk_staff_directorate` FOREIGN KEY (`directorate_id`) REFERENCES `directorates` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ------------------------------------------------------------------------------
-- 7. Table: teachers (جدول المعلمين المستقل وتحديد المدرسة والاختصاص)
-- ------------------------------------------------------------------------------