# Africa Alert PWA - Database Schema This document outlines the SQLite database schema for the Africa Alert PWA. ## Core Modules ### Users & Authentication - **users**: Core user accounts (admin, teacher, student, parent, etc.) - `id`, `uid`, `email`, `password`, `role`, `first_name`, `last_name`, `phone`, `address`, `date_of_birth`, `gender`, `id_number`, `profile_image`, `emergency_contact`, `emergency_phone`, `department_id`, `is_active`, `last_login`, `created_at`, `updated_at`, `last_synced_at`, `sync_status`, `is_deleted` ### Academic Structure - **departments**: Academic departments - `id`, `uid`, `name`, `head_teacher_id`, `description`, ... (sync fields) - **classes**: Grade levels/sections - `id`, `uid`, `name`, `section`, `capacity`, `class_teacher_id`, `description`, ... (sync fields) - **subjects_new** (Replaces `subjects`): Academic subjects - `id`, `uid`, `name`, `code`, `department_id`, `teacher_id`, `credits`, `description`, `class_id`, ... (sync fields) - **courses**: Specific course offerings - `id`, `uid`, `name`, `subject_id`, `teacher_id`, `description`, `schedule`, `start_date`, `end_date`, `max_students`, `status`, ... (sync fields) - **course_enrolments**: Student enrollment in courses - `id`, `uid`, `student_id`, `course_id`, `enrolled_at`, `status`, `progress`, `completed_at`, ... (sync fields) ### Attendance & Grading - **attendance_new** (Replaces `attendance`): Student attendance records - `id`, `uid`, `student_id`, `subject_id`, `date`, `status`, `remarks`, `marked_by`, ... (sync fields) - **assignments**: Course assignments - `id`, `uid`, `course_id`, `title`, `description`, `instructions`, `due_date`, `max_score`, `submission_type`, `allow_late_submission`, `is_published`, ... (sync fields) - **submissions**: Assignment submissions - `id`, `uid`, `assignment_id`, `student_id`, `content`, `file_path`, `submitted_at`, `status`, `grade`, `feedback`, `graded_by`, `graded_at`, ... (sync fields) - **assignment_submissions**: Detailed assignment submissions - `id`, `uid`, `assignment_id`, `student_id`, `submission_text`, `file_path`, `submitted_at`, `status`, `marks_obtained`, `feedback`, `graded_by`, `graded_at`, ... (sync fields) - **course_grades**: Final course grades - `id`, `uid`, `student_id`, `course_id`, `score`, `letter_grade`, `term`, `academic_year`, `remarks`, `graded_by`, `graded_at`, ... (sync fields) - **grades**: General exam grades - `id`, `uid`, `student_id`, `subject_id`, `exam_type`, `marks`, `total_marks`, `grade`, `remarks`, `graded_by`, `graded_at`, `academic_year`, `term`, ... (sync fields) ### Finance & Payroll - **fee_groups**: Categories of fees - `id`, `uid`, `name`, `description`, `amount`, `type`, `frequency`, `academic_year`, `due_date`, ... (sync fields) - **student_fees**: Fees assigned to students - `id`, `uid`, `student_id`, `fee_group_id`, `amount`, `paid_amount`, `discount_amount`, `fine_amount`, `status`, `due_date`, `paid_at`, ... (sync fields) - **payments**: Payment transactions - `id`, `uid`, `student_fee_id`, `amount`, `payment_date`, `payment_method`, `reference_number`, `transaction_id`, `paynow_poll_url`, `collected_by`, `notes`, ... (sync fields) - **expenses**: School expenses - `id`, `uid`, `category`, `subcategory`, `description`, `amount`, `expense_date`, `vendor`, `invoice_number`, `payment_method`, `created_by`, `approved_by`, `receipt_image`, `status`, ... (sync fields) - **payroll_runs**: Monthly payroll processing - `id`, `uid`, `period_month`, `period_year`, `description`, `status`, `total_gross`, `total_deductions`, `total_net`, `approved_by`, `paid_at`, `created_by`, ... (sync fields) - **payslips**: Individual staff payslips - `id`, `uid`, `staff_id`, `payroll_run_id`, `basic_salary`, `housing_allowance`, `transport_allowance`, `medical_allowance`, `other_allowances`, `gross_salary`, `tax_deduction`, `pension_deduction`, `other_deductions`, `total_deductions`, `net_salary`, `bank_reference`, `paid_at`, `status`, ... (sync fields) ### HR & Staff Management - **staff_roles**: Staff positions/titles - `id`, `uid`, `name`, `description`, `is_teaching_role`, `permissions`, ... (sync fields) - **salary_grades**: Salary structure levels - `id`, `uid`, `name`, `grade_level`, `basic_salary`, `housing_allowance`, `transport_allowance`, `medical_allowance`, `other_allowances`, `description`, `effective_date`, ... (sync fields) - **staff_records**: Employment details - `id`, `uid`, `user_id`, `staff_number`, `role_id`, `salary_grade_id`, `employment_type`, `appointment_date`, `confirmation_date`, `termination_date`, `termination_reason`, `bank_name`, `bank_branch`, `account_number`, `account_name`, `department`, `designation`, `reports_to`, `is_active`, ... (sync fields) - **leave_types**: Categories of leave - `id`, `uid`, `name`, `code`, `description`, `max_days_per_year`, `is_paid`, `requires_approval`, `color`, ... (sync fields) - **leave_requests**: Staff leave applications - `id`, `uid`, `staff_id`, `leave_type_id`, `start_date`, `end_date`, `days_count`, `reason`, `status`, `approved_by`, `approved_at`, `rejection_reason`, ... (sync fields) - **staff_attendance**: Staff daily attendance - `id`, `uid`, `staff_id`, `date`, `check_in`, `check_out`, `status`, `remarks`, `marked_by`, ... (sync fields) ### Teacher Tools & Student Profile - **syllabuses**: Course syllabuses - `id`, `uid`, `subject_id`, `title`, `description`, `file_path`, `version`, `is_active`, `created_by`, ... (sync fields) - **schemes_of_work**: Teaching schemes (Schemas) - `id`, `uid`, `subject_id`, `teacher_id`, `term`, `academic_year`, `content`, `status`, `approved_by`, ... (sync fields) - **focus_points**: Key topics within a scheme - `id`, `uid`, `scheme_id`, `topic`, `objectives`, `key_concepts`, `resources_needed`, ... (sync fields) - **lesson_plans**: Daily lesson plans - `id`, `uid`, `teacher_id`, `subject_id`, `scheme_id`, `focus_point_id`, `date`, `topic`, `objectives`, `introduction`, `development`, `conclusion`, `assessment_method`, `homework`, `reflections`, `status`, ... (sync fields) - **student_social_docs**: Extended student profile/social documentation - `id`, `uid`, `student_id`, `learner_type`, `past_behavior`, `family_size`, `parents_available`, `home_environment`, `medical_notes`, `social_strengths`, `social_challenges`, `interests`, `other_data`, `updated_by`, ... (sync fields) ### Inventory & Store - **item_categories**: Inventory categories - `id`, `uid`, `name`, `code`, `description`, `parent_id`, ... (sync fields) - **suppliers**: Inventory suppliers - `id`, `uid`, `name`, `code`, `contact_person`, `email`, `phone`, `address`, `city`, `country`, `tax_id`, `bank_details`, `notes`, `is_active`, ... (sync fields) - **store_locations**: Physical store/warehouse locations - `id`, `uid`, `name`, `code`, `description`, `address`, `manager_id`, `is_warehouse`, ... (sync fields) - **items**: Inventory items - `id`, `uid`, `name`, `code`, `barcode`, `description`, `category_id`, `unit`, `purchase_price`, `selling_price`, `reorder_level`, `expiry_tracking`, `serial_tracking`, `supplier_id`, `is_active`, ... (sync fields) - **item_stock**: Current stock levels per location - `id`, `uid`, `item_id`, `store_id`, `quantity`, `min_quantity`, `max_quantity`, `last_stocktake`, ... (sync fields) - **stock_transactions**: Stock movements (purchase, sale, transfer, etc.) - `id`, `uid`, `item_id`, `store_id`, `type`, `quantity`, `unit_price`, `total_amount`, `reference_number`, `supplier_id`, `transaction_date`, `notes`, `created_by`, ... (sync fields) - **item_issues**: Items issued to staff/students - `id`, `uid`, `item_id`, `issued_to_type`, `issued_to_id`, `quantity`, `purpose`, `issue_date`, `return_due_date`, `returned_date`, `returned_quantity`, `condition_on_return`, `issued_by`, `status`, `notes`, ... (sync fields) ### Student Medical Records (feature/student-medical-records) - **student_medical_profiles** (one row per student): blood group, allergies, dietary_restrictions, contraindications, chronic_conditions, emergency_instructions, updated_by, ... (sync fields) - **student_medication_logs**: school-administered medications; `medication_name`, `dosage`, `administered_at`, `administered_by`, `reason`, `notes`, ... (sync fields) - **student_medical_history**: illness / injury / hospitalization events with severity, onset/resolution dates, treatment details, private `doctor_notes`, and `is_visible_to_teachers` flag (controls teacher visibility row-by-row), ... (sync fields) ### Online Exams - **exam_groups**: Grouping of exams/tests - `id`, `uid`, `name`, `description`, `exam_type`, `duration_minutes`, `total_marks`, `passing_marks`, `is_random_order`, `show_results`, `allow_review`, `max_attempts`, `academic_year`, `term`, ... (sync fields) - **question_banks**: Pool of exam questions - `id`, `uid`, `exam_group_id`, `subject_id`, `question_type`, `question`, `options`, `correct_answer`, `marks`, `explanation`, `difficulty`, `tags`, ... (sync fields) - **exam_schedules**: When exams are scheduled for specific classes - `id`, `uid`, `exam_group_id`, `class_id`, `subject_id`, `start_time`, `end_time`, `duration_minutes`, `instructions`, `is_active`, ... (sync fields) - **exam_attempts**: Student exam results/attempts - `id`, `uid`, `student_id`, `exam_group_id`, `schedule_id`, `started_at`, `submitted_at`, `time_spent_seconds`, `total_marks`, `obtained_marks`, `percentage`, `status`, `ip_address`, `user_agent`, ... (sync fields) - **exam_answers**: Individual answers in an attempt - `id`, `uid`, `attempt_id`, `question_id`, `answer`, `is_correct`, `marks_obtained`, `answered_at`, ... (sync fields) ### Hostel & Transport - **hostels**: Hostel buildings - `id`, `uid`, `name`, `code`, `type`, `address`, `warden_id`, `phone`, `description`, `total_rooms`, `capacity`, `is_active`, ... (sync fields) - **room_types**: Types of rooms (single, shared, etc.) - `id`, `uid`, `name`, `code`, `description`, `bed_count`, `price_per_semester`, `facilities`, ... (sync fields) - **rooms**: Individual rooms in hostels - `id`, `uid`, `hostel_id`, `room_type_id`, `room_number`, `floor`, `bed_count`, `status`, `description`, ... (sync fields) - **room_assignments**: Student room assignments - `id`, `uid`, `student_id`, `room_id`, `bed_number`, `start_date`, `end_date`, `status`, `remarks`, `assigned_by`, ... (sync fields) - **hostel_fees**: Hostel-specific fees - `id`, `uid`, `student_id`, `room_id`, `amount`, `period`, `due_date`, `paid_amount`, `status`, `paid_at`, ... (sync fields) - **vehicles**: School vehicles - `id`, `uid`, `registration_number`, `model`, `make`, `year`, `color`, `capacity`, `vehicle_type`, `fuel_type`, `insurance_expiry`, `roadworthy_expiry`, `status`, `last_service_date`, `next_service_date`, ... (sync fields) - **routes**: Transport routes - `id`, `uid`, `name`, `code`, `description`, `start_point`, `end_point`, `distance_km`, `estimated_time_minutes`, `status`, ... (sync fields) - **pickup_points**: Stops along a route - `id`, `uid`, `route_id`, `name`, `address`, `latitude`, `longitude`, `pickup_time`, `dropoff_time`, `sequence_order`, ... (sync fields) - **vehicle_routes**: Assignment of vehicles to routes - `id`, `uid`, `vehicle_id`, `route_id`, `driver_id`, `conductor_id`, `start_time`, `end_time`, `days_of_week`, `is_active`, ... (sync fields) - **transport_allocations**: Students assigned to transport - `id`, `uid`, `student_id`, `route_id`, `pickup_point_id`, `vehicle_route_id`, `fee_amount`, `is_active`, `effective_from`, `effective_to`, ... (sync fields) ### Front Office & Communication - **admission_enquiries**: New student enquiries - `id`, `uid`, `full_name`, `email`, `phone`, `address`, `class_interested`, `source`, `enquiry_date`, `follow_up_date`, `status`, `assigned_to`, `notes`, `next_action`, ... (sync fields) - **visitor_logs**: School visitor records - `id`, `uid`, `visitor_name`, `visitor_type`, `phone`, `email`, `id_number`, `purpose`, `person_to_visit`, `check_in`, `check_out`, `badge_number`, `remarks`, `created_by`, ... (sync fields) - **phone_call_logs**: Log of phone communications - `id`, `uid`, `caller_name`, `caller_phone`, `caller_type`, `direction`, `call_time`, `duration_seconds`, `purpose`, `response`, `follow_up_required`, `follow_up_date`, `handled_by`, `notes`, ... (sync fields) - **postal_dispatch**: Incoming/Outgoing mail log - `id`, `uid`, `type`, `reference_number`, `sender`, `receiver`, `address`, `courier`, `tracking_number`, `dispatch_date`, `received_date`, `received_by`, `description`, `status`, `created_by`, ... (sync fields) - **complaints**: School complaint management - `id`, `uid`, `complainant_name`, `complainant_type`, `contact_phone`, `contact_email`, `category`, `priority`, `subject`, `description`, `date_received`, `assigned_to`, `status`, `resolution`, `resolved_by`, `resolved_at`, `rating`, `feedback`, ... (sync fields) - **messages_new** (Replaces `messages`): Internal messaging/notifications - `id`, `uid`, `from_user_id`, `to_user_id`, `subject`, `body`, `is_read`, `is_announcement`, `priority`, ... (sync fields) - **chat_groups**: Group chat channels - `id`, `uid`, `name`, `created_by`, `created_at`, `updated_at`, `is_deleted` - **chat_group_members**: Members enrolled in group chats - `group_id`, `user_id`, `joined_at` - **notices**: Notice board announcements - `id`, `uid`, `title`, `content`, `category`, `priority`, `audience`, `is_pinned`, `created_by`, `expiry_date`, ... (sync fields) ### Library - **library_books**: Books in the library - `id`, `uid`, `isbn`, `title`, `author`, `category`, `publisher`, `year_published`, `total_copies`, `available_copies`, `shelf_location`, `status`, `is_deleted` - **library_issues**: Book borrowing records - `id`, `uid`, `book_id`, `user_id`, `issue_date`, `due_date`, `return_date`, `status`, `issued_by`, `is_deleted` ### Edutainment & Games - **edutainment_games**: Educational game setup - `id`, `uid`, `game_type`, `title`, `description`, `subject_id`, `created_by`, `difficulty`, `reward_points`, `time_limit_seconds`, `game_config`, `is_published`, ... (sync fields) - **edutainment_content**: Question repository for scramble and trivia games - `id`, `uid`, `game_type`, `subject_id`, `created_by`, `question_text`, `hint_text`, `options`, `correct_answer`, `is_deleted` - **edutainment_sessions**: Student edutainment game play sessions and results - `id`, `uid`, `game_id`, `student_id`, `score`, `completed_at`, `points_earned`, ... (sync fields) ### System & Sync - **system_settings**: Key-value system configurations - `id`, `key`, `value`, `description`, `category`, ... (sync fields) - **settings** (Replaces/Augments `system_settings`): Enhanced settings - `id`, `key`, `value`, `description`, `category`, `is_encrypted`, ... (sync fields) - **calendar_events** (Replaces `events`): School calendar - `id`, `uid`, `title`, `description`, `date`, `time`, `end_time`, `location`, `type`, `is_all_day`, `is_public`, `academic_year`, `created_by`, ... (sync fields) - **sync_logs**: History of synchronization operations - `id`, `table_name`, `record_id`, `operation`, `status`, `error_message`, `retry_count`, `created_at`, `synced_at` - **sync_config**: Sync state configuration - `id`, `key`, `value`, `updated_at` ## Note on Sync Fields Most tables include the following standard fields for synchronization and soft deletion: - `created_at`: Creation timestamp - `updated_at`: Last update timestamp - `last_synced_at`: Last time this record was synced with the cloud - `sync_status`: Current sync state (`synced`, `pending`, `conflict`) - `is_deleted`: Soft deletion flag (0 for active, 1 for deleted)