File "DummySampleDataSeeder.php"
Full Path: /home/trinadezambia/public_html/installer/old-demo-school-management.trinadezambia.com/database/seeders/DummySampleDataSeeder.php
File size: 84.29 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace Database\Seeders;
use App\Models\ClassSchool;
use App\Models\ClassSection;
use App\Models\ClassSubject;
use App\Models\Feature;
use App\Models\Mediums;
use App\Models\Package;
use App\Models\PackageFeature;
use App\Models\School;
use App\Models\Section;
use App\Models\SessionYear;
use App\Models\Staff;
use App\Models\Students;
use App\Models\Subject;
use App\Models\User;
use App\Models\Holiday;
use App\Models\Assignment;
use App\Models\Announcement;
use App\Models\Timetable;
use App\Models\OnlineExam;
use App\Models\Exam;
use App\Models\ExamTimetable;
use App\Models\ExamResult;
use App\Models\Fee;
use App\Models\File;
use App\Models\FeesType;
use App\Models\FeeInstallment;
use App\Models\Attendance;
use App\Models\Slider;
use App\Models\Notification;
use App\Models\Leave;
use App\Models\ExpenseCategory;
use App\Models\Expense;
use App\Models\PayrollSetting;
use App\Models\Payroll;
use App\Models\FormField;
use App\Models\Fees;
use App\Models\FeesClassType;
use App\Models\FeesInstallment;
use App\Models\Lesson;
use App\Models\LessonCommon;
use App\Models\LessonTopic;
use App\Models\TopicCommon;
use App\Models\Semester;
use App\Models\AssignmentCommon;
use App\Services\CachingService;
use App\Services\SchoolDataService;
use App\Services\UserService;
use Illuminate\Database\Seeder;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Storage;
use Faker\Factory as Faker;
use App\Services\SessionYearsTrackingsService;
use App\Models\AnnouncementClass;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
class DummySampleDataSeeder extends Seeder
{
private SchoolDataService $schoolService;
private SessionYearsTrackingsService $sessionYearsTrackingsService;
private $faker;
private CachingService $cache;
public function __construct(SchoolDataService $schoolService, SessionYearsTrackingsService $sessionYearsTrackingsService, CachingService $cache)
{
$this->schoolService = $schoolService;
$this->sessionYearsTrackingsService = $sessionYearsTrackingsService;
$this->cache = $cache;
$this->faker = Faker::create();
}
public function run()
{
try {
// Create a default school if none exists
$school = School::firstOrCreate(
['id' => 1],
[
'name' => 'Demo School',
'address' => '123 Education Street',
'support_phone' => '+1234567890',
'support_email' => 'support@demoschool.com',
'tagline' => 'Education for All',
'logo' => 'default-logo.png',
'status' => 1,
'database_name' => 'school_demo'
]
);
$schoolId = $school->id;
// Set up database connection if needed
if ($school->database_name) {
Config::set('database.connections.school.database', $school->database_name);
DB::purge('school');
DB::connection('school')->reconnect();
DB::setDefaultConnection('school');
}
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
try {
// Seed Session Years
// $this->seedSessionYears($schoolId);
// // Seed Custom Fields
// $this->seedCustomFields($schoolId);
// // Seed Mediums
// $this->seedMediums($schoolId);
// // Seed Streams
// $this->seedStreams($schoolId);
// // Seed Shifts
// $this->seedShifts($schoolId);
// // Seed Semesters
// $this->seedSemesters($schoolId);
// // Seed Sections
// $this->seedSections($schoolId);
// // Seed Classes
// $this->seedClasses($schoolId);
// // Seed Class Groups
// $this->seedClassGroups($schoolId);
// // Seed Class Sections
// $this->seedClassSections($schoolId);
// // Seed Subjects
// $this->seedSubjects($schoolId);
// // Seed Class Subjects
// $this->seedClassSubjects($schoolId);
// // Seed Users
// $this->seedUsers($schoolId);
// // Seed Class Teachers
// $this->seedClassTeachers($schoolId);
// Seed Students
$this->seedStudents($schoolId);
// Seed Admission Inquiries
// $this->seedAdmissionInquiries($schoolId);
// // Seed Fee Types
// $this->seedFeesTypes($schoolId);
// // Seed Fees
// $this->seedManageFees($schoolId);
// // Seed Attendance
// $this->seedAttendance($schoolId);
// // Seed Offline Exams
// $this->seedExams($schoolId);
// // Seed Online Exams
// $this->seedOnlineExams($schoolId);
// // Seed Exam Results
// $this->seedExamResults($schoolId);
// // Seed Expense Categories
// $this->seedExpenseCategories($schoolId);
// // Seed Expenses
// $this->seedExpenses($schoolId);
// // Seed Payroll Settings
// $this->seedPayrollSettings($schoolId);
// // Seed Payrolls
// $this->seedPayrolls($schoolId);
// // Seed Roles
// $this->seedStaffRoles($schoolId);
// // Seed Staff
// $this->seedStaff($schoolId);
// // Seed Leaves
// $this->seedLeaves($schoolId);
// // Seed Holidays
// $this->seedHolidays($schoolId);
// // Seed Notifications
// $this->seedNotifications($schoolId);
// // Seed Announcements
// $this->seedAnnouncements($schoolId);
// // Seed Gallery
// $this->seedGallery($schoolId);
// // Seed Certificates
// $this->seedCertificates($schoolId);
// // Seed Timetable
// $this->seedTimetable($schoolId);
// // Seed Sliders
// $this->seedSliders($schoolId);
// // Seed Lesson
// $this->seedLesson($schoolId);
// // Seed Lesson Topic
// $this->seedLessonTopic($schoolId);
// // Seed Assignment
// $this->seedAssignment($schoolId);
$this->command->info('Sample data seeded successfully!');
} catch (\Exception $e) {
$this->command->error('Error seeding data: ' . $e->getMessage());
throw $e;
} finally {
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
} catch (\Exception $e) {
$this->command->error('Error in seeder: ' . $e->getMessage());
throw $e;
}
}
private function seedStaffRoles($schoolId)
{
$roles = [
'Accountant',
'Librarian',
'Receptionist',
'Principal',
'Vice Principal',
'Staff',
];
$permissions = Permission::all();
foreach ($roles as $role) {
$role = Role::create(['name' => $role, 'school_id' => $schoolId]);
$role->syncPermissions($permissions);
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$this->sessionYearsTrackingsService->storeSessionYearsTracking('App\Models\Role', $role->id, Auth::user()->id, $sessionYear->id, $schoolId, null);
}
}
private function seedStaff($schoolId)
{
$roles = Role::where('school_id', $schoolId)->get();
for ($i = 1; $i <= 10; $i++) {
$number = $this->faker->phoneNumber;
$user = User::create([
'first_name' => "Staff " . $i,
'last_name' => $this->faker->lastName,
'email' => strtolower("staff" . $i) . '@example.com',
'password' => Hash::make('1234567890'),
'gender' => rand(0, 1) ? 'Male' : 'Female',
'mobile' => $number,
'dob' => $this->faker->date('Y-m-d', '2000-01-01'),
'image' => null,
'current_address' => "Current Address " . $i,
'permanent_address' => "Permanent Address " . $i,
'occupation' => null,
'status' => 1,
'reset_request' => 0,
'fcm_id' => null,
'school_id' => $schoolId,
'language' => 'en',
'remember_token' => null,
'email_verified_at' => now(),
'two_factor_enabled' => 1,
'two_factor_secret' => null,
'two_factor_expires_at' => null,
'created_at' => now(),
'updated_at' => now(),
'deleted_at' => null
]);
foreach ($roles as $role) {
$user->assignRole($role);
}
}
}
private function seedSessionYears($schoolId)
{
try {
$sessionYears = [
[
'name' => '2023-2024',
'default' => 1,
'start_date' => '2023-04-01',
'end_date' => '2024-03-31',
'school_id' => $schoolId,
],
[
'name' => '2024-2025',
'default' => 0,
'start_date' => '2024-04-01',
'end_date' => '2025-03-31',
'school_id' => $schoolId,
],
];
foreach ($sessionYears as $year) {
SessionYear::updateOrCreate(
[
'name' => $year['name'],
'school_id' => $schoolId
],
array_merge($year, [
'created_at' => now(),
'updated_at' => now()
])
);
}
} catch (\Exception $e) {
$this->command->error('Error seeding session years: ' . $e->getMessage());
throw $e;
}
}
private function seedCustomFields($schoolId)
{
$formFields = [
[
'name' => 'Student First Name',
'type' => 'text',
'is_required' => 0,
'default_values' => null,
'school_id' => $schoolId,
'user_type' => 1,
'rank' => 1,
'display_on_id' => 0,
],
[
'name' => 'Blood group',
'type' => 'dropdown',
'is_required' => 0,
'default_values' => json_encode(["A+","B+","A","B","O","O+"]),
'school_id' => $schoolId,
'user_type' => 1,
'rank' => 2,
'display_on_id' => 1,
],
[
'name' => 'Previous School',
'type' => 'text',
'is_required' => 0,
'default_values' => null,
'school_id' => $schoolId,
'user_type' => 1,
'rank' => 3,
'display_on_id' => 0,
],
[
'name' => 'Transport Route',
'type' => 'dropdown',
'is_required' => 0,
'default_values' => json_encode(['Route A', 'Route B', 'Route C', 'Route D']),
'school_id' => $schoolId,
'user_type' => 1,
'rank' => 4,
'display_on_id' => 0,
],
[
'name' => 'Experience Years',
'type' => 'number',
'is_required' => 1,
'default_values' => null,
'school_id' => $schoolId,
'user_type' => 2,
'rank' => 1,
'display_on_id' => 0,
],
[
'name' => 'Additional Qualifications',
'type' => 'textarea',
'is_required' => 0,
'default_values' => null,
'school_id' => $schoolId,
'user_type' => 2,
'rank' => 2,
'display_on_id' => 0,
]
];
foreach ($formFields as $field) {
DB::table('form_fields')->insert(array_merge($field, [
'created_at' => now(),
'updated_at' => now(),
]));
}
}
private function seedMediums($schoolId)
{
Mediums::insert([
[
'name' => 'English',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'Gujarati',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'Hindi',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
]);
}
private function seedStreams($schoolId)
{
$streams = [
'Science',
'Commerce',
'Arts',
'Vocational'
];
foreach ($streams as $stream) {
DB::table('streams')->insert([
'name' => $stream,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now()
]);
}
}
private function seedShifts($schoolId)
{
$shifts = [
[
'name' => 'Morning Shift',
'start_time' => '07:30:00',
'end_time' => '13:30:00'
],
[
'name' => 'Afternoon Shift',
'start_time' => '13:00:00',
'end_time' => '19:00:00'
]
];
foreach ($shifts as $shift) {
DB::table('shifts')->insert(array_merge($shift, [
'school_id' => $schoolId,
'status' => 1,
'created_at' => now(),
'updated_at' => now()
]));
}
}
private function seedSemesters($schoolId)
{
$semesters = [
[
'name' => 'Semester 1',
'start_month' => 4, // April
'end_month' => 9, // September
],
[
'name' => 'Semester 2',
'start_month' => 10, // October
'end_month' => 3, // March
]
];
foreach ($semesters as $semester) {
DB::table('semesters')->insert(array_merge($semester, [
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now()
]));
}
}
private function seedSections($schoolId)
{
Section::insert([
[
'name' => 'A',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'B',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'C',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
]);
}
private function seedClasses($schoolId)
{
$mediums = Mediums::where('school_id', $schoolId)->pluck('id');
$shifts = DB::table('shifts')->where('school_id', $schoolId)->pluck('id');
$streams = DB::table('streams')->where('school_id', $schoolId)->pluck('id');
$classes = [
['name' => 'Class 1', 'include_semesters' => 0],
['name' => 'Class 2', 'include_semesters' => 0],
['name' => 'Class 3', 'include_semesters' => 0],
['name' => 'Class 4', 'include_semesters' => 0],
['name' => 'Class 5', 'include_semesters' => 0],
['name' => 'Class 6', 'include_semesters' => 0],
['name' => 'Class 7', 'include_semesters' => 0],
['name' => 'Class 8', 'include_semesters' => 0],
['name' => 'Class 9', 'include_semesters' => 1],
['name' => 'Class 10', 'include_semesters' => 1],
['name' => 'Class 11', 'include_semesters' => 1],
['name' => 'Class 12', 'include_semesters' => 1],
];
foreach ($mediums as $mediumId) {
foreach ($classes as $class) {
ClassSchool::create([
'name' => $class['name'],
'medium_id' => $mediumId,
'shift_id' => $shifts->random(),
'stream_id' => $class['include_semesters'] ? $streams->random() : null,
'include_semesters' => $class['include_semesters'],
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
private function seedClassGroups($schoolId)
{
$groups = [
'Group A - Science',
'Group B - Commerce',
'Group C - Arts',
'Group D - Vocational'
];
foreach ($groups as $group) {
DB::table('class_groups')->insert([
'name' => $group,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now()
]);
}
}
private function seedClassSections($schoolId)
{
$classes = ClassSchool::where('school_id', $schoolId)->get();
$sections = Section::where('school_id', $schoolId)->get();
foreach ($classes as $class) {
foreach ($sections as $section) {
// Check if combination already exists
$exists = ClassSection::where([
'class_id' => $class->id,
'section_id' => $section->id,
'medium_id' => $class->medium_id,
'school_id' => $schoolId
])->exists();
if (!$exists) {
ClassSection::create([
'class_id' => $class->id,
'section_id' => $section->id,
'medium_id' => $class->medium_id,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
}
private function seedSubjects($schoolId)
{
$classes = ClassSchool::where('school_id', $schoolId)->get();
$subjects = [
[
'name' => 'Mathematics',
'type' => 'Compulsory',
'code' => 'MATH',
'background_color' => '#000000',
],
[
'name' => 'Science',
'type' => 'Compulsory',
'code' => 'SCI',
'background_color' => '#000000',
],
[
'name' => 'English',
'type' => 'Compulsory',
'code' => 'ENG',
'background_color' => '#000000',
],
//elective subjects
[
'name' => 'Elective 1',
'type' => 'Elective',
'code' => 'ELE',
'background_color' => '#000000',
],
[
'name' => 'Elective 2',
'type' => 'Elective',
'code' => 'ELE',
'background_color' => '#000000',
],
];
foreach ($classes as $class) {
foreach ($subjects as $subject) {
// Check if subject already exists
$exists = Subject::where([
'name' => $subject['name'],
'medium_id' => $class->medium_id,
'school_id' => $schoolId,
])->exists();
if (!$exists) {
Subject::create([
'name' => $subject['name'],
'code' => $subject['code'],
'type' => $subject['type'],
'medium_id' => $class->medium_id,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
// After creating subjects, create class subject mappings
$this->seedClassSubjects($schoolId);
}
private function seedClassSubjects($schoolId)
{
try {
$classes = ClassSchool::where('school_id', $schoolId)->get();
$subjects = Subject::where('school_id', $schoolId)->get();
foreach ($classes as $class) {
foreach ($subjects as $subject) {
DB::table('class_subjects')->updateOrInsert(
[
'class_id' => $class->id,
'subject_id' => $subject->id,
'school_id' => $schoolId,
],
[
'type' => $subject->type,
'created_at' => now(),
'updated_at' => now(),
]
);
}
}
} catch (\Exception $e) {
$this->command->error('Error seeding class subjects: ' . $e->getMessage());
throw $e;
}
}
private function seedUsers($schoolId)
{
$faker = Faker::create();
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
for ($i = 1; $i <= 10; $i++) {
$firstName = $faker->firstName;
$lastName = $faker->lastName;
$number = rand(1000000000, 9999999999);
$userData = [
'first_name' => $firstName,
'last_name' => $lastName,
'email' => strtolower($firstName) . $i . '@example.com',
'password' => Hash::make($number),
'gender' => $faker->randomElement(['Male', 'Female']),
'mobile' => $number,
'dob' => $faker->date('Y-m-d', '2000-01-01'),
'image' => null,
'current_address' => $faker->address,
'permanent_address' => $faker->address,
'occupation' => null,
'status' => 1,
'reset_request' => 0,
'fcm_id' => null,
'school_id' => $schoolId,
'language' => 'en',
'remember_token' => null,
'email_verified_at' => now(),
'two_factor_enabled' => 1,
'two_factor_secret' => null,
'two_factor_expires_at' => null,
'created_at' => now(),
'updated_at' => now(),
'deleted_at' => null
];
$user = User::create($userData);
$user->assignRole('Teacher');
// Add leave permissions
$leave_permission = [
'leave-list',
'leave-create',
'leave-edit',
'leave-delete',
];
$user->givePermissionTo($leave_permission);
// Create staff record
Staff::create([
'user_id' => $user->id,
'qualification' => $faker->randomElement(['B.Ed', 'M.Ed', 'PhD', 'M.A, B.Ed', 'M.Com, B.Ed', 'B.Sc, B.Ed']),
'salary' => $faker->numberBetween(30000, 80000),
'joining_date' => $faker->dateTimeBetween('-2 years', 'now')->format('Y-m-d'),
'session_year_id' => $sessionYear->id,
'join_session_year_id' => $sessionYear->id,
'leave_session_year_id' => null,
'created_at' => now(),
'updated_at' => now()
]);
}
}
private function seedClassTeachers($schoolId)
{
// Get all class sections
$classSections = ClassSection::where('school_id', $schoolId)->get();
// Get all teachers
$teachers = User::where('school_id', $schoolId)
->whereHas('roles', function ($query) {
$query->where('name', 'Teacher');
})
->get();
if ($teachers->isEmpty()) {
return;
}
foreach ($classSections as $classSection) {
// Randomly assign 1-2 class teachers per section
$classTeachers = $teachers->random(rand(1, 2));
foreach ($classTeachers as $teacher) {
// Create class teacher assignment
DB::table('class_teachers')->insert([
'class_section_id' => $classSection->id,
'teacher_id' => $teacher->id,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now()
]);
}
// Get subjects for this class
$classSubjects = DB::table('class_subjects')
->where('class_id', $classSection->class_id)
->where('school_id', $schoolId)
->get();
foreach ($classSubjects as $classSubject) {
// Randomly assign 1-2 teachers per subject
$subjectTeachers = $teachers->random(rand(1, 2));
foreach ($subjectTeachers as $teacher) {
// Create subject teacher assignment
DB::table('subject_teachers')->insert([
'class_section_id' => $classSection->id,
'subject_id' => $classSubject->subject_id,
'teacher_id' => $teacher->id,
'class_subject_id' => $classSubject->id,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now()
]);
}
}
}
}
private function seedStudents($schoolId)
{
$classSections = ClassSection::where('school_id', $schoolId)->get();
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
foreach ($classSections as $classSection) {
for ($i = 1; $i <= 10; $i++) {
// Create student with admission details
$userService = app(UserService::class);
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$get_student = Students::latest('id')->withTrashed()->pluck('id')->first();
$admission_no = $sessionYear->name .'0'. $schoolId . '0' . ($get_student + 1);
$guardian = $userService->createOrUpdateParent('Guardian '.$i, 'Guardian '.$i, "guardian{$i}_{$classSection->id}@example.com", rand(1000000000, 9999999999), rand(1, 2) == 1 ? 'Male' : 'Female', null);
$student = $userService->createStudentUser("Student ".$i, "Student ".$i, $admission_no, rand(1000000000, 9999999999), date('Y-m-d', strtotime('-10 years')), rand(1, 2) == 1 ? 'Male' : 'Female', null, $classSection->id, now()->subMonths(rand(1, 6)), 'Test Address', 'Test Permanent Address', $sessionYear->id, $guardian->id, [], 1, false);
// if($student){
// // Add custom field data
// $this->addStudentCustomFieldData($student->id, $schoolId);
// }
}
}
}
private function seedAdmissionInquiries($schoolId)
{
$classSections = ClassSection::where('school_id', $schoolId)->get();
foreach ($classSections as $classSection) {
for ($i = 1; $i <= 10; $i++) {
$password = rand(1000000000, 9999999999);
$parent = array(
'first_name' => "Guardian ".$i,
'last_name' => "Guardian ".$i,
'mobile' => rand(1000000000, 9999999999),
'gender' => rand(1, 2) == 1 ? 'Male' : 'Female',
'school_id' => $schoolId
);
//NOTE : This line will return the old values if the user is already exists
$user = User::where('email', "guardian{$i}_{$classSection->id}@example.com")->first();
if (!empty($user)) {
$user->assignRole('Guardian');
$user->update($parent);
} else {
$parent['password'] = Hash::make($password);
$user = User::create($parent);
$user->assignRole('Guardian');
}
$student = Students::create([
'user_id' => $user->id,
'class_section_id' => $classSection->id,
'admission_no' => $admission_no,
'roll_number' => null,
'admission_date' => now(),
'guardian_id' => $user->id,
'session_year_id' => $sessionYear->id,
'class_id' => $classSection->class_id ?? null,
'application_type' => "online",
'application_status' => 0,
'school_id' => $schoolId,
]);
}
}
}
private function addStudentCustomFieldData($studentId, $schoolId)
{
$customFields = FormField::where('school_id', $schoolId)->where('user_type', 1)->get();
dd($customFields);
foreach ($customFields as $field) {
$value = '';
switch ($field->type) {
case 'text':
$value = $faker->name;
break;
case 'dropdown':
// Parse the default_values JSON string to array
$options = json_decode($field->default_values, true);
if (!empty($options)) {
$value = $options[array_rand($options)];
}
break;
case 'number':
if (str_contains(strtolower($field->name), 'year')) {
$value = $faker->numberBetween(1, 10);
} else {
$value = $faker->numberBetween(1, 100);
}
break;
case 'textarea':
$value = $faker->paragraph(1);
break;
case 'date':
$value = $faker->date();
break;
case 'checkbox':
$value = $faker->boolean ? '1' : '0';
break;
case 'radio':
$options = json_decode($field->default_values, true);
if (!empty($options)) {
$value = $options[array_rand($options)];
}
break;
default:
$value = $faker->word;
}
// Insert the custom field value
DB::table('')->insert([
'form_field_id' => $field->id,
'field_value' => $value,
'model_type' => 'App\\Models\\Students',
'model_id' => $studentId,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
private function seedFeesTypes($schoolId)
{
try {
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
$feeTypes = [
[
'name' => 'Tuition Fee',
'description' => 'Monthly tuition fee',
'school_id' => $schoolId
],
[
'name' => 'Development Fee',
'description' => 'Annual development charges',
'school_id' => $schoolId
],
[
'name' => 'Library Fee',
'description' => 'Annual library charges',
'school_id' => $schoolId
],
[
'name' => 'Computer Lab Fee',
'description' => 'Computer laboratory charges',
'school_id' => $schoolId
],
[
'name' => 'Sports Fee',
'description' => 'Sports and physical education charges',
'school_id' => $schoolId
]
];
foreach ($feeTypes as $feeType) {
$type = FeesType::updateOrCreate(
[
'name' => $feeType['name'],
'school_id' => $schoolId
],
array_merge($feeType, [
'created_at' => now(),
'updated_at' => now()
])
);
// Create tracking record
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\FeesType',
$type->id,
Auth::id() ?? 1,
$sessionYear->id,
$schoolId,
null
);
}
} catch (\Exception $e) {
$this->command->error('Error seeding fee types: ' . $e->getMessage());
throw $e;
}
}
private function seedManageFees($schoolId)
{
try {
// Get required data
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
$semester = Semester::where('school_id', $schoolId)->first();
// Get all classes
$classes = ClassSchool::where('school_id', $schoolId)->get();
// Get or create school admin
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
$schoolAdmin = User::create([
'first_name' => 'School',
'last_name' => 'Admin',
'email' => 'admin_' . $schoolId . '@school.com',
'password' => Hash::make('password'),
'school_id' => $schoolId
]);
$schoolAdmin->assignRole('School Admin');
}
// Get fee types
$feeTypes = FeesType::where('school_id', $schoolId)->get();
if ($feeTypes->isEmpty()) {
throw new \Exception('No fee types found. Please run seedFeesTypes first.');
}
foreach ($classes as $class) {
// Create a fee record for each class
$feeName = "School Fees - " . $class->name;
$fee = Fee::updateOrCreate(
[
'name' => $feeName,
'class_id' => $class->id,
'school_id' => $schoolId,
'session_year_id' => $sessionYear->id
],
[
'due_date' => now()->addMonths(1),
'due_charges' => 100.00,
'due_charges_amount' => 0.00,
'created_at' => now(),
'updated_at' => now()
]
);
// Create tracking record
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\Fee',
$fee->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
$semester ? $semester->id : null
);
// Create fee class types
foreach ($feeTypes as $index => $feeType) {
FeesClassType::updateOrCreate(
[
'fees_id' => $fee->id,
'class_id' => $class->id,
'fees_type_id' => $feeType->id,
],
[
'amount' => rand(1000, 5000),
'optional' => $index === count($feeTypes) - 1 ? 1 : 0 // Make last fee type optional
]
);
}
// Create installments
$installments = [
[
'name' => 'First Installment',
'due_date' => now()->addMonth(),
'amount' => 3000
],
[
'name' => 'Second Installment',
'due_date' => now()->addMonths(2),
'amount' => 3000
],
[
'name' => 'Final Installment',
'due_date' => now()->addMonths(3),
'amount' => 2000
]
];
foreach ($installments as $installment) {
FeeInstallment::updateOrCreate(
[
'name' => $installment['name'],
'fees_id' => $fee->id,
'session_year_id' => $sessionYear->id
],
[
'due_date' => $installment['due_date'],
'due_charges_type' => 'fixed',
'due_charges' => 100,
'installment_amount' => $installment['amount'],
'created_at' => now(),
'updated_at' => now()
]
);
}
}
} catch (\Exception $e) {
$this->command->error('Error seeding fees: ' . $e->getMessage());
throw $e;
}
}
private function seedAttendance($schoolId)
{
$students = Students::where('school_id', $schoolId)->get();
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
// Generate attendance for last 30 days
for ($i = 30; $i >= 0; $i--) {
$date = now()->subDays($i);
// Skip weekends
if ($date->isWeekend()) {
continue;
}
foreach ($students as $student) {
// 90% chance of present
$status = $this->faker->randomElement(['present', 'present', 'present', 'present', 'present', 'present', 'present', 'present', 'present', 'absent']);
Attendance::create([
'student_id' => $student->id,
'class_section_id' => $student->class_section_id,
'session_year_id' => $sessionYear->id,
'date' => $date,
'status' => $status,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
private function seedExams($schoolId)
{
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$classSections = ClassSection::where('school_id', $schoolId)->get();
$examTypes = [
['name' => 'First Term Examination', 'start_date' => '2024-09-15', 'end_date' => '2024-09-30'],
['name' => 'Mid Term Examination', 'start_date' => '2024-12-15', 'end_date' => '2024-12-30'],
['name' => 'Final Term Examination', 'start_date' => '2025-03-15', 'end_date' => '2025-03-30'],
];
foreach ($examTypes as $examType) {
foreach ($classSections as $classSection) {
$exam = Exam::create([
'name' => $examType['name'],
'description' => 'Regular term examination',
'class_section_id' => $classSection->id,
'session_year_id' => $sessionYear->id,
'start_date' => $examType['start_date'],
'end_date' => $examType['end_date'],
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
// Create exam timetable
$subjects = Subject::where('class_id', $classSection->class_id)->get();
$examDate = Carbon::parse($examType['start_date']);
foreach ($subjects as $subject) {
if ($examDate->isWeekend()) {
$examDate->addDays(2);
}
ExamTimetable::create([
'exam_id' => $exam->id,
'subject_id' => $subject->id,
'date' => $examDate->format('Y-m-d'),
'start_time' => '09:00:00',
'end_time' => '12:00:00',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
$examDate->addDay();
}
}
}
}
private function seedExamResults($schoolId)
{
$exams = Exam::where('school_id', $schoolId)->get();
foreach ($exams as $exam) {
$students = Students::where('class_section_id', $exam->class_section_id)->get();
$examTimetables = ExamTimetable::where('exam_id', $exam->id)->get();
foreach ($students as $student) {
foreach ($examTimetables as $timetable) {
ExamResult::create([
'exam_id' => $exam->id,
'student_id' => $student->id,
'subject_id' => $timetable->subject_id,
'marks' => $this->faker->numberBetween(60, 98),
'grade' => 'A',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
}
private function seedExpenseCategories($schoolId)
{
try {
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
// Get or create school admin for tracking
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
$schoolAdmin = User::create([
'first_name' => 'School',
'last_name' => 'Admin',
'email' => 'admin_' . $schoolId . '@school.com',
'password' => Hash::make('password'),
'school_id' => $schoolId
]);
$schoolAdmin->assignRole('School Admin');
}
$expenseCategories = [
[
'name' => 'Utilities',
'description' => 'Electricity, water, internet bills',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'Maintenance',
'description' => 'Building and equipment maintenance',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'Supplies',
'description' => 'Office and educational supplies',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
],
[
'name' => 'Events',
'description' => 'School events and functions',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]
];
foreach ($expenseCategories as $categoryData) {
$expenseCategory = ExpenseCategory::create($categoryData);
// Create tracking record
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\ExpenseCategory',
$expenseCategory->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
null
);
}
} catch (\Exception $e) {
\Log::error('Error seeding expense categories: ' . $e->getMessage());
throw $e;
}
}
private function seedExpenses($schoolId)
{
try {
$categories = ExpenseCategory::where('school_id', $schoolId)->get();
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
// Get or create school admin for tracking
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
$schoolAdmin = User::create([
'first_name' => 'School',
'last_name' => 'Admin',
'email' => 'admin_' . $schoolId . '@school.com',
'password' => Hash::make('password'),
'school_id' => $schoolId
]);
$schoolAdmin->assignRole('School Admin');
}
foreach ($categories as $category) {
for ($i = 1; $i <= 10; $i++) {
$expense = Expense::create([
'title' => $this->faker->sentence(3),
'category_id' => $category->id,
'ref_no' => $this->faker->unique()->regexify('[A-Z]{2}[0-9]{4}'),
'staff_id' => null,
'basic_salary' => 0,
'paid_leaves' => 0.00,
'month' => now()->month,
'year' => now()->year,
'description' => $this->faker->paragraph(1),
'amount' => $this->faker->randomFloat(2, 5000, 50000),
'date' => $this->faker->dateTimeBetween('-6 months', 'now'),
'school_id' => $schoolId,
'session_year_id' => $sessionYear->id,
'created_at' => now(),
'updated_at' => now()
]);
// Create tracking record
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\Expense',
$expense->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
null
);
}
}
} catch (\Exception $e) {
\Log::error('Error seeding expenses: ' . $e->getMessage());
throw $e;
}
}
private function seedPayrollSettings($schoolId)
{
try {
// Get required data
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
// Get or create school admin for tracking
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
$schoolAdmin = User::create([
'first_name' => 'School',
'last_name' => 'Admin',
'email' => 'admin_' . $schoolId . '@school.com',
'password' => Hash::make('password'),
'school_id' => $schoolId
]);
$schoolAdmin->assignRole('School Admin');
}
$payrollSettingList = [
[
'name' => 'Basic Salary',
'amount' => 10000,
'percentage' => null,
'type' => 'allowance',
'school_id' => $schoolId,
],
[
'name' => 'HRA',
'amount' => 1000,
'percentage' => null,
'type' => 'allowance',
'school_id' => $schoolId,
],
[
'name' => 'DA',
'amount' => null,
'percentage' => 15,
'type' => 'allowance',
'school_id' => $schoolId,
],
[
'name' => 'Medical Allowance',
'amount' => null,
'percentage' => 8,
'type' => 'allowance',
'school_id' => $schoolId,
],
[
'name' => 'Professional Tax',
'amount' => 200,
'percentage' => null,
'type' => 'deduction',
'school_id' => $schoolId,
],
[
'name' => 'PF (Provident Fund)',
'amount' => null,
'percentage' => 12,
'type' => 'deduction',
'school_id' => $schoolId,
],
[
'name' => 'Income Tax',
'amount' => null,
'percentage' => 10,
'type' => 'deduction',
'school_id' => $schoolId,
]
];
foreach ($payrollSettingList as $payrollSetting) {
$payrollSetting = PayrollSetting::create($payrollSetting);
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$this->sessionYearsTrackingsService->storeSessionYearsTracking('App\Models\PayrollSetting', $payrollSetting->id, $schoolAdmin->id, $sessionYear->id, $schoolId, null);
}
} catch (\Exception $e) {
\Log::error('Error seeding payroll settings: ' . $e->getMessage());
throw $e;
}
}
private function seedPayrolls($schoolId)
{
$staff = Staff::where('school_id', $schoolId)->where('role', 'teacher')->orWhere('role', 'Staff')->get();
$settings = PayrollSetting::where('school_id', $schoolId)->first();
foreach ($staff as $employee) {
$basicSalary = $employee->salary;
$hra = ($basicSalary * $settings->hra_percentage) / 100;
$da = ($basicSalary * $settings->da_percentage) / 100;
$pf = ($basicSalary * $settings->pf_percentage) / 100;
$medical = ($basicSalary * $settings->medical_allowance_percentage) / 100;
Payroll::create([
'staff_id' => $employee->id,
'month' => now()->format('m'),
'year' => now()->format('Y'),
'basic_salary' => $basicSalary,
'hra' => $hra,
'da' => $da,
'pf' => $pf,
'medical_allowance' => $medical,
'net_salary' => $basicSalary + $hra + $da - $pf + $medical,
'status' => 'paid',
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
private function seedLeaves($schoolId)
{
$staff = Staff::where('school_id', $schoolId)->get();
$leaveTypes = ['Sick Leave', 'Casual Leave', 'Emergency Leave'];
foreach ($staff as $employee) {
for ($i = 1; $i <= 3; $i++) {
$startDate = $this->faker->dateTimeBetween('-3 months', '+1 month');
$endDate = Carbon::parse($startDate)->addDays($this->faker->numberBetween(1, 3));
Leave::create([
'staff_id' => $employee->id,
'type' => $this->faker->randomElement($leaveTypes),
'start_date' => $startDate,
'end_date' => $endDate,
'reason' => $this->faker->sentence(),
'status' => $this->faker->randomElement(['approved', 'pending', 'rejected']),
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
private function seedHolidays($schoolId)
{
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$startDate = Carbon::parse($sessionYear->start_date);
$endDate = Carbon::parse($sessionYear->end_date);
Holiday::insert([
[
'date' => $startDate->copy()->addDays(rand(1, 30))->format('Y-m-d'),
'title' => 'Republic Day',
'description' => 'National Holiday',
'school_id' => $schoolId,
],
[
'date' => $startDate->copy()->addDays(rand(31, 60))->format('Y-m-d'),
'title' => 'Independence Day',
'description' => 'National Holiday',
'school_id' => $schoolId,
],
[
'date' => $startDate->copy()->addDays(rand(61, 90))->format('Y-m-d'),
'title' => 'Gandhi Jayanti',
'description' => 'National Holiday',
'school_id' => $schoolId,
],
[
'date' => $startDate->copy()->addDays(rand(91, 120))->format('Y-m-d'),
'title' => 'Christmas',
'description' => 'National Holiday',
'school_id' => $schoolId,
],
[
'date' => $startDate->copy()->addDays(rand(121, 150))->format('Y-m-d'),
'title' => 'New Year',
'description' => 'National Holiday',
'school_id' => $schoolId,
],
[
'date' => $startDate->copy()->addDays(rand(151, 180))->format('Y-m-d'),
'title' => 'Holi',
'description' => 'National Holiday',
'school_id' => $schoolId,
],
[
'date' => $startDate->copy()->addDays(rand(181, 210))->format('Y-m-d'),
'title' => 'Baisakhi',
'description' => 'National Holiday',
'school_id' => $schoolId,
]
]);
}
private function seedNotifications($schoolId)
{
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$users = User::where('school_id', $schoolId)->get();
$notifications = [
[
'title' => 'Welcome to the New Session',
'message' => 'Get ready for an exciting academic year ahead!',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Parent-Teacher Meeting',
'message' => 'A PTM is scheduled for this Friday at 10 AM.',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Holiday Notice',
'message' => 'School will remain closed on Monday due to public holiday.',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Exam Schedule Released',
'message' => 'The mid-term exam schedule has been uploaded.',
'image' => null,
'send_to' => 'Student',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Library Week',
'message' => 'Join us for Library Week and discover amazing books!',
'image' => null,
'send_to' => 'Student',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Science Fair',
'message' => 'Students from all classes are invited to participate in the science fair.',
'image' => null,
'send_to' => 'Student',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Fee Reminder',
'message' => 'Please pay your fees before the 10th of this month to avoid late charges.',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'New Uniform Guidelines',
'message' => 'Please refer to the updated uniform policy effective from next week.',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Annual Sports Meet',
'message' => 'Cheer for your house! Annual sports meet is on 25th Nov.',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
[
'title' => 'Mobile App Update',
'message' => 'A new version of the school mobile app is now available.',
'image' => null,
'send_to' => 'Guardian',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
],
];
foreach ($notifications as $notification) {
$notification = Notification::create($notification);
$this->sessionYearsTrackingsService->storeSessionYearsTracking('App\Models\Notification', $notification->id, $users->random()->id, $sessionYear->id, $schoolId, null);
}
}
private function seedAssignment($schoolId)
{
try {
// Get required data
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
// Get a teacher for assignment creation
$teachers = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'Teacher');
})
->get();
// Get all class sections
$classSections = ClassSection::where('school_id', $schoolId)->get();
foreach ($classSections as $classSection) {
// Get subjects for this class
$classSubjects = DB::table('class_subjects')
->where('class_id', $classSection->class_id)
->where('school_id', $schoolId)
->get();
foreach ($classSubjects as $classSubject) {
foreach ($teachers as $teacher) {
// Create assignment data
$assignmentData = [
'class_section_id' => $classSection->id,
'class_subject_id' => $classSubject->id,
'name' => "Assignment - " . $classSubject->subject_id,
'instructions' => "Please complete all questions",
'due_date' => now()->addDays(7),
'points' => 100,
'resubmission' => false,
'extra_days_for_resubmission' => null,
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
'created_by' => $teacher->id, // Use teacher ID
'edited_by' => $teacher->id // Use teacher ID
];
// Create the assignment
$assignment = Assignment::create($assignmentData);
// Create assignment common data
$assignmentCommon = AssignmentCommon::create([
'assignment_id' => $assignment->id,
'class_section_id' => $classSection->id,
'class_subject_id' => $classSubject->id,
]);
// Get semester data from cache
$sessionYear = $this->cache->getDefaultSessionYear();
$semester = $this->cache->getDefaultSemesterData();
if ($semester) {
$this->sessionYearsTrackingsService->storeSessionYearsTracking('App\Models\Assignment', $assignment->id, $teacher->id, $sessionYear->id, $schoolId, $semester->id);
} else {
$this->sessionYearsTrackingsService->storeSessionYearsTracking('App\Models\Assignment', $assignment->id, $teacher->id, $sessionYear->id, $schoolId, null);
}
}
}
}
// Return teacher credentials for reference
return [
'email' => $teacher->email,
'password' => '1234567890'
];
} catch (\Exception $e) {
\Log::error('Error seeding assignments: ' . $e->getMessage());
throw $e;
}
}
private function seedAnnouncements($schoolId)
{
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
// Get the first semester instead of looking for default
$semester = Semester::where('school_id', $schoolId)->first();
$section_ids = ClassSection::where('school_id', $schoolId)->get()->pluck('id');
// Get a school admin user for creating announcements
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
// Create a school admin if none exists
$schoolAdmin = User::create([
'first_name' => 'School',
'last_name' => 'Admin',
'email' => 'admin_' . $schoolId . '@school.com',
'password' => Hash::make('password'),
'school_id' => $schoolId
]);
$schoolAdmin->assignRole('School Admin');
}
$announcements = array(
array(
'title' => 'School Annual Day',
'description' => 'Annual day celebration will be held next month.',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId
),
array(
'title' => 'Parent Teacher Meeting',
'description' => 'PTM scheduled for next weekend. Please do not miss it!',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId
),
array(
'title' => 'Winter Break Notice',
'description' => 'School will remain closed from Dec 24th to Jan 2nd for winter holidays.',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId
),
array(
'title' => 'Exam Timetable Released',
'description' => 'The final exam timetable is now available in the app and website.',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId
),
array(
'title' => 'Science Fair Registration',
'description' => 'Registrations are open for the inter-school science fair!',
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId
)
);
foreach ($announcements as $announcementData) {
try {
// Create the announcement
$announcement = Announcement::create($announcementData);
// Create tracking record
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\Announcement',
$announcement->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
$semester ? $semester->id : null
);
// Create announcement class associations for all sections
foreach ($section_ids as $section_id) {
$announcementClassData = array(
'announcement_id' => $announcement->id,
'class_section_id' => $section_id
);
$announcementClass = AnnouncementClass::create($announcementClassData);
// Create tracking record for announcement class
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\AnnouncementClass',
$announcementClass->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
$semester ? $semester->id : null
);
}
// Get all students for notifications
$students = Students::whereIn('class_section_id', $section_ids)
->with('user')
->get();
// Create notifications for students
foreach ($students as $student) {
Notification::create(array(
'title' => 'New Announcement: ' . $announcement->title,
'message' => $announcement->description,
'user_id' => $student->user_id,
'school_id' => $schoolId,
'session_year_id' => $sessionYear->id,
'send_to' => 'Student'
));
}
} catch (\Exception $e) {
// Log the error but continue with other announcements
\Log::error('Error creating announcement: ' . $e->getMessage());
continue;
}
}
}
private function seedTimetable($schoolId)
{
$classSections = ClassSection::where('school_id', $schoolId)->get();
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$staff = Staff::where('school_id', $schoolId)->get();
$timeSlots = [
['start' => '08:00:00', 'end' => '08:45:00'],
['start' => '08:45:00', 'end' => '09:30:00'],
['start' => '09:30:00', 'end' => '10:15:00'],
['start' => '10:15:00', 'end' => '11:00:00'],
['start' => '11:30:00', 'end' => '12:15:00'],
['start' => '12:15:00', 'end' => '13:00:00'],
['start' => '13:00:00', 'end' => '13:45:00'],
];
foreach ($classSections as $classSection) {
$subjects = Subject::where('class_id', $classSection->class_id)->get();
for ($day = 1; $day <= 5; $day++) { // Monday to Friday
foreach ($timeSlots as $index => $timeSlot) {
// Skip one slot for break time
if ($index === 4) {
continue;
}
Timetable::create([
'class_section_id' => $classSection->id,
'subject_id' => $subjects->random()->id,
'staff_id' => $staff->random()->id,
'day' => $day,
'start_time' => $timeSlot['start'],
'end_time' => $timeSlot['end'],
'session_year_id' => $sessionYear->id,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
}
private function seedOnlineExams($schoolId)
{
$sessionYear = SessionYear::where('school_id', $schoolId)->where('default', 1)->first();
$classSections = ClassSection::where('school_id', $schoolId)->get();
foreach ($classSections as $classSection) {
$subjects = Subject::where('class_id', $classSection->class_id)->get();
foreach ($subjects as $subject) {
$exam = OnlineExam::create([
'name' => "Online Test - {$subject->name}",
'description' => "Online assessment for {$subject->name}",
'class_section_id' => $classSection->id,
'subject_id' => $subject->id,
'session_year_id' => $sessionYear->id,
'duration' => 60, // 60 minutes
'start_date' => now()->addDays(7),
'end_date' => now()->addDays(7)->addHours(24),
'total_marks' => 100,
'passing_marks' => 35,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
// Add questions
for ($i = 1; $i <= 10; $i++) {
DB::table('online_exam_questions')->insert([
'online_exam_id' => $exam->id,
'question' => "Question {$i} for {$subject->name}",
'options' => json_encode([
'option_1' => "Option 1 for question {$i}",
'option_2' => "Option 2 for question {$i}",
'option_3' => "Option 3 for question {$i}",
'option_4' => "Option 4 for question {$i}",
]),
'correct_answer' => 'option_' . $this->faker->numberBetween(1, 4),
'marks' => 10,
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
}
private function seedGallery($schoolId)
{
$categories = [
'Annual Day',
'Sports Day',
'Independence Day',
'Republic Day',
'Science Exhibition'
];
foreach ($categories as $category) {
$galleryId = DB::table('gallery')->insertGetId([
'title' => $category . ' Celebration',
'description' => "Photos from {$category} celebration",
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
// Add dummy image entries
for ($i = 1; $i <= 5; $i++) {
DB::table('gallery_images')->insert([
'gallery_id' => $galleryId,
'image_url' => "gallery/default{$i}.jpg",
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
}
private function seedCertificates($schoolId)
{
$certificateTypes = [
[
'name' => 'Transfer Certificate',
'template' => '<div class="certificate">
<h1>{SCHOOL_NAME}</h1>
<h2>Transfer Certificate</h2>
<p>This is to certify that {STUDENT_NAME} has successfully completed their education up to Class {CLASS_NAME} for the academic year {ACADEMIC_YEAR}.</p>
</div>'
],
[
'name' => 'Character Certificate',
'template' => '<div class="certificate">
<h1>{SCHOOL_NAME}</h1>
<h2>Character Certificate</h2>
<p>This is to certify that {STUDENT_NAME} of Class {CLASS_NAME} has maintained good character and discipline during their stay in the school.</p>
</div>'
],
[
'name' => 'Bonafide Certificate',
'template' => '<div class="certificate">
<h1>{SCHOOL_NAME}</h1>
<h2>Bonafide Certificate</h2>
<p>This is to certify that {STUDENT_NAME} is a bonafide student of our school studying in Class {CLASS_NAME} for the academic year {ACADEMIC_YEAR}.</p>
</div>'
]
];
foreach ($certificateTypes as $type) {
DB::table('certificate_templates')->insert([
'name' => $type['name'],
'template' => $type['template'],
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
private function seedSliders($schoolId)
{
$sliders = [
[
'title' => 'Welcome to Our School',
'image' => 'sliders/welcome.jpg',
'description' => 'Nurturing minds, building futures',
],
[
'title' => 'Academic Excellence',
'image' => 'sliders/academic.jpg',
'description' => 'Committed to academic excellence',
],
[
'title' => 'Sports Facilities',
'image' => 'sliders/sports.jpg',
'description' => 'State-of-the-art sports facilities',
],
[
'title' => 'Cultural Activities',
'image' => 'sliders/cultural.jpg',
'description' => 'Promoting cultural values',
],
];
foreach ($sliders as $slider) {
Slider::create(array_merge($slider, [
'school_id' => $schoolId,
'created_at' => now(),
'updated_at' => now(),
]));
}
}
private function seedLesson($schoolId)
{
try {
// Get required data
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
// Get school admin for tracking
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
throw new \Exception('School admin not found');
}
// Get all class sections for the school
$classSections = ClassSection::where('school_id', $schoolId)->get();
// For each class section, create sample lessons
foreach ($classSections as $classSection) {
// Get subjects for this class from the pivot table
$classSubjects = DB::table('class_subjects')
->where('class_id', $classSection->class_id)
->where('school_id', $schoolId)
->get();
foreach ($classSubjects as $classSubject) {
// Create lesson data
$lessonData = [
'name' => 'Sample Lesson - ' . $classSubject->subject_id,
'description' => 'This is a sample lesson for subject ID ' . $classSubject->subject_id,
'class_section_id' => $classSection->id,
'class_subject_id' => $classSubject->id,
'school_id' => $schoolId,
];
// Create or update the lesson
$lesson = Lesson::updateOrCreate(
[
'name' => $lessonData['name'],
'class_section_id' => $classSection->id,
'class_subject_id' => $classSubject->id,
'school_id' => $schoolId,
],
$lessonData
);
// Create lesson common data
LessonCommon::updateOrCreate(
[
'lesson_id' => $lesson->id,
'class_section_id' => $classSection->id,
'class_subject_id' => $classSubject->id,
]
);
// Get semester data
$semester = Semester::where('school_id', $schoolId)
->where('start_month', '<=', now()->month)
->where('end_month', '>=', now()->month)
->first();
// Store session year tracking
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\Lesson',
$lesson->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
$semester ? $semester->id : null
);
}
}
} catch (\Exception $e) {
$this->command->error('Error seeding lessons: ' . $e->getMessage());
throw $e;
}
}
private function seedLessonTopic($schoolId)
{
try {
// Get required data
$sessionYear = SessionYear::where('school_id', $schoolId)
->where('default', 1)
->first();
if (!$sessionYear) {
throw new \Exception('Default session year not found');
}
// Get school admin for tracking
$schoolAdmin = User::where('school_id', $schoolId)
->whereHas('roles', function($q) {
$q->where('name', 'School Admin');
})
->first();
if (!$schoolAdmin) {
throw new \Exception('School admin not found');
}
// Get all class sections for the school
$classSections = ClassSection::where('school_id', $schoolId)->get();
// For each class section, create sample lesson topics
foreach ($classSections as $classSection) {
// Get subjects for this class from the pivot table
$classSubjects = DB::table('class_subjects')
->where('class_id', $classSection->class_id)
->where('school_id', $schoolId)
->get();
foreach ($classSubjects as $classSubject) {
// First check if a lesson exists for this subject
$lesson = Lesson::where('class_subject_id', $classSubject->id)
->where('school_id', $schoolId)
->first();
if (!$lesson) {
continue; // Skip if no lesson exists
}
// Create lesson topic data
$lessonTopicData = [
'name' => 'Sample Topic - ' . $classSubject->subject_id,
'description' => 'This is a sample topic for subject ID ' . $classSubject->subject_id,
'lesson_id' => $lesson->id,
'school_id' => $schoolId,
];
// Create or update the lesson topic
$topic = LessonTopic::updateOrCreate(
[
'name' => $lessonTopicData['name'],
'lesson_id' => $lesson->id,
'school_id' => $schoolId,
],
$lessonTopicData
);
// Create or update topic common data
TopicCommon::updateOrCreate(
[
'lesson_topics_id' => $topic->id,
'class_section_id' => $classSection->id,
'class_subject_id' => $classSubject->id
]
);
// Get semester data
$semester = Semester::where('school_id', $schoolId)
->where('start_month', '<=', now()->month)
->where('end_month', '>=', now()->month)
->first();
// Store session year tracking
$this->sessionYearsTrackingsService->storeSessionYearsTracking(
'App\\Models\\LessonTopic',
$topic->id,
$schoolAdmin->id,
$sessionYear->id,
$schoolId,
$semester ? $semester->id : null
);
}
}
} catch (\Exception $e) {
$this->command->error('Error seeding lesson topics: ' . $e->getMessage());
throw $e;
}
}
}