+ */
+ public function definition(): array
+ {
+ return [
+ 'name' => fake()->name(),
+ 'email' => fake()->unique()->safeEmail(),
+ 'email_verified_at' => now(),
+ 'password' => static::$password ??= Hash::make('password'),
+ 'remember_token' => Str::random(10),
+ ];
+ }
+
+ /**
+ * Indicate that the model's email address should be unverified.
+ */
+ public function unverified(): static
+ {
+ return $this->state(fn (array $attributes) => [
+ 'email_verified_at' => null,
+ ]);
+ }
+}
diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php
new file mode 100644
index 0000000..05fb5d9
--- /dev/null
+++ b/database/migrations/0001_01_01_000000_create_users_table.php
@@ -0,0 +1,49 @@
+id();
+ $table->string('name');
+ $table->string('email')->unique();
+ $table->timestamp('email_verified_at')->nullable();
+ $table->string('password');
+ $table->rememberToken();
+ $table->timestamps();
+ });
+
+ Schema::create('password_reset_tokens', function (Blueprint $table) {
+ $table->string('email')->primary();
+ $table->string('token');
+ $table->timestamp('created_at')->nullable();
+ });
+
+ Schema::create('sessions', function (Blueprint $table) {
+ $table->string('id')->primary();
+ $table->foreignId('user_id')->nullable()->index();
+ $table->string('ip_address', 45)->nullable();
+ $table->text('user_agent')->nullable();
+ $table->longText('payload');
+ $table->integer('last_activity')->index();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('users');
+ Schema::dropIfExists('password_reset_tokens');
+ Schema::dropIfExists('sessions');
+ }
+};
diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php
new file mode 100644
index 0000000..ed758bd
--- /dev/null
+++ b/database/migrations/0001_01_01_000001_create_cache_table.php
@@ -0,0 +1,35 @@
+string('key')->primary();
+ $table->mediumText('value');
+ $table->integer('expiration')->index();
+ });
+
+ Schema::create('cache_locks', function (Blueprint $table) {
+ $table->string('key')->primary();
+ $table->string('owner');
+ $table->integer('expiration')->index();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('cache');
+ Schema::dropIfExists('cache_locks');
+ }
+};
diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php
new file mode 100644
index 0000000..425e705
--- /dev/null
+++ b/database/migrations/0001_01_01_000002_create_jobs_table.php
@@ -0,0 +1,57 @@
+id();
+ $table->string('queue')->index();
+ $table->longText('payload');
+ $table->unsignedTinyInteger('attempts');
+ $table->unsignedInteger('reserved_at')->nullable();
+ $table->unsignedInteger('available_at');
+ $table->unsignedInteger('created_at');
+ });
+
+ Schema::create('job_batches', function (Blueprint $table) {
+ $table->string('id')->primary();
+ $table->string('name');
+ $table->integer('total_jobs');
+ $table->integer('pending_jobs');
+ $table->integer('failed_jobs');
+ $table->longText('failed_job_ids');
+ $table->mediumText('options')->nullable();
+ $table->integer('cancelled_at')->nullable();
+ $table->integer('created_at');
+ $table->integer('finished_at')->nullable();
+ });
+
+ Schema::create('failed_jobs', function (Blueprint $table) {
+ $table->id();
+ $table->string('uuid')->unique();
+ $table->text('connection');
+ $table->text('queue');
+ $table->longText('payload');
+ $table->longText('exception');
+ $table->timestamp('failed_at')->useCurrent();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('jobs');
+ Schema::dropIfExists('job_batches');
+ Schema::dropIfExists('failed_jobs');
+ }
+};
diff --git a/database/migrations/2026_03_02_081826_create_permission_tables.php b/database/migrations/2026_03_02_081826_create_permission_tables.php
new file mode 100644
index 0000000..8986275
--- /dev/null
+++ b/database/migrations/2026_03_02_081826_create_permission_tables.php
@@ -0,0 +1,137 @@
+id(); // permission id
+ $table->string('name');
+ $table->string('guard_name');
+ $table->timestamps();
+
+ $table->unique(['name', 'guard_name']);
+ });
+
+ /**
+ * See `docs/prerequisites.md` for suggested lengths on 'name' and 'guard_name' if "1071 Specified key was too long" errors are encountered.
+ */
+ Schema::create($tableNames['roles'], static function (Blueprint $table) use ($teams, $columnNames) {
+ $table->id(); // role id
+ if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing
+ $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable();
+ $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index');
+ }
+ $table->string('name');
+ $table->string('guard_name');
+ $table->timestamps();
+ if ($teams || config('permission.testing')) {
+ $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']);
+ } else {
+ $table->unique(['name', 'guard_name']);
+ }
+ });
+
+ Schema::create($tableNames['model_has_permissions'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) {
+ $table->unsignedBigInteger($pivotPermission);
+
+ $table->string('model_type');
+ $table->unsignedBigInteger($columnNames['model_morph_key']);
+ $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index');
+
+ $table->foreign($pivotPermission)
+ ->references('id') // permission id
+ ->on($tableNames['permissions'])
+ ->cascadeOnDelete();
+ if ($teams) {
+ $table->unsignedBigInteger($columnNames['team_foreign_key']);
+ $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index');
+
+ $table->primary([$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_permissions_permission_model_type_primary');
+ } else {
+ $table->primary([$pivotPermission, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_permissions_permission_model_type_primary');
+ }
+ });
+
+ Schema::create($tableNames['model_has_roles'], static function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) {
+ $table->unsignedBigInteger($pivotRole);
+
+ $table->string('model_type');
+ $table->unsignedBigInteger($columnNames['model_morph_key']);
+ $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index');
+
+ $table->foreign($pivotRole)
+ ->references('id') // role id
+ ->on($tableNames['roles'])
+ ->cascadeOnDelete();
+ if ($teams) {
+ $table->unsignedBigInteger($columnNames['team_foreign_key']);
+ $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index');
+
+ $table->primary([$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_roles_role_model_type_primary');
+ } else {
+ $table->primary([$pivotRole, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_roles_role_model_type_primary');
+ }
+ });
+
+ Schema::create($tableNames['role_has_permissions'], static function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) {
+ $table->unsignedBigInteger($pivotPermission);
+ $table->unsignedBigInteger($pivotRole);
+
+ $table->foreign($pivotPermission)
+ ->references('id') // permission id
+ ->on($tableNames['permissions'])
+ ->cascadeOnDelete();
+
+ $table->foreign($pivotRole)
+ ->references('id') // role id
+ ->on($tableNames['roles'])
+ ->cascadeOnDelete();
+
+ $table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary');
+ });
+
+ app('cache')
+ ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null)
+ ->forget(config('permission.cache.key'));
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ $tableNames = config('permission.table_names');
+
+ throw_if(empty($tableNames), 'Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');
+
+ Schema::dropIfExists($tableNames['role_has_permissions']);
+ Schema::dropIfExists($tableNames['model_has_roles']);
+ Schema::dropIfExists($tableNames['model_has_permissions']);
+ Schema::dropIfExists($tableNames['roles']);
+ Schema::dropIfExists($tableNames['permissions']);
+ }
+};
diff --git a/database/migrations/2026_03_02_081827_create_activity_log_table.php b/database/migrations/2026_03_02_081827_create_activity_log_table.php
new file mode 100644
index 0000000..b788f65
--- /dev/null
+++ b/database/migrations/2026_03_02_081827_create_activity_log_table.php
@@ -0,0 +1,27 @@
+create(config('activitylog.table_name'), function (Blueprint $table) {
+ $table->bigIncrements('id');
+ $table->string('log_name')->nullable();
+ $table->text('description');
+ $table->nullableMorphs('subject', 'subject');
+ $table->nullableMorphs('causer', 'causer');
+ $table->json('properties')->nullable();
+ $table->timestamps();
+ $table->index('log_name');
+ });
+ }
+
+ public function down()
+ {
+ Schema::connection(config('activitylog.database_connection'))->dropIfExists(config('activitylog.table_name'));
+ }
+}
diff --git a/database/migrations/2026_03_02_081828_add_event_column_to_activity_log_table.php b/database/migrations/2026_03_02_081828_add_event_column_to_activity_log_table.php
new file mode 100644
index 0000000..78d9a0e
--- /dev/null
+++ b/database/migrations/2026_03_02_081828_add_event_column_to_activity_log_table.php
@@ -0,0 +1,22 @@
+table(config('activitylog.table_name'), function (Blueprint $table) {
+ $table->string('event')->nullable()->after('subject_type');
+ });
+ }
+
+ public function down()
+ {
+ Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) {
+ $table->dropColumn('event');
+ });
+ }
+}
diff --git a/database/migrations/2026_03_02_081829_add_batch_uuid_column_to_activity_log_table.php b/database/migrations/2026_03_02_081829_add_batch_uuid_column_to_activity_log_table.php
new file mode 100644
index 0000000..320ef5c
--- /dev/null
+++ b/database/migrations/2026_03_02_081829_add_batch_uuid_column_to_activity_log_table.php
@@ -0,0 +1,22 @@
+table(config('activitylog.table_name'), function (Blueprint $table) {
+ $table->uuid('batch_uuid')->nullable()->after('properties');
+ });
+ }
+
+ public function down()
+ {
+ Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) {
+ $table->dropColumn('batch_uuid');
+ });
+ }
+}
diff --git a/database/migrations/2026_03_02_081832_create_personal_access_tokens_table.php b/database/migrations/2026_03_02_081832_create_personal_access_tokens_table.php
new file mode 100644
index 0000000..40ff706
--- /dev/null
+++ b/database/migrations/2026_03_02_081832_create_personal_access_tokens_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->morphs('tokenable');
+ $table->text('name');
+ $table->string('token', 64)->unique();
+ $table->text('abilities')->nullable();
+ $table->timestamp('last_used_at')->nullable();
+ $table->timestamp('expires_at')->nullable()->index();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('personal_access_tokens');
+ }
+};
diff --git a/database/migrations/2026_03_02_090001_add_soft_deletes_to_users_table.php b/database/migrations/2026_03_02_090001_add_soft_deletes_to_users_table.php
new file mode 100644
index 0000000..a7bda58
--- /dev/null
+++ b/database/migrations/2026_03_02_090001_add_soft_deletes_to_users_table.php
@@ -0,0 +1,28 @@
+softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropSoftDeletes();
+ });
+ }
+};
diff --git a/database/migrations/2026_03_02_090002_create_categories_table.php b/database/migrations/2026_03_02_090002_create_categories_table.php
new file mode 100644
index 0000000..f91cc35
--- /dev/null
+++ b/database/migrations/2026_03_02_090002_create_categories_table.php
@@ -0,0 +1,34 @@
+id();
+ $table->string('slug')->unique();
+ $table->string('label');
+ $table->text('desc')->nullable();
+ $table->string('image')->nullable();
+ $table->string('meta_title')->nullable();
+ $table->text('meta_description')->nullable();
+ $table->timestamps();
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('categories');
+ }
+};
diff --git a/database/migrations/2026_03_02_090003_create_courses_table.php b/database/migrations/2026_03_02_090003_create_courses_table.php
new file mode 100644
index 0000000..b5f8edb
--- /dev/null
+++ b/database/migrations/2026_03_02_090003_create_courses_table.php
@@ -0,0 +1,44 @@
+id();
+ $table->foreignId('category_id')->constrained()->cascadeOnDelete();
+ $table->string('slug')->unique();
+ $table->string('title');
+ $table->string('sub')->nullable();
+ $table->text('desc');
+ $table->longText('long_desc');
+ $table->string('duration');
+ $table->unsignedInteger('students')->default(0);
+ $table->decimal('rating', 2, 1)->default(5.0);
+ $table->string('badge')->nullable();
+ $table->string('image')->nullable();
+ $table->string('price')->nullable();
+ $table->json('includes')->nullable();
+ $table->json('requirements')->nullable();
+ $table->string('meta_title')->nullable();
+ $table->text('meta_description')->nullable();
+ $table->timestamps();
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('courses');
+ }
+};
diff --git a/database/migrations/2026_03_02_090004_create_course_schedules_table.php b/database/migrations/2026_03_02_090004_create_course_schedules_table.php
new file mode 100644
index 0000000..a5f1121
--- /dev/null
+++ b/database/migrations/2026_03_02_090004_create_course_schedules_table.php
@@ -0,0 +1,34 @@
+id();
+ $table->foreignId('course_id')->constrained()->cascadeOnDelete();
+ $table->date('start_date');
+ $table->date('end_date');
+ $table->string('location');
+ $table->unsignedInteger('quota');
+ $table->unsignedInteger('available_seats');
+ $table->boolean('is_urgent')->default(false);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('course_schedules');
+ }
+};
diff --git a/database/migrations/2026_03_02_090005_create_announcements_table.php b/database/migrations/2026_03_02_090005_create_announcements_table.php
new file mode 100644
index 0000000..8adaef7
--- /dev/null
+++ b/database/migrations/2026_03_02_090005_create_announcements_table.php
@@ -0,0 +1,37 @@
+id();
+ $table->string('slug')->unique();
+ $table->string('title');
+ $table->string('category');
+ $table->text('excerpt');
+ $table->longText('content');
+ $table->string('image')->nullable();
+ $table->boolean('is_featured')->default(false);
+ $table->string('meta_title')->nullable();
+ $table->text('meta_description')->nullable();
+ $table->timestamp('published_at')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('announcements');
+ }
+};
diff --git a/database/migrations/2026_03_02_090006_create_hero_slides_table.php b/database/migrations/2026_03_02_090006_create_hero_slides_table.php
new file mode 100644
index 0000000..2a48e20
--- /dev/null
+++ b/database/migrations/2026_03_02_090006_create_hero_slides_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->string('label');
+ $table->string('title');
+ $table->text('description');
+ $table->string('image')->nullable();
+ $table->unsignedInteger('order')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('hero_slides');
+ }
+};
diff --git a/database/migrations/2026_03_02_090007_create_leads_table.php b/database/migrations/2026_03_02_090007_create_leads_table.php
new file mode 100644
index 0000000..c59cfb3
--- /dev/null
+++ b/database/migrations/2026_03_02_090007_create_leads_table.php
@@ -0,0 +1,41 @@
+id();
+ $table->string('name');
+ $table->string('phone');
+ $table->string('target_course')->nullable();
+ $table->string('education_level')->nullable();
+ $table->string('subject')->nullable();
+ $table->text('message')->nullable();
+ $table->string('status')->default('new');
+ $table->text('notes')->nullable();
+ $table->boolean('is_read')->default(false);
+ $table->string('source');
+ $table->json('utm')->nullable();
+ $table->boolean('consent_kvkk')->default(false);
+ $table->string('consent_text_version')->nullable();
+ $table->timestamps();
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('leads');
+ }
+};
diff --git a/database/migrations/2026_03_02_090008_create_menus_table.php b/database/migrations/2026_03_02_090008_create_menus_table.php
new file mode 100644
index 0000000..f32d024
--- /dev/null
+++ b/database/migrations/2026_03_02_090008_create_menus_table.php
@@ -0,0 +1,36 @@
+id();
+ $table->string('location');
+ $table->string('label');
+ $table->string('url');
+ $table->string('type')->default('link');
+ $table->unsignedBigInteger('parent_id')->nullable();
+ $table->unsignedInteger('order')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+
+ $table->foreign('parent_id')->references('id')->on('menus')->nullOnDelete();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('menus');
+ }
+};
diff --git a/database/migrations/2026_03_02_090009_create_comments_table.php b/database/migrations/2026_03_02_090009_create_comments_table.php
new file mode 100644
index 0000000..9b1adab
--- /dev/null
+++ b/database/migrations/2026_03_02_090009_create_comments_table.php
@@ -0,0 +1,34 @@
+id();
+ $table->morphs('commentable');
+ $table->string('name_surname');
+ $table->string('phone');
+ $table->text('body');
+ $table->text('admin_reply')->nullable();
+ $table->boolean('is_approved')->default(false);
+ $table->timestamps();
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('comments');
+ }
+};
diff --git a/database/migrations/2026_03_02_090010_create_faqs_table.php b/database/migrations/2026_03_02_090010_create_faqs_table.php
new file mode 100644
index 0000000..bcc192a
--- /dev/null
+++ b/database/migrations/2026_03_02_090010_create_faqs_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->string('category');
+ $table->text('question');
+ $table->text('answer');
+ $table->unsignedInteger('order')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('faqs');
+ }
+};
diff --git a/database/migrations/2026_03_02_090011_create_guide_cards_table.php b/database/migrations/2026_03_02_090011_create_guide_cards_table.php
new file mode 100644
index 0000000..b022f85
--- /dev/null
+++ b/database/migrations/2026_03_02_090011_create_guide_cards_table.php
@@ -0,0 +1,34 @@
+id();
+ $table->string('title');
+ $table->text('description');
+ $table->string('icon');
+ $table->string('color');
+ $table->string('link');
+ $table->unsignedInteger('order')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('guide_cards');
+ }
+};
diff --git a/database/migrations/2026_03_02_090012_create_settings_table.php b/database/migrations/2026_03_02_090012_create_settings_table.php
new file mode 100644
index 0000000..849058d
--- /dev/null
+++ b/database/migrations/2026_03_02_090012_create_settings_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->string('group');
+ $table->string('key')->unique();
+ $table->text('value')->nullable();
+ $table->string('type')->default('text');
+ $table->boolean('is_public')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('settings');
+ }
+};
diff --git a/database/migrations/2026_03_02_090013_create_pages_table.php b/database/migrations/2026_03_02_090013_create_pages_table.php
new file mode 100644
index 0000000..d679ff5
--- /dev/null
+++ b/database/migrations/2026_03_02_090013_create_pages_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->string('slug')->unique();
+ $table->string('title');
+ $table->string('meta_title')->nullable();
+ $table->text('meta_description')->nullable();
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('pages');
+ }
+};
diff --git a/database/migrations/2026_03_02_090014_create_page_blocks_table.php b/database/migrations/2026_03_02_090014_create_page_blocks_table.php
new file mode 100644
index 0000000..c5e3889
--- /dev/null
+++ b/database/migrations/2026_03_02_090014_create_page_blocks_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->foreignId('page_id')->constrained()->cascadeOnDelete();
+ $table->string('type');
+ $table->json('content')->nullable();
+ $table->unsignedInteger('order_index')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('page_blocks');
+ }
+};
diff --git a/database/migrations/2026_03_10_070801_add_scope_standard_language_location_to_courses_table.php b/database/migrations/2026_03_10_070801_add_scope_standard_language_location_to_courses_table.php
new file mode 100644
index 0000000..4830300
--- /dev/null
+++ b/database/migrations/2026_03_10_070801_add_scope_standard_language_location_to_courses_table.php
@@ -0,0 +1,31 @@
+json('scope')->nullable()->after('meta_description');
+ $table->string('standard')->nullable()->after('scope');
+ $table->string('language')->nullable()->default('Türkçe')->after('standard');
+ $table->string('location')->nullable()->after('language');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('courses', function (Blueprint $table) {
+ $table->dropColumn(['scope', 'standard', 'language', 'location']);
+ });
+ }
+};
diff --git a/database/migrations/2026_03_15_105759_add_menu_order_to_courses_table.php b/database/migrations/2026_03_15_105759_add_menu_order_to_courses_table.php
new file mode 100644
index 0000000..f87a519
--- /dev/null
+++ b/database/migrations/2026_03_15_105759_add_menu_order_to_courses_table.php
@@ -0,0 +1,27 @@
+unsignedTinyInteger('menu_order')->nullable()->after('badge');
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::table('courses', function (Blueprint $table) {
+ $table->dropColumn('menu_order');
+ });
+ }
+};
diff --git a/database/migrations/2026_03_17_175316_add_label_and_order_index_to_settings_table.php b/database/migrations/2026_03_17_175316_add_label_and_order_index_to_settings_table.php
new file mode 100644
index 0000000..ee75f9d
--- /dev/null
+++ b/database/migrations/2026_03_17_175316_add_label_and_order_index_to_settings_table.php
@@ -0,0 +1,35 @@
+string('label', 150)->nullable()->after('type');
+ $table->integer('order_index')->default(0)->after('label');
+
+ // Replace unique key constraint to (group, key) combo
+ $table->dropUnique(['key']);
+ $table->unique(['group', 'key']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('settings', function (Blueprint $table) {
+ $table->dropUnique(['group', 'key']);
+ $table->unique('key');
+ $table->dropColumn(['label', 'order_index']);
+ });
+ }
+};
diff --git a/database/migrations/2026_03_18_094702_create_course_blocks_table.php b/database/migrations/2026_03_18_094702_create_course_blocks_table.php
new file mode 100644
index 0000000..388b33f
--- /dev/null
+++ b/database/migrations/2026_03_18_094702_create_course_blocks_table.php
@@ -0,0 +1,32 @@
+id();
+ $table->foreignId('course_id')->constrained()->cascadeOnDelete();
+ $table->string('type', 50);
+ $table->json('content')->nullable();
+ $table->unsignedInteger('order_index')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('course_blocks');
+ }
+};
diff --git a/database/migrations/2026_03_24_070634_add_email_and_marketing_consent_to_leads_table.php b/database/migrations/2026_03_24_070634_add_email_and_marketing_consent_to_leads_table.php
new file mode 100644
index 0000000..8e9e302
--- /dev/null
+++ b/database/migrations/2026_03_24_070634_add_email_and_marketing_consent_to_leads_table.php
@@ -0,0 +1,29 @@
+string('email')->nullable()->after('phone');
+ $table->boolean('marketing_consent')->default(false)->after('consent_kvkk');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('leads', function (Blueprint $table) {
+ $table->dropColumn(['email', 'marketing_consent']);
+ });
+ }
+};
diff --git a/database/migrations/2026_03_24_095911_rename_order_to_order_index_on_faqs_and_hero_slides.php b/database/migrations/2026_03_24_095911_rename_order_to_order_index_on_faqs_and_hero_slides.php
new file mode 100644
index 0000000..39159f8
--- /dev/null
+++ b/database/migrations/2026_03_24_095911_rename_order_to_order_index_on_faqs_and_hero_slides.php
@@ -0,0 +1,36 @@
+renameColumn('order', 'order_index');
+ });
+
+ Schema::table('hero_slides', function (Blueprint $table) {
+ $table->renameColumn('order', 'order_index');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('faqs', function (Blueprint $table) {
+ $table->renameColumn('order_index', 'order');
+ });
+
+ Schema::table('hero_slides', function (Blueprint $table) {
+ $table->renameColumn('order_index', 'order');
+ });
+ }
+};
diff --git a/database/migrations/2026_03_24_110525_create_stories_table.php b/database/migrations/2026_03_24_110525_create_stories_table.php
new file mode 100644
index 0000000..416a9fe
--- /dev/null
+++ b/database/migrations/2026_03_24_110525_create_stories_table.php
@@ -0,0 +1,35 @@
+id();
+ $table->string('title');
+ $table->string('badge')->nullable();
+ $table->text('content');
+ $table->string('image')->nullable();
+ $table->string('cta_text')->nullable();
+ $table->string('cta_url')->nullable();
+ $table->unsignedSmallInteger('order_index')->default(0);
+ $table->boolean('is_active')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('stories');
+ }
+};
diff --git a/database/migrations/2026_03_25_180508_add_extended_fields_to_course_schedules_table.php b/database/migrations/2026_03_25_180508_add_extended_fields_to_course_schedules_table.php
new file mode 100644
index 0000000..9c6424b
--- /dev/null
+++ b/database/migrations/2026_03_25_180508_add_extended_fields_to_course_schedules_table.php
@@ -0,0 +1,32 @@
+string('instructor')->nullable()->after('location');
+ $table->unsignedInteger('enrolled_count')->default(0)->after('available_seats');
+ $table->decimal('price_override', 10, 2)->nullable()->after('enrolled_count');
+ $table->string('status')->default('planned')->after('price_override');
+ $table->text('notes')->nullable()->after('is_urgent');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('course_schedules', function (Blueprint $table) {
+ $table->dropColumn(['instructor', 'enrolled_count', 'price_override', 'status', 'notes']);
+ });
+ }
+};
diff --git a/database/migrations/2026_03_25_193512_add_media_type_fields_to_hero_slides_table.php b/database/migrations/2026_03_25_193512_add_media_type_fields_to_hero_slides_table.php
new file mode 100644
index 0000000..69e56c9
--- /dev/null
+++ b/database/migrations/2026_03_25_193512_add_media_type_fields_to_hero_slides_table.php
@@ -0,0 +1,32 @@
+string('media_type')->default('image')->after('description');
+ $table->string('video_url')->nullable()->after('image');
+ $table->string('mobile_image')->nullable()->after('video_url');
+ $table->string('button_text')->nullable()->after('mobile_image');
+ $table->string('button_url')->nullable()->after('button_text');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('hero_slides', function (Blueprint $table) {
+ $table->dropColumn(['media_type', 'video_url', 'mobile_image', 'button_text', 'button_url']);
+ });
+ }
+};
diff --git a/database/migrations/2026_03_26_063014_add_mobile_video_url_to_hero_slides_table.php b/database/migrations/2026_03_26_063014_add_mobile_video_url_to_hero_slides_table.php
new file mode 100644
index 0000000..5cf849f
--- /dev/null
+++ b/database/migrations/2026_03_26_063014_add_mobile_video_url_to_hero_slides_table.php
@@ -0,0 +1,28 @@
+string('mobile_video_url')->nullable()->after('video_url');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('hero_slides', function (Blueprint $table) {
+ $table->dropColumn('mobile_video_url');
+ });
+ }
+};
diff --git a/database/seeders/AdminUserSeeder.php b/database/seeders/AdminUserSeeder.php
new file mode 100644
index 0000000..6bfc33d
--- /dev/null
+++ b/database/seeders/AdminUserSeeder.php
@@ -0,0 +1,27 @@
+firstOrCreate(
+ ['email' => 'admin@bogazicidenizcilik.com.tr'],
+ [
+ 'name' => 'Super Admin',
+ 'password' => Hash::make('password'),
+ 'email_verified_at' => now(),
+ ]
+ );
+
+ $admin->assignRole('super-admin');
+ }
+}
diff --git a/database/seeders/AnnouncementSeeder.php b/database/seeders/AnnouncementSeeder.php
new file mode 100644
index 0000000..bf37346
--- /dev/null
+++ b/database/seeders/AnnouncementSeeder.php
@@ -0,0 +1,94 @@
+truncate();
+
+ $announcements = [
+ [
+ 'slug' => '2026-bahar-donemi-kayitlari-basladi',
+ 'title' => '2026 Bahar Dönemi Kayıtları Başladı',
+ 'category' => 'announcement',
+ 'excerpt' => 'Bahar dönemi eğitim programlarımıza kayıtlar başlamıştır. Kontenjanlarımız sınırlı olduğundan erken kayıt yaptırmanızı tavsiye ederiz.',
+ 'content' => "Bahar dönemi eğitim programlarımıza kayıtlar başlamıştır. Yeni dönemde hem yüz yüze hem de online eğitim seçeneklerimizle denizcilik kariyerinize hız kesmeden devam edebilir, eksik belgelerinizi tamamlayabilirsiniz.\n\n- Tüm eğitim başlıklarımızda %10 erken kayıt avantajı sunulmaktadır.\n- Kesin kayıt esnasında istenilen evrak listesini detay inceleyiniz.\n- Kontenjanlar dolmadan yerinizi ayırtmayı unutmayın.",
+ 'image' => null,
+ 'is_featured' => true,
+ 'meta_title' => '2026 Bahar Dönemi Kayıtları Başladı | Boğaziçi Denizcilik',
+ 'meta_description' => 'Bahar dönemi eğitim programlarımıza kayıtlar başlamıştır. %10 erken kayıt avantajı için hemen başvurun.',
+ 'published_at' => '2026-02-15 09:00:00',
+ ],
+ [
+ 'slug' => 'imo-standartlari-guncellemesi',
+ 'title' => 'IMO Standartları Güncellemesi',
+ 'category' => 'news',
+ 'excerpt' => 'Uluslararası Denizcilik Örgütü\'nün (IMO) 2026 standart güncellemeleri eğitim programlarımıza yansıtıldı.',
+ 'content' => "Dünya çapında uygulanan denizcilik standartları, IMO (Uluslararası Denizcilik Örgütü) tarafından periyodik olarak güncellenmektedir. 2026 yılı için duyurulan yeni yönetmeliklere uygun olacak şekilde müfredatlarımız Ulaştırma ve Altyapı Bakanlığı onayıyla revize edilmiştir.\n\nYeni standartlarla birlikte güvenlik ve çevre alanındaki konularda eğitime ayrılan süre artırılmış olup, simülatör kullanımında gerçekçilik senaryoları çeşitlendirilmiştir.",
+ 'image' => null,
+ 'is_featured' => false,
+ 'meta_title' => 'IMO 2026 Standartları Güncellemesi | Boğaziçi Denizcilik',
+ 'meta_description' => 'IMO 2026 standart güncellemeleri eğitim programlarımıza yansıtıldı. Güncel müfredat hakkında bilgi alın.',
+ 'published_at' => '2026-02-12 09:00:00',
+ ],
+ [
+ 'slug' => 'denizcilik-kariyer-fuari-2026',
+ 'title' => 'Denizcilik Kariyer Fuarı 2026',
+ 'category' => 'event',
+ 'excerpt' => 'İstanbul\'da düzenlenecek Kariyer Fuarı\'nda 40\'tan fazla firma stant açacak. Öğrencilerimize ücretsiz giriş.',
+ 'content' => "Kariyer yolculuğunuzda önemli bir kilometre taşı olan Denizcilik Kariyer Fuarı, bu yıl da sektörün öncü firmalarını öğrencilerimiz ve mezunlarımızla buluşturuyor.\n\nEtkinlik kapsamında uzman konuşmacılarla düzenlenecek panellere katılabilir, mülakat simülasyonlarıyla kendinizi sınayabilirsiniz. Boğaziçi Denizcilik kursiyerlerine özel ücretsiz giriş imkanından faydalanmak için öğrenci işleri birimimizle iletişime geçiniz.",
+ 'image' => null,
+ 'is_featured' => false,
+ 'meta_title' => 'Denizcilik Kariyer Fuarı 2026 | Boğaziçi Denizcilik',
+ 'meta_description' => 'Denizcilik Kariyer Fuarı 2026\'da 40\'tan fazla firma ile buluşun. Öğrencilerimize ücretsiz giriş.',
+ 'published_at' => '2026-02-05 09:00:00',
+ ],
+ [
+ 'slug' => 'mezunlarimiz-uluslararasi-yarismada-birinci',
+ 'title' => 'Mezunlarımız Uluslararası Yarışmada 1. Oldu',
+ 'category' => 'news',
+ 'excerpt' => 'Öğrencilerimiz Avrupa Denizcilik Simülasyon Yarışması\'nda birinci olarak Türkiye\'yi temsil etti.',
+ 'content' => "Kurumumuz eğitimlerini başarıyla tamamlayan 3 mezunumuzdan oluşan Türkiye ekibi, Hollanda'da düzenlenen Avrupa Denizcilik Simülasyon Yarışması'nda (E-Sea Challenge 2026) kriz yönetimi ve yanaşma-kalkma operasyonlarındaki takım çalışmalarıyla 1. oldu.\n\nGeleceğin denizcilerini yetiştirmekten gurur duyuyor, başarılarının devamını diliyoruz.",
+ 'image' => null,
+ 'is_featured' => false,
+ 'meta_title' => 'Mezunlarımız Uluslararası Yarışmada 1. Oldu | Boğaziçi Denizcilik',
+ 'meta_description' => 'Boğaziçi Denizcilik mezunları Avrupa Denizcilik Simülasyon Yarışması\'nda Türkiye\'yi birinci sıraya taşıdı.',
+ 'published_at' => '2026-01-28 09:00:00',
+ ],
+ [
+ 'slug' => 'yeni-simulasyon-sistemimiz-hizmete-girdi',
+ 'title' => 'Yeni Simülasyon Sistemimiz Hizmete Girdi',
+ 'category' => 'news',
+ 'excerpt' => 'En son teknoloji deniz simülatörlerimiz ile gerçek deniz koşullarında eğitim imkânı sunuyoruz.',
+ 'content' => 'Eğitim kalitemizi her geçen gün arttırmak amacıyla köprüüstü vizyon simülatör sistemimizi yeniledik. 4K panoramik görüntü sağlayan yeni cihazlarımız ile 30 farklı limana ve 20 farklı gemi modeline erişimimiz bulunmaktadır. Öğrencilerimiz, acil durum senaryolarını sıfır risk ile deneyimleme şansı bulmaktadır.',
+ 'image' => null,
+ 'is_featured' => false,
+ 'meta_title' => 'Yeni Simülasyon Sistemimiz Hizmete Girdi | Boğaziçi Denizcilik',
+ 'meta_description' => '4K panoramik köprüüstü simülatörümüz ile gerçek deniz koşullarında eğitim alın. 30 liman, 20 gemi modeli.',
+ 'published_at' => '2026-01-20 09:00:00',
+ ],
+ [
+ 'slug' => 'online-egitim-platformumuz-yenilendi',
+ 'title' => 'Online Eğitim Platformumuz Yenilendi',
+ 'category' => 'announcement',
+ 'excerpt' => 'Kullanıcı deneyimini iyileştiren yeni online eğitim platformumuz aktif olmuştur.',
+ 'content' => 'Özellikle yenileme eğitimlerinde sıkça kullandığımız online uzaktan eğitim platformumuzu güncelledik. İnteraktif eğitim materyalleri, hızlı canlı yayın sistemi ve mobil uyumlu arayüzü ile dilediğiniz yerden eğitimlerinize daha rahat bir şekilde katılabileceksiniz. Kursiyerlerimiz şifrelerini güncelleyerek sisteme giriş yapabilir.',
+ 'image' => null,
+ 'is_featured' => false,
+ 'meta_title' => 'Online Eğitim Platformumuz Yenilendi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Yenilenen online eğitim platformumuz ile uzaktan eğitimlerinize mobil ve masaüstünden kolayca katılın.',
+ 'published_at' => '2026-01-10 09:00:00',
+ ],
+ ];
+
+ DB::table('announcements')->insert(array_map(fn ($a) => array_merge($a, [
+ 'created_at' => now(),
+ 'updated_at' => now(),
+ ]), $announcements));
+ }
+}
diff --git a/database/seeders/CategorySeeder.php b/database/seeders/CategorySeeder.php
new file mode 100644
index 0000000..89f3200
--- /dev/null
+++ b/database/seeders/CategorySeeder.php
@@ -0,0 +1,73 @@
+ 'guverte',
+ 'label' => 'Güverte Eğitimleri',
+ 'desc' => 'Seyir, köprüüstü operasyonu, ARPA/ECDIS simülatör eğitimleri',
+ 'image' => null,
+ 'meta_title' => 'Güverte Eğitimleri | Boğaziçi Denizcilik',
+ 'meta_description' => 'Seyir, köprüüstü operasyonu, ARPA/ECDIS simülatör eğitimleri. Boğaziçi Denizcilik Eğitim Kurumu.',
+ ],
+ [
+ 'slug' => 'stcw',
+ 'label' => 'STCW Eğitimleri',
+ 'desc' => 'Zorunlu emniyet, yangın söndürme ve ilkyardım sertifikaları',
+ 'image' => null,
+ 'meta_title' => 'STCW Eğitimleri | Boğaziçi Denizcilik',
+ 'meta_description' => 'Zorunlu emniyet, yangın söndürme ve ilkyardım STCW sertifika programları. IMO onaylı eğitimler.',
+ ],
+ [
+ 'slug' => 'makine',
+ 'label' => 'Makine Eğitimleri',
+ 'desc' => 'Dizel motor, elektrik sistemleri ve makine dairesi operasyonu',
+ 'image' => null,
+ 'meta_title' => 'Makine Eğitimleri | Boğaziçi Denizcilik',
+ 'meta_description' => 'Dizel motor, elektrik sistemleri ve makine dairesi operasyonu eğitimleri. STCW uyumlu programlar.',
+ ],
+ [
+ 'slug' => 'yat-kaptanligi',
+ 'label' => 'Yat Kaptanlığı',
+ 'desc' => 'Tüm tonaj basamaklarında kaptan yeterlik',
+ 'image' => null,
+ 'meta_title' => 'Yat Kaptanlığı Eğitimleri | Boğaziçi Denizcilik',
+ 'meta_description' => '25 GT, 149 GT, 499 GT ve 3000 GT yat kaptanlığı yeterlik programları. Türkiye\'nin lider denizcilik okulu.',
+ ],
+ [
+ 'slug' => 'yenileme',
+ 'label' => 'Yenileme Eğitimleri',
+ 'desc' => 'Süresi dolan sertifikalar için kısa güncelleme programları',
+ 'image' => null,
+ 'meta_title' => 'Yenileme Eğitimleri | Boğaziçi Denizcilik',
+ 'meta_description' => 'Süresi dolan denizcilik sertifikalarınız için kısa süreli güncelleme ve yenileme eğitimleri.',
+ ],
+ [
+ 'slug' => 'guvenlik',
+ 'label' => 'Güvenlik (ISPS)',
+ 'desc' => 'Gemi ve liman güvenlik görevi sertifikaları',
+ 'image' => null,
+ 'meta_title' => 'Güvenlik (ISPS) Eğitimleri | Boğaziçi Denizcilik',
+ 'meta_description' => 'ISPS Kod kapsamında gemi ve liman güvenlik görevi sertifikaları. Uluslararası geçerliliğe sahip programlar.',
+ ],
+ ];
+
+ foreach ($categories as $category) {
+ DB::table('categories')->updateOrInsert(
+ ['slug' => $category['slug']],
+ array_merge($category, [
+ 'created_at' => now(),
+ 'updated_at' => now(),
+ ])
+ );
+ }
+ }
+}
diff --git a/database/seeders/CorporatePagesSeeder.php b/database/seeders/CorporatePagesSeeder.php
new file mode 100644
index 0000000..c15d64e
--- /dev/null
+++ b/database/seeders/CorporatePagesSeeder.php
@@ -0,0 +1,250 @@
+seedKalitePolitikasi();
+ $this->seedHakkimizda();
+ $this->seedVizyonMisyon();
+ }
+
+ private function seedKalitePolitikasi(): void
+ {
+ $page = Page::firstOrCreate(
+ ['slug' => 'kalite-politikasi'],
+ [
+ 'title' => 'Kalite Politikamız',
+ 'meta_title' => 'Kalite Politikamız | Boğaziçi Denizcilik – ISO 9001:2015 Sertifikalı Eğitim',
+ 'meta_description' => 'Boğaziçi Denizcilik Eğitim Kurumu kalite politikası. ISO 9001:2015 sertifikalı, STCW yetkili, MET akredite denizcilik eğitim kurumu.',
+ 'is_active' => true,
+ ],
+ );
+
+ $blocks = [
+ [
+ 'order_index' => 0,
+ 'type' => 'hero',
+ 'content' => [
+ 'breadcrumb' => 'Kurumsal|/kurumsal / Kalite Politikamız',
+ 'title' => "Kalite Bir Hedef Değil,\nBir Standart",
+ 'highlight' => 'Bir Standart',
+ 'description' => 'ISO 9001:2015 sertifikalı Kalite Yönetim Sistemimiz ile her süreçte mükemmelliği güvence altına alıyoruz.',
+ ],
+ ],
+ [
+ 'order_index' => 1,
+ 'type' => 'cards',
+ 'content' => [
+ 'label' => 'AKREDİTASYONLAR',
+ 'title' => 'Sertifika & Belgelerimiz',
+ 'card_1_title' => 'ISO 9001:2015',
+ 'card_1_desc' => 'Kalite Yönetim Sistemi',
+ 'card_1_text' => "Türk Loydu · 2019'den beri",
+ 'card_1_icon' => 'award',
+ 'card_2_title' => 'STCW Yetki Belgesi',
+ 'card_2_desc' => 'Denizci Eğitim Kurumu Akreditasyonu',
+ 'card_2_text' => "UAB Denizcilik Genel Müdürlüğü · 2020'den beri",
+ 'card_2_icon' => 'shield',
+ 'card_3_title' => 'MET Akreditasyonu',
+ 'card_3_desc' => 'Uluslararası Denizcilik Eğitimi',
+ 'card_3_text' => "IMO Denizcilik Eğitim Standartları · 2021'den beri",
+ 'card_3_icon' => 'globe',
+ ],
+ ],
+ [
+ 'order_index' => 2,
+ 'type' => 'text',
+ 'content' => [
+ '_width' => 'half',
+ 'label' => 'KALİTE İLKELERİ',
+ 'title' => 'Taahhütlerimiz',
+ 'body' => 'UAB ve IMO standartlarına tam uyumluluk STCW Sözleşmesi müfredat gerekliliklerinin eksiksiz karşılanması Eğitim kadrosunun denizcilik sektöründe aktif tecrübeye sahip olması Simülatör ve laboratuvar ekipmanlarının güncel tutulması Kursiyer memnuniyet oranının %95 üzerinde sürdürülmesi Mezun istihdam takibi ve sektörel geri bildirim analizi İç ve dış denetim bulgularına göre sürekli iyileştirme Eğitim materyallerinin yıllık güncellenmesi ',
+ ],
+ ],
+ [
+ 'order_index' => 3,
+ 'type' => 'stats_grid',
+ 'content' => [
+ '_width' => 'half',
+ 'label' => 'KALİTE DÖNGÜSÜ',
+ 'title' => 'PDCA Yaklaşımı',
+ 'stat_1_value' => '01',
+ 'stat_1_label' => 'Planlama — Yıllık kalite hedefleri ve iyileştirme planı oluşturulur.',
+ 'stat_2_value' => '02',
+ 'stat_2_label' => 'Uygulama — Planlar eğitim programlarına ve süreçlere entegre edilir.',
+ 'stat_3_value' => '03',
+ 'stat_3_label' => 'İzleme — Performans göstergeleri ve öğrenci memnuniyeti ölçülür.',
+ 'stat_4_value' => '04',
+ 'stat_4_label' => 'İyileştirme — Bulgular analiz edilerek sisteme geri besleme yapılır.',
+ 'note' => 'Bu döngü her yıl sistematik olarak tekrar edilir.',
+ ],
+ ],
+ ];
+
+ $this->syncBlocks($page, $blocks);
+ }
+
+ private function seedHakkimizda(): void
+ {
+ $page = Page::firstOrCreate(
+ ['slug' => 'hakkimizda'],
+ [
+ 'title' => 'Hakkımızda',
+ 'meta_title' => 'Hakkımızda | Boğaziçi Denizcilik – 25 Yıllık Deneyim',
+ 'meta_description' => "1998'den bu yana 15.000+ denizci yetiştiren Boğaziçi Denizcilik Eğitim Kurumu hakkında bilgi alın.",
+ 'is_active' => true,
+ ],
+ );
+
+ $blocks = [
+ [
+ 'order_index' => 0,
+ 'type' => 'hero',
+ 'content' => [
+ 'breadcrumb' => 'Kurumsal|/kurumsal / Hakkımızda',
+ 'title' => "Türkiye'nin Köklü\nDenizcilik Okulu",
+ 'highlight' => 'Denizcilik Okulu',
+ 'description' => "1998'den bu yana 15.000'den fazla denizciyi uluslararası geçerli sertifikalarla donatıyoruz.",
+ ],
+ ],
+ [
+ 'order_index' => 1,
+ 'type' => 'stats_grid',
+ 'content' => [
+ 'style' => 'dark',
+ 'stat_1_value' => '1998',
+ 'stat_1_label' => 'Kuruluş Yılı',
+ 'stat_2_value' => '25+',
+ 'stat_2_label' => 'Yıllık Tecrübe',
+ 'stat_3_value' => '15.000+',
+ 'stat_3_label' => 'Mezun Sayısı',
+ 'stat_4_value' => '%98',
+ 'stat_4_label' => 'Başarı Oranı',
+ ],
+ ],
+ [
+ 'order_index' => 2,
+ 'type' => 'text_image',
+ 'content' => [
+ 'label' => 'HİKAYEMİZ',
+ 'title' => '25 Yılı Aşkın Deneyim ve Güven',
+ 'body' => "Boğaziçi Denizcilik Eğitim Kurumu, 1998 yılında Kaptan Ahmet Yıldız tarafından İstanbul Kadıköy'de kurulmuştur. Ulaştırma ve Altyapı Bakanlığı (UAB) tarafından yetkilendirilmiş kurumumuz, STCW Sözleşmesi'nin gerektirdiği tüm zorunlu eğitimleri vermektedir.
Kuruluşumuzdan bu yana 15.000'i aşkın denizciyi sektöre kazandırdık. Mezunlarımız; Türk Deniz Kuvvetleri, MSC, CMA CGM, Maersk ve Türkiye'nin önde gelen denizcilik şirketlerinde aktif olarak görev yapmaktadır.
Eğitim merkezimiz; tam donanımlı köprüüstü simülatörü, ARPA/Radar eğitim istasyonları, ECDIS terminalleri, GMDSS telsiz laboratuvarı ve yangın tatbikat alanıyla donatılmıştır.
",
+ 'image' => 'h3.jpg',
+ 'image_alt' => 'Boğaziçi Denizcilik Eğitim Kurumu',
+ 'image_position' => 'right',
+ ],
+ ],
+ ];
+
+ $this->syncBlocks($page, $blocks);
+ }
+
+ private function seedVizyonMisyon(): void
+ {
+ $page = Page::firstOrCreate(
+ ['slug' => 'vizyon-misyon'],
+ [
+ 'title' => 'Vizyon ve Misyon',
+ 'meta_title' => 'Vizyon ve Misyon | Boğaziçi Denizcilik',
+ 'meta_description' => "Boğaziçi Denizcilik Eğitim Kurumu'nun vizyonu, misyonu ve temel değerleri.",
+ 'is_active' => true,
+ ],
+ );
+
+ $blocks = [
+ [
+ 'order_index' => 0,
+ 'type' => 'hero',
+ 'content' => [
+ 'breadcrumb' => 'Kurumsal|/kurumsal / Vizyon ve Misyon',
+ 'title' => "Nereye Gidiyoruz,\nNeden Buradayız?",
+ 'highlight' => 'Neden Buradayız?',
+ 'description' => 'Denizcilik eğitiminde mükemmelliği bir hedef değil, bir standart olarak benimsiyoruz.',
+ ],
+ ],
+ [
+ 'order_index' => 1,
+ 'type' => 'text',
+ 'content' => [
+ '_width' => 'half',
+ 'label' => 'VİZYONUMUZ',
+ 'title' => 'Vizyonumuz',
+ 'body' => "Türkiye'nin denizcilik eğitiminde referans noktası olarak, uluslararası standartları belirleyen, teknoloji odaklı ve sürekli gelişen bir eğitim kurumu olmak. Mezunlarımızın dünya denizlerinde tercih edilen profesyoneller olmasını sağlamak.
",
+ ],
+ ],
+ [
+ 'order_index' => 2,
+ 'type' => 'text',
+ 'content' => [
+ '_width' => 'half',
+ 'label' => 'MİSYONUMUZ',
+ 'title' => 'Misyonumuz',
+ 'body' => 'Ulaştırma ve Altyapı Bakanlığı ile IMO standartlarına uygun, STCW Sözleşmesi gerekliliklerini karşılayan eğitim programları sunmak. Denizcilik sektörünün ihtiyaç duyduğu nitelikli, güvenlik bilincine sahip personel yetiştirmek.
',
+ ],
+ ],
+ [
+ 'order_index' => 3,
+ 'type' => 'cards',
+ 'content' => [
+ 'label' => 'TEMEL DEĞERLERİMİZ',
+ 'title' => 'Bizi Biz Yapan İlkeler',
+ 'card_1_title' => 'Denizde Güvenlik Önceliğimiz',
+ 'card_1_text' => 'Tüm eğitim programlarımızın temelinde denizde can ve mal güvenliği ilkesi yer alır.',
+ 'card_1_icon' => 'shield',
+ 'card_2_title' => 'Uluslararası Standartlar',
+ 'card_2_text' => 'IMO ve STCW standartlarına tam uyum, UAB denetim ve onayıyla kalitemizi garanti altına alırız.',
+ 'card_2_icon' => 'globe',
+ 'card_3_title' => 'Uygulamalı Eğitim',
+ 'card_3_text' => 'Simülatör, laboratuvar ve tatbikat alanlarında gerçek senaryolarla öğrenme deneyimi sunarız.',
+ 'card_3_icon' => 'heart',
+ 'card_4_title' => 'Sürekli Gelişim',
+ 'card_4_text' => 'Müfredatımızı sektörel gelişmeler doğrultusunda sürekli günceller, eğitim kadromuzun gelişimini destekleriz.',
+ 'card_4_icon' => 'zap',
+ 'card_5_title' => 'Kursiyer Odaklılık',
+ 'card_5_text' => 'Her kursiyerin bireysel ihtiyaçlarına yönelik danışmanlık ve destek hizmeti sunuruz.',
+ 'card_5_icon' => 'target',
+ 'card_6_title' => 'Şeffaflık',
+ 'card_6_text' => 'Eğitim süreçlerimizi, başarı oranlarımızı ve mezun istatistiklerimizi kamuoyuyla paylaşırız.',
+ 'card_6_icon' => 'eye',
+ ],
+ ],
+ [
+ 'order_index' => 4,
+ 'type' => 'cta',
+ 'content' => [
+ 'title' => 'Bu Değerleri Birlikte Yaşayalım',
+ 'description' => 'Kalite Politikamız ve akreditasyonlarımız hakkında bilgi alın.',
+ 'button_text' => 'Kalite Politikamız',
+ 'button_url' => '/kurumsal/kalite-politikasi',
+ 'button_2_text' => 'Eğitimleri İncele',
+ 'button_2_url' => '/egitimler',
+ ],
+ ],
+ ];
+
+ $this->syncBlocks($page, $blocks);
+ }
+
+ /**
+ * @param array}> $blocks
+ */
+ private function syncBlocks(Page $page, array $blocks): void
+ {
+ foreach ($blocks as $block) {
+ PageBlock::updateOrCreate(
+ ['page_id' => $page->id, 'order_index' => $block['order_index']],
+ ['type' => $block['type'], 'content' => $block['content']],
+ );
+ }
+ }
+}
diff --git a/database/seeders/CourseBlockExampleSeeder.php b/database/seeders/CourseBlockExampleSeeder.php
new file mode 100644
index 0000000..a7c3967
--- /dev/null
+++ b/database/seeders/CourseBlockExampleSeeder.php
@@ -0,0 +1,143 @@
+first();
+
+ if (! $course) {
+ $this->command->warn('Gemici (Birleşik) Eğitimi bulunamadı, atlanıyor.');
+
+ return;
+ }
+
+ // Mevcut blokları temizle
+ $course->blocks()->delete();
+
+ $blocks = [
+ // Blok 0 — Eğitim Hakkında (detaylı açıklama)
+ [
+ 'order_index' => 0,
+ 'type' => 'text',
+ 'content' => [
+ 'label' => 'EĞİTİM HAKKINDA',
+ 'title' => 'Neden Bu Eğitim?',
+ 'body' => 'Gemici (Birleşik) Eğitimi, güverte bölümünde kariyer hedefleyen adayları tek bir program altında denizci olmaya hazırlar. Hem zorunlu güvenlik eğitimlerini hem de mesleki güverte operasyonlarını kapsayan bu birleşik format sayesinde iki ayrı eğitime katılma zorunluluğu ortadan kalkar.
32 günlük yoğun program boyunca kursiyerler; gerçek simülatör ortamlarında seyir gözetleme yapar, yangın tatbikat alanında bizzat müdahale eder ve can kurtarma botlarıyla açık deniz tatbikatı gerçekleştirir.
Eğitimi başarıyla tamamlayan adaylar UAB onaylı Gemici Yeterlik Belgesi almaya hak kazanır ve ticari gemilerde güverte tayfası olarak uluslararası sularda görev yapabilir.
',
+ ],
+ ],
+
+ // Blok 1 — Eğitim Kapsamı (sol yarım)
+ [
+ 'order_index' => 1,
+ 'type' => 'text',
+ 'content' => [
+ '_width' => 'half',
+ 'label' => 'EĞİTİM KAPSAMI',
+ 'title' => 'Ne Öğreneceksiniz?',
+ 'body' => 'Denizde Kişisel Güvenlik — Can kurtarma salı, şişme yelek, immersion suit kullanımı ve denizde hayatta kalma teknikleriYangınla Mücadele — A, B, C sınıfı yangın söndürme, SCBA tüplü ortamda müdahale tatbikatlarıGemi Manevrası — Yanaşma/kalkma operasyonları, halat atma, bağlama donanımı ve vinç kullanımıSeyir Gözetleme — Köprüüstü vardiya prosedürleri, dürbün ile gözetleme, COLREG kurallarıGüverte Bakımı — Paslama, boyama, bakım-onarım prosedürleri ve iş güvenliğiÇevre Koruma — MARPOL Sözleşmesi, deniz kirliliği önleme ve atık yönetimi ',
+ ],
+ ],
+
+ // Blok 2 — Katılım Koşulları (sağ yarım)
+ [
+ 'order_index' => 2,
+ 'type' => 'text',
+ 'content' => [
+ '_width' => 'half',
+ 'label' => 'BAŞVURU ŞARTLARI',
+ 'title' => 'Kimler Katılabilir?',
+ 'body' => 'Yaş: 16 yaşını doldurmuş olmakEğitim: En az ortaöğretim (lise) mezunu olmakSağlık: Denizci sağlık raporu almaya engel durumu bulunmamakAdli Sicil: Denizcilik mesleğine engel sabıka kaydı bulunmamakÖnemli: Sağlık raporu eğitim başlangıcından önce temin edilmelidir. Kurumumuz, anlaşmalı sağlık kuruluşlarına yönlendirme yapmaktadır.
',
+ ],
+ ],
+
+ // Blok 3 — Eğitim Süreci (adım kartları)
+ [
+ 'order_index' => 3,
+ 'type' => 'stats_grid',
+ 'content' => [
+ 'label' => 'EĞİTİM SÜRECİ',
+ 'title' => 'Başvurudan Belgeye 4 Adım',
+ 'stat_1_value' => '01',
+ 'stat_1_label' => 'Ön Kayıt — Online formu doldurun, danışmanlarımız sizi bilgilendirsin.',
+ 'stat_2_value' => '02',
+ 'stat_2_label' => 'Evrak & Sağlık — Gerekli belgeleri ve denizci sağlık raporunu hazırlayın.',
+ 'stat_3_value' => '03',
+ 'stat_3_label' => 'Eğitim — 32 gün boyunca teorik dersler ve uygulamalı tatbikatlar.',
+ 'stat_4_value' => '04',
+ 'stat_4_label' => 'Belgelendirme — Sınavı geçin, UAB onaylı Gemici Yeterlik Belgenizi alın.',
+ ],
+ ],
+
+ // Blok 4 — Kazanımlar (kartlar)
+ [
+ 'order_index' => 4,
+ 'type' => 'cards',
+ 'content' => [
+ 'label' => 'KAZANIMLAR',
+ 'title' => 'Eğitim Sonunda Ne Kazanırsınız?',
+ 'card_1_title' => 'Gemici Yeterlik Belgesi',
+ 'card_1_text' => 'UAB tarafından düzenlenen, uluslararası geçerli yeterlik belgesi.',
+ 'card_1_icon' => 'award',
+ 'card_2_title' => 'Denizde Can Kurtarma Sertifikası',
+ 'card_2_text' => 'STCW A-VI/1 kapsamında kişisel güvenlik ve can kurtarma belgesi.',
+ 'card_2_icon' => 'life-buoy',
+ 'card_3_title' => 'Yangınla Mücadele Sertifikası',
+ 'card_3_text' => 'Temel yangın önleme ve söndürme yetkinlik belgesi.',
+ 'card_3_icon' => 'flame',
+ 'card_4_title' => 'Kariyer İmkanı',
+ 'card_4_text' => 'Ticari gemilerde güverte tayfası olarak uluslararası sularda çalışma hakkı.',
+ 'card_4_icon' => 'anchor',
+ ],
+ ],
+
+ // Blok 5 — SSS
+ [
+ 'order_index' => 5,
+ 'type' => 'faq',
+ 'content' => [
+ 'title' => 'Sıkça Sorulan Sorular',
+ 'faq_1_question' => 'Bu eğitim ile Gemici (Temel) arasındaki fark nedir?',
+ 'faq_1_answer' => 'Birleşik eğitim, güvenlik eğitimleri (can kurtarma, yangın, kişisel emniyet) ile mesleki gemici eğitimini tek programda birleştirir. Temel eğitim ise sadece mesleki kısmı kapsar — güvenlik eğitimlerinizi daha önce almış olmanız gerekir.',
+ 'faq_2_question' => 'Devamsızlık sınırı nedir?',
+ 'faq_2_answer' => 'STCW düzenlemeleri gereği eğitim süresinin en az %90\'ına katılım zorunludur. Mazeretsiz devamsızlıkta eğitim tekrarı gerekebilir.',
+ 'faq_3_question' => 'Eğitim dili nedir?',
+ 'faq_3_answer' => 'Eğitim Türkçe olarak verilmektedir. Uluslararası denizcilik terminolojisi İngilizce olarak da öğretilmektedir.',
+ 'faq_4_question' => 'Sınav nasıl yapılıyor?',
+ 'faq_4_answer' => 'Eğitim sonunda UAB gözetiminde yazılı ve uygulamalı sınav yapılmaktadır. Başarılı olan adaylara yeterlik belgesi düzenlenir.',
+ 'faq_5_question' => 'Eğitim sonrası iş garantisi var mı?',
+ 'faq_5_answer' => 'İş garantisi verilmemekle birlikte, kurumumuz sektördeki denizcilik şirketleriyle iş birliği içindedir ve mezunlarımıza kariyer danışmanlığı sunmaktadır.',
+ ],
+ ],
+
+ // Blok 6 — CTA
+ [
+ 'order_index' => 6,
+ 'type' => 'cta',
+ 'content' => [
+ 'title' => 'Denizcilik Kariyerinize İlk Adımı Atın',
+ 'description' => 'Ön kayıt formunu doldurun, eğitim danışmanlarımız sizinle en kısa sürede iletişime geçsin.',
+ 'button_text' => 'Ön Kayıt Yap',
+ 'button_url' => '/kayit?course=gemici-birlesik-egitimi',
+ 'button_2_text' => 'WhatsApp ile Bilgi Al',
+ 'button_2_url' => '/danismanlik',
+ ],
+ ],
+ ];
+
+ foreach ($blocks as $block) {
+ $course->blocks()->create($block);
+ }
+
+ $this->command->info("Gemici (Birleşik) Eğitimi: {$course->blocks()->count()} blok oluşturuldu.");
+ }
+}
diff --git a/database/seeders/CourseContentSeeder.php b/database/seeders/CourseContentSeeder.php
new file mode 100644
index 0000000..47bb23f
--- /dev/null
+++ b/database/seeders/CourseContentSeeder.php
@@ -0,0 +1,169 @@
+command->error('course_blocks_data.json bulunamadı. Önce Python parse script çalıştırın.');
+
+ return;
+ }
+
+ /** @var array> $data */
+ $data = json_decode(file_get_contents($jsonPath), true);
+ $cats = Category::pluck('id', 'slug');
+ $allCourses = Course::all();
+ $matched = 0;
+ $created = 0;
+ $newCourses = 0;
+ $blockCount = 0;
+
+ foreach ($data as $item) {
+ $course = $this->findCourse($allCourses, $item);
+
+ if (! $course) {
+ // Create new course from article data
+ $categoryId = $cats[$item['category_slug']] ?? null;
+ if (! $categoryId) {
+ $this->command->warn("Kategori bulunamadı: {$item['category_slug']} -> {$item['title_short']}");
+
+ continue;
+ }
+
+ $course = Course::create([
+ 'category_id' => $categoryId,
+ 'slug' => Str::slug($item['title_short']),
+ 'title' => $item['title_short'],
+ 'desc' => Str::limit($item['long_desc'], 200),
+ 'long_desc' => $item['long_desc'],
+ 'duration' => '',
+ 'requirements' => $item['requirements'],
+ 'scope' => $item['scope'],
+ 'standard' => 'STCW / IMO Uyumlu',
+ 'language' => 'Türkçe',
+ 'location' => 'Kadıköy, İstanbul',
+ 'meta_title' => $item['title_short'].' | Boğaziçi Denizcilik',
+ 'meta_description' => Str::limit($item['long_desc'], 155),
+ ]);
+ $newCourses++;
+ $allCourses->push($course);
+ } else {
+ $matched++;
+ $this->updateCourseFields($course, $item);
+ }
+
+ // Sync blocks
+ $count = $this->syncBlocks($course, $item['blocks']);
+ $blockCount += $count;
+ }
+
+ $total = count($data);
+ $this->command->info("Toplam: {$total} makale, {$matched} eşleşme, {$newCourses} yeni kurs, {$blockCount} blok.");
+ }
+
+ /**
+ * @param Collection $allCourses
+ * @param array $item
+ */
+ private function findCourse($allCourses, array $item): ?Course
+ {
+ $articleSlug = Str::slug($item['title_short']);
+ $titleNorm = $this->normalize($item['title_short']);
+
+ // 1. Exact slug match
+ $found = $allCourses->first(fn (Course $c) => $c->slug === $articleSlug);
+ if ($found) {
+ return $found;
+ }
+
+ // 2. Normalized title contains match
+ $found = $allCourses->first(fn (Course $c) => $this->normalize($c->title) === $titleNorm);
+ if ($found) {
+ return $found;
+ }
+
+ // 3. Fuzzy — first 25 chars of normalized title
+ $prefix = mb_substr($titleNorm, 0, 25);
+
+ return $allCourses->first(fn (Course $c) => str_starts_with($this->normalize($c->title), $prefix));
+ }
+
+ /**
+ * Normalize text: lowercase, strip accents, collapse whitespace.
+ */
+ private function normalize(string $text): string
+ {
+ $text = mb_strtolower($text);
+ // Turkish specific replacements
+ $text = str_replace(
+ ['ç', 'ğ', 'ı', 'ö', 'ş', 'ü', 'â', 'î', 'û'],
+ ['c', 'g', 'i', 'o', 's', 'u', 'a', 'i', 'u'],
+ $text,
+ );
+ $text = preg_replace('/[^a-z0-9\s]/', '', $text);
+
+ return preg_replace('/\s+/', ' ', trim($text));
+ }
+
+ /**
+ * @param array $item
+ */
+ private function updateCourseFields(Course $course, array $item): void
+ {
+ $updates = [];
+
+ if (empty($course->long_desc) && ! empty($item['long_desc'])) {
+ $updates['long_desc'] = $item['long_desc'];
+ }
+
+ if ((empty($course->requirements) || $course->requirements === []) && ! empty($item['requirements'])) {
+ $updates['requirements'] = $item['requirements'];
+ }
+
+ if ((empty($course->scope) || $course->scope === []) && ! empty($item['scope'])) {
+ $updates['scope'] = $item['scope'];
+ }
+
+ if (! empty($updates)) {
+ $course->update($updates);
+ }
+ }
+
+ /**
+ * @param array> $blocks
+ */
+ private function syncBlocks(Course $course, array $blocks): int
+ {
+ $count = 0;
+
+ foreach ($blocks as $block) {
+ CourseBlock::updateOrCreate(
+ ['course_id' => $course->id, 'order_index' => $block['order_index']],
+ ['type' => $block['type'], 'content' => $block['content']],
+ );
+ $count++;
+ }
+
+ return $count;
+ }
+}
diff --git a/database/seeders/CourseScheduleSeeder.php b/database/seeders/CourseScheduleSeeder.php
new file mode 100644
index 0000000..ef39b5c
--- /dev/null
+++ b/database/seeders/CourseScheduleSeeder.php
@@ -0,0 +1,154 @@
+truncate();
+
+ // Kurs slug → id eşlemesi
+ $courseIds = DB::table('courses')->pluck('id', 'slug');
+
+ $schedules = [
+ // ── ŞUBAT 2026 ─────────────────────────────────────────────────
+ [
+ 'course_id' => $courseIds['stcw-temel-guvenlik'] ?? null,
+ 'start_date' => '2026-02-24',
+ 'end_date' => '2026-02-28',
+ 'location' => 'Kadıköy',
+ 'quota' => 20,
+ 'available_seats' => 8,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['yat-kaptani-25-gt'] ?? null,
+ 'start_date' => '2026-02-26',
+ 'end_date' => '2026-02-28',
+ 'location' => 'Kadıköy',
+ 'quota' => 12,
+ 'available_seats' => 4,
+ 'is_urgent' => true,
+ ],
+
+ // ── MART 2026 ───────────────────────────────────────────────────
+ [
+ 'course_id' => $courseIds['arpa-radar-simulator'] ?? null,
+ 'start_date' => '2026-03-03',
+ 'end_date' => '2026-03-05',
+ 'location' => 'Online',
+ 'quota' => 20,
+ 'available_seats' => 12,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['gmdss-genel-telsiz-operatoru-goc'] ?? null,
+ 'start_date' => '2026-03-10',
+ 'end_date' => '2026-03-17',
+ 'location' => 'Kadıköy',
+ 'quota' => 15,
+ 'available_seats' => 6,
+ 'is_urgent' => true,
+ ],
+ [
+ 'course_id' => $courseIds['aff-yangin-sondurme'] ?? null,
+ 'start_date' => '2026-03-17',
+ 'end_date' => '2026-03-19',
+ 'location' => 'Kadıköy',
+ 'quota' => 20,
+ 'available_seats' => 10,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['dizel-motor-teknigi'] ?? null,
+ 'start_date' => '2026-03-24',
+ 'end_date' => '2026-03-28',
+ 'location' => 'Kadıköy',
+ 'quota' => 15,
+ 'available_seats' => 9,
+ 'is_urgent' => false,
+ ],
+
+ // ── NİSAN 2026 ──────────────────────────────────────────────────
+ [
+ 'course_id' => $courseIds['stcw-temel-guvenlik'] ?? null,
+ 'start_date' => '2026-04-07',
+ 'end_date' => '2026-04-11',
+ 'location' => 'Kadıköy',
+ 'quota' => 20,
+ 'available_seats' => 14,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['yat-kaptani-149-gt-egitimi-temel'] ?? null,
+ 'start_date' => '2026-04-14',
+ 'end_date' => '2026-04-19',
+ 'location' => 'Kadıköy',
+ 'quota' => 12,
+ 'available_seats' => 3,
+ 'is_urgent' => true,
+ ],
+ [
+ 'course_id' => $courseIds['bst-yenileme'] ?? null,
+ 'start_date' => '2026-04-21',
+ 'end_date' => '2026-04-22',
+ 'location' => 'Online',
+ 'quota' => 30,
+ 'available_seats' => 20,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['ecdis-tip-bazli-egitim'] ?? null,
+ 'start_date' => '2026-04-28',
+ 'end_date' => '2026-04-30',
+ 'location' => 'Kadıköy',
+ 'quota' => 15,
+ 'available_seats' => 7,
+ 'is_urgent' => false,
+ ],
+
+ // ── MAYIS 2026 ──────────────────────────────────────────────────
+ [
+ 'course_id' => $courseIds['stcw-temel-guvenlik'] ?? null,
+ 'start_date' => '2026-05-05',
+ 'end_date' => '2026-05-09',
+ 'location' => 'Kadıköy',
+ 'quota' => 20,
+ 'available_seats' => 15,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['yat-kaptani-3000-gt'] ?? null,
+ 'start_date' => '2026-05-12',
+ 'end_date' => '2026-05-23',
+ 'location' => 'Kadıköy',
+ 'quota' => 10,
+ 'available_seats' => 5,
+ 'is_urgent' => false,
+ ],
+ [
+ 'course_id' => $courseIds['makine-dairesi-operasyonu'] ?? null,
+ 'start_date' => '2026-05-19',
+ 'end_date' => '2026-05-21',
+ 'location' => 'Kadıköy',
+ 'quota' => 15,
+ 'available_seats' => 8,
+ 'is_urgent' => false,
+ ],
+ ];
+
+ // Null olan course_id'leri filtrele (kurs bulunamadıysa atla)
+ $validSchedules = array_filter($schedules, fn ($s) => $s['course_id'] !== null);
+
+ foreach ($validSchedules as $schedule) {
+ DB::table('course_schedules')->insert(array_merge($schedule, [
+ 'created_at' => now(),
+ 'updated_at' => now(),
+ ]));
+ }
+ }
+}
diff --git a/database/seeders/CourseSeeder.php b/database/seeders/CourseSeeder.php
new file mode 100644
index 0000000..46aa8be
--- /dev/null
+++ b/database/seeders/CourseSeeder.php
@@ -0,0 +1,1248 @@
+ 'gemici-birlesik-egitimi',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'Gemici (Birleşik) Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemici (Birleşik) Eğitimi, denizcilik sektöründe güverte bölümünde kariyer hedefleyen adaylar için tasarlanmış kapsamlı bir yetiştirme programıdır.',
+ 'long_desc' => 'Gemici (Birleşik) Eğitimi, denizcilik sektöründe güverte bölümünde kariyer hedefleyen adaylar için tasarlanmış kapsamlı bir yetiştirme programıdır. Boğaziçi Denizcilik Eğitim Kurumu\'nun uzman eğitmen kadrosuyla sunulan bu eğitim, STCW Sözleşmesi gerekliliklerine uygun olarak teorik ve pratik bilgileri bir arada sunmaktadır. Eğitimi başarıyla tamamlayan adaylar, gemici yeterlik belgesi almaya hak kazanarak ticari gemilerde güverte tayfası olarak görev yapabilirler.',
+ 'duration' => '32 Gün',
+ 'students' => 772,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺5.200',
+ 'includes' => [
+ 'Denizde kişisel güvenlik ve can kurtarma teknikleri',
+ 'Yangın önleme ve yangınla mücadele uygulamaları',
+ 'Gemi manevrası ve iskele operasyonları',
+ 'Halat, tel ve bağlama donanımı kullanımı',
+ 'Seyir gözetleme ve vardiya tutma esasları',
+ 'Güverte bakım ve boyama işlemleri',
+ 'Kişisel emniyet ve sosyal sorumluluk',
+ 'Deniz çevre bilinci ve kirlilik önleme',
+ ],
+ 'requirements' => [
+ '16 yaşını bitirmiş olmak',
+ 'En az ortaöğretim mezunu olmak',
+ 'Sağlık raporu almaya engel durumu bulunmamak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Gemici (Birleşik) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Gemici (Birleşik) Eğitimi için ön kayıt formu. STCW uyumlu, 32 günlük kapsamlı güverte tayfası yetiştirme programı.',
+ ],
+ [
+ 'slug' => 'gemici-temel-egitimi',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'Gemici (Temel) Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemici (Temel) Eğitimi, denizde güvenlik eğitimlerini daha önce tamamlamış adayların gemici yeterlik belgesi alabilmesi için gereken mesleki bilgi ve becerileri kazandıran bir eğitim programıdır.',
+ 'long_desc' => 'Gemici (Temel) Eğitimi, denizde güvenlik eğitimlerini daha önce tamamlamış adayların gemici yeterlik belgesi alabilmesi için gereken mesleki bilgi ve becerileri kazandıran bir eğitim programıdır. Boğaziçi Denizcilik Eğitim Kurumu bünyesinde STCW standartlarına uygun şekilde yürütülen bu eğitim, güverte operasyonlarında görev alacak personelin yetiştirilmesini hedeflemektedir.',
+ 'duration' => '19 Gün',
+ 'students' => 314,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'Güverte operasyonları ve gemi manevraları',
+ 'Halat, tel ve bağlama donanımı kullanımı',
+ 'Seyir gözetleme ve vardiya tutma esasları',
+ 'Güverte bakım ve boyama işlemleri',
+ 'Gemi yapısı ve donanımı temel bilgisi',
+ 'İskele ve yanaşma operasyonları',
+ ],
+ 'requirements' => [
+ '16 yaşını bitirmiş olmak',
+ 'En az ortaöğretim mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Gemici (Temel) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Gemici (Temel) Eğitimi başvuru formu. 19 günlük STCW uyumlu güverte tayfası programı.',
+ ],
+ [
+ 'slug' => 'usta-gemici-yetistirme-egitimi-a-ii-5',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'Usta Gemici Yetiştirme Eğitimi (A-II/5)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Usta Gemici Yetiştirme Eğitimi, STCW Kod A-II/5 gerekliliklerine uygun olarak hazırlanmış ileri düzey bir güverte tayfası eğitimidir.',
+ 'long_desc' => 'Usta Gemici Yetiştirme Eğitimi, STCW Kod A-II/5 gerekliliklerine uygun olarak hazırlanmış ileri düzey bir güverte tayfası eğitimidir. Köprüüstü ekipmanlarının kullanımından ileri seyir tekniklerine, liderlik becerilerinden güverte operasyonlarının yönetimine kadar kapsamlı bir içerik sunan bu eğitim, güverte bölümünde uzmanlaşmak isteyen denizcilere yeni kariyer fırsatları açmaktadır.',
+ 'duration' => '10 Gün',
+ 'students' => 485,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'İleri güverte operasyonları ve yönetimi',
+ 'Köprüüstü seyir cihazları kullanımı',
+ 'Yük elleçleme ve istifleme prosedürleri',
+ 'Gemi bakım ve onarım planlaması',
+ 'Liderlik ve ekip yönetimi becerileri',
+ 'COLREG ve seyir kuralları',
+ ],
+ 'requirements' => [
+ '18 yaşını bitirmiş olmak',
+ 'Gemici yeterlik belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Usta Gemici Yetiştirme Eğitimi (A-II/5) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW A-II/5 uyumlu Usta Gemici Yetiştirme Eğitimi. Güverte kariyerinizde bir üst basamağa çıkın.',
+ ],
+ [
+ 'slug' => 'sinirli-vardiya-zabiti-egitimi-a-ii-3-temel',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'Sınırlı Vardiya Zabiti Eğitimi (A-II/3) (Temel)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Sınırlı Vardiya Zabiti Eğitimi, STCW Kod A-II/3 gerekliliklerini karşılayan kıyıya yakın sefer bölgelerine yönelik zabit yetiştirme programıdır.',
+ 'long_desc' => 'Sınırlı Vardiya Zabiti Eğitimi (A-II/3) Temel programı, daha önce belirli modülleri tamamlamış adayların kalan eğitimlerini alarak sınırlı vardiya zabiti yeterliliği kazanmasını sağlayan bir programdır. Kıyıya yakın sefer bölgelerinde görev yapacak zabitler için seyir, gemi yönetimi ve güvenlik konularında derinlemesine bilgi sunar.',
+ 'duration' => '31 Gün',
+ 'students' => 320,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Kıyı seyri ve seyir planlaması',
+ 'Radar ve ARPA kullanımı',
+ 'Gemi manevra kabiliyeti',
+ 'Meteoroloji ve deniz durumu değerlendirme',
+ 'COLREG ve seyir kuralları uygulamaları',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'En az ortaöğretim mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Sınırlı Vardiya Zabiti Eğitimi (A-II/3) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW A-II/3 Sınırlı Vardiya Zabiti Eğitimi başvurusu. 31 günlük kapsamlı güverte zabit programı.',
+ ],
+ [
+ 'slug' => 'gmdss-genel-telsiz-operatoru-goc',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'GMDSS Genel Telsiz Operatörü (GOC)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'GMDSS GOC Eğitimi, tüm deniz alanlarında (A1-A4) sefer yapan gemilerde telsiz operatörü olarak görev yapmak isteyen denizcilere yönelik uluslararası geçerliliğe sahip bir yeterlilik programıdır.',
+ 'long_desc' => 'GMDSS Genel Telsiz Operatörü (GOC) Eğitimi, tüm deniz alanlarında (A1-A4) sefer yapan gemilerde telsiz operatörü olarak görev yapmak isteyen denizcilere yönelik uluslararası geçerliliğe sahip bir yeterlilik programıdır. GOC belgesi ile tüm okyanus seferlerinde görev yapabilir, denizde tehlike ve güvenlik haberleşmesini etkin biçimde yönetebilirsiniz.',
+ 'duration' => '13 Gün',
+ 'students' => 876,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'GMDSS sistemi ve bileşenleri',
+ 'DSC (Sayısal Seçmeli Çağrı) kullanımı',
+ 'INMARSAT uydu haberleşme sistemleri',
+ 'NAVTEX ve güvenlik bilgi hizmetleri',
+ 'Tehlike, aciliyet ve güvenlik haberleşmesi',
+ 'EPIRB, SART ve VHF el telsizi kullanımı',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'En az ilköğretim mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'GMDSS Genel Telsiz Operatörü (GOC) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'GMDSS GOC belgesi için eğitim başvurusu. Tüm deniz alanlarında geçerli telsiz operatörlüğü sertifikası.',
+ ],
+ [
+ 'slug' => 'gmdss-tahditli-telsiz-operatoru-roc',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'GMDSS Tahditli Telsiz Operatörü (ROC)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'GMDSS ROC Eğitimi, A1 ve A2 deniz alanlarında sefer yapan gemilerde telsiz haberleşme görevlerini yürütecek personel için tasarlanmış bir yeterlilik programıdır.',
+ 'long_desc' => 'GMDSS Tahditli Telsiz Operatörü (ROC) Eğitimi, A1 ve A2 deniz alanlarında sefer yapan gemilerde telsiz haberleşme görevlerini yürütecek personel için tasarlanmış bir yeterlilik programıdır. ROC belgesi, özellikle kabotaj hattında ve kıyı seferlerinde çalışan gemilerde zorunlu bir yeterliliktir.',
+ 'duration' => '7 Gün',
+ 'students' => 817,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'VHF ve MF haberleşme sistemleri',
+ 'DSC (Sayısal Seçmeli Çağrı) operasyonları',
+ 'NAVTEX kullanımı ve mesaj analizi',
+ 'Tehlike ve güvenlik haberleşme prosedürleri',
+ 'EPIRB ve SART cihazlarının kullanımı',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'En az ilköğretim mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'GMDSS Tahditli Telsiz Operatörü (ROC) | Boğaziçi Denizcilik',
+ 'meta_description' => 'GMDSS ROC belgesi için 7 günlük eğitim. A1-A2 deniz alanlarında geçerli telsiz yeterliği.',
+ ],
+ [
+ 'slug' => 'arpa-radar-simulator',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'ARPA / Radar Simülatör Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Kongsberg simülatörleri üzerinde ARPA ve Radar sistemlerinin kullanımını kapsayan uygulamalı köprüüstü eğitimi.',
+ 'long_desc' => 'Kongsberg simülatörleri üzerinde ARPA ve Radar sistemlerinin kullanımını kapsayan uygulamalı köprüüstü eğitimi. Çatışma önleme, seyir planlaması ve acil durum senaryolarını simüle ortamda deneyimleyerek yetkinlik kazanın.',
+ 'duration' => '2 Gün',
+ 'students' => 540,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'Radar teori ve pratik kullanımı',
+ 'ARPA ile çatışma önleme uygulamaları',
+ 'Simülatör üzerinde senaryo çalışmaları',
+ 'Seyir planlaması ve rota optimizasyonu',
+ ],
+ 'requirements' => [
+ 'Güverte zabitliği veya kaptan belgesi sahibi olmak',
+ 'STCW BST sertifikası',
+ 'Seyir çizelgesi okuma bilgisi',
+ ],
+ 'meta_title' => 'ARPA / Radar Simülatör Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Kongsberg simülatörleri ile ARPA/Radar eğitimi. Köprüüstü operasyon yetkinliğinizi geliştirin.',
+ ],
+ [
+ 'slug' => 'ecdis-tip-bazli-egitim',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'ECDIS Tip Bazlı Eğitim',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Elektronik Harita Görüntüleme ve Bilgi Sistemleri (ECDIS) cihazlarının tip bazlı kullanımını kapsayan uygulamalı eğitim programı.',
+ 'long_desc' => 'Elektronik Harita Görüntüleme ve Bilgi Sistemleri (ECDIS) cihazlarının tip bazlı kullanımını kapsayan uygulamalı eğitim programı. SOLAS gerekliliklerini karşılamak için zorunlu olan tip bazlı ECDIS eğitimi ile cihaz operasyonunda uzmanlaşın.',
+ 'duration' => '2 Gün',
+ 'students' => 430,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'ECDIS cihaz menüsü ve arayüzü',
+ 'Rota planlama ve izleme',
+ 'Alarm yönetimi',
+ 'Harita güncellemeleri ve seyir güvenliği',
+ ],
+ 'requirements' => [
+ 'OOW veya üzeri denizcilik belgesi',
+ 'Temel ECDIS sertifikası (jenerik)',
+ 'STCW BST sertifikası',
+ ],
+ 'meta_title' => 'ECDIS Tip Bazlı Eğitim | Boğaziçi Denizcilik',
+ 'meta_description' => 'SOLAS uyumlu ECDIS tip bazlı eğitim. Elektronik seyir sistemlerinde yetkinlik kazanın.',
+ ],
+ [
+ 'slug' => 'gmdss-genel-telsiz-operator-goc-yeterligi-tazeleme-egitimi',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'GMDSS Genel Telsiz Operatör (GOC) Yeterliği Tazeleme Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'GOC belgesinin geçerlilik süresini uzatmak isteyen denizcilerin bilgi ve becerilerini güncellemesini sağlayan yenileme programı.',
+ 'long_desc' => 'GMDSS GOC Yeterliği Tazeleme Eğitimi, GOC belgesinin geçerlilik süresini uzatmak isteyen denizcilerin bilgi ve becerilerini güncellemesini sağlayan bir yenileme programıdır. GMDSS sistemlerindeki güncel gelişmeleri ve teknolojik yenilikleri kapsamaktadır.',
+ 'duration' => '2 Gün',
+ 'students' => 593,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'GMDSS sistemlerindeki güncel gelişmeler',
+ 'DSC ve uydu haberleşme güncellemeleri',
+ 'e-Navigation ve modern haberleşme teknolojileri',
+ 'Mevzuat güncellemeleri',
+ ],
+ 'requirements' => [
+ 'Geçerli veya süresi dolmuş GOC belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'GMDSS GOC Tazeleme Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'GOC belgenizi yenileyin. 2 günlük GMDSS tazeleme programı ile belgenizin geçerliliğini uzatın.',
+ ],
+ [
+ 'slug' => 'gmdss-tahditli-telsiz-operator-roc-yeterligi-tazeleme-egitimi',
+ 'category_id' => $cats['guverte'],
+ 'title' => 'GMDSS Tahditli Telsiz Operatör (ROC) Yeterliği Tazeleme Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'ROC belgesinin geçerlilik süresini uzatmak isteyen denizcilere yönelik kısa süreli yenileme programı.',
+ 'long_desc' => 'GMDSS ROC Yeterliği Tazeleme Eğitimi, ROC belgesinin geçerlilik süresini uzatmak isteyen denizcilere yönelik bir yenileme programıdır. VHF ve MF haberleşme sistemlerindeki güncellemeleri ve yeni uygulamaları kapsamaktadır.',
+ 'duration' => '1 Gün',
+ 'students' => 373,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'VHF ve MF haberleşme güncellemeleri',
+ 'DSC operasyon pratiği',
+ 'Tehlike haberleşme prosedürleri tazelemesi',
+ 'Mevzuat değişiklikleri',
+ ],
+ 'requirements' => [
+ 'Geçerli veya süresi dolmuş ROC belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'GMDSS ROC Tazeleme Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'ROC belgenizi yenileyin. 1 günlük tazeleme programı ile belgenizin geçerliliğini uzatın.',
+ ],
+
+ // ── STCW EĞİTİMLERİ ───────────────────────────────────────────
+ [
+ 'slug' => 'stcw-temel-guvenlik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'STCW Temel Güvenlik Eğitimi (BST)',
+ 'sub' => 'STCW VI/1 – IMO Uyumlu',
+ 'desc' => 'STCW Temel Güvenlik Eğitimi (BST), gemide görev yapacak tüm personel için zorunlu olan temel can kurtarma, yangın, ilk yardım ve kişisel güvenlik sertifika programıdır.',
+ 'long_desc' => 'STCW Temel Güvenlik Eğitimi (BST), STCW Sözleşmesi Kural VI/1 kapsamında gemide görev yapacak tüm personelin alması zorunlu olan temel güvenlik eğitimidir. Denizcilik kariyerinin ilk ve zorunlu adımı olan BST belgesi; can kurtarma, yangınla mücadele, ilk yardım ve kişisel emniyet konularını kapsamaktadır.',
+ 'duration' => '5 Gün',
+ 'students' => 1240,
+ 'rating' => 4.9,
+ 'badge' => 'most_preferred',
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Denizde kişisel can kurtarma teknikleri',
+ 'Yangın önleme ve yangınla mücadele',
+ 'Temel ilk yardım uygulamaları',
+ 'Kişisel emniyet ve sosyal sorumluluk',
+ 'Can yelekleri ve can salı kullanımı',
+ ],
+ 'requirements' => [
+ 'En az 16 yaşında olmak',
+ 'Lise veya dengi okul mezunu olmak',
+ 'Sağlık raporu (denize elverişli)',
+ 'Nüfus cüzdanı veya pasaport fotokopisi',
+ ],
+ 'meta_title' => 'STCW Temel Güvenlik (BST) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Denizcilik kariyerinin ilk adımı BST belgesi için eğitim başvurusu. IMO onaylı, 5 günlük temel güvenlik programı.',
+ ],
+ [
+ 'slug' => 'aff-yangin-sondurme',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Gelişmiş Yangın Söndürme (AFF)',
+ 'sub' => 'STCW VI/3 – IMO Uyumlu',
+ 'desc' => 'Gemide yangın söndürme ekibinde liderlik rolü üstlenecek personel için tasarlanmış ileri düzey yangın söndürme eğitimi.',
+ 'long_desc' => 'Gelişmiş Yangın Söndürme (AFF) Eğitimi, STCW Sözleşmesi VI/3 kapsamında yangın söndürme ekiplerinde liderlik rolü üstlenecek personelin yetiştirilmesine yönelik ileri düzey bir eğitimdir. Büyük çaplı yangın senaryolarında doğru karar verme ve ekip koordinasyonu konularında yetkinlik kazandırır.',
+ 'duration' => '2 Gün',
+ 'students' => 720,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'İleri yangın söndürme teknikleri ve taktikleri',
+ 'Sabit yangın söndürme sistemlerinin yönetimi',
+ 'Yangın söndürme ekibi liderliği',
+ 'Yangın tatbikatı planlama ve değerlendirme',
+ ],
+ 'requirements' => [
+ 'STCW BST sertifikası',
+ 'Fiziksel sağlık durumu uygun olmak',
+ 'En az 18 yaşında olmak',
+ ],
+ 'meta_title' => 'Gelişmiş Yangın Söndürme (AFF) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW VI/3 Gelişmiş Yangın Söndürme (AFF) belgesi için eğitim başvurusu.',
+ ],
+ [
+ 'slug' => 'yolcu-gemisinde-calisma-egitimi',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Yolcu Gemisinde Çalışma Eğitimi',
+ 'sub' => 'STCW A-V/2 – IMO Uyumlu',
+ 'desc' => 'Yolcu gemilerinde görev yapacak tüm personelin yolcu güvenliği ve hizmet kalitesi konusunda yetkinlik kazanmasını sağlayan zorunlu bir programdır.',
+ 'long_desc' => 'Yolcu Gemisinde Çalışma Eğitimi, yolcu gemilerinde görev yapacak tüm personelin yolcu güvenliği ve hizmet kalitesi konusunda yetkinlik kazanmasını sağlayan zorunlu bir programdır. Kruvaziyer ve feribot sektöründe kariyer hedefleyen profesyoneller için kalabalık yönetiminden kriz iletişimine kadar kritik becerileri kazandırmaktadır.',
+ 'duration' => '3 Gün',
+ 'students' => 165,
+ 'rating' => 4.5,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Yolcu güvenliği ve acil durum yönetimi',
+ 'Kalabalık yönetimi teknikleri',
+ 'Kriz iletişimi ve yolcu bilgilendirme',
+ 'Engelli ve özel ihtiyaçlı yolculara yardım',
+ ],
+ 'requirements' => [
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Yolcu Gemisinde Çalışma Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW A-V/2 Yolcu Gemisi Çalışma sertifikası. Kruvaziyer ve feribot sektörü için zorunlu program.',
+ ],
+ [
+ 'slug' => 'denizde-guvenlik-egitimi-teorik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Denizde Güvenlik Eğitimi (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Tüm gemi personelinin alması zorunlu olan temel denizde güvenlik bilincini kazandıran teorik eğitim programı.',
+ 'long_desc' => 'Denizde Güvenlik Eğitimi, STCW Sözleşmesi gereği tüm gemi personelinin alması zorunlu olan temel güvenlik eğitimlerinden biridir. Denizde karşılaşılabilecek tehlike durumlarına karşı bilinç ve hazırlık düzeyini artırmayı hedeflemektedir.',
+ 'duration' => '12 Gün',
+ 'students' => 162,
+ 'rating' => 4.5,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Denizde güvenlik bilinci ve genel prensipler',
+ 'Acil durum prosedürleri ve toplanma',
+ 'Gemi yapısı ve bölümleri tanıtımı',
+ 'Deniz çevresi koruma bilinci',
+ ],
+ 'requirements' => [
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Denizde Güvenlik Eğitimi (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'Teorik denizde güvenlik eğitimi başvurusu. STCW uyumlu zorunlu güvenlik sertifikası.',
+ ],
+ [
+ 'slug' => 'denizde-kisisel-can-kurtarma-teknikleri-egitimi-teorik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Denizde Kişisel Can Kurtarma Teknikleri Eğitimi (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Denize düşme veya gemiyi terk etme gibi acil durumlarda hayatta kalma becerilerini kazandıran STCW zorunlu teorik eğitim.',
+ 'long_desc' => 'Denizde Kişisel Can Kurtarma Teknikleri Eğitimi, gemi personelinin denize düşme veya gemiyi terk etme gibi acil durumlarda hayatta kalma becerilerini kazandıran temel STCW eğitimlerinden biridir.',
+ 'duration' => '2 Gün',
+ 'students' => 568,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'Can yelekleri ve kişisel yüzdürme araçları',
+ 'Can salları ve kullanım prosedürleri',
+ 'Hipotermiden korunma teknikleri',
+ 'Terk-i gemi prosedürleri',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Denizde Can Kurtarma Teknikleri (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW kişisel can kurtarma teknikleri teorik eğitimi. Hayatta kalma becerilerinizi geliştirin.',
+ ],
+ [
+ 'slug' => 'yangin-onleme-ve-yanginla-mucadele-egitimi-teorik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Yangın Önleme ve Yangınla Mücadele Eğitimi (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemide yangın risklerinin anlaşılması ve yangın durumunda etkin müdahale için gerekli bilgileri kazandıran teorik STCW eğitimi.',
+ 'long_desc' => 'Yangın Önleme ve Yangınla Mücadele Eğitimi, gemide yangın risklerinin anlaşılması ve yangın durumunda etkin müdahale edilmesi için gerekli bilgileri kazandıran temel STCW eğitimlerinden biridir.',
+ 'duration' => '2 Gün',
+ 'students' => 824,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺4.500',
+ 'includes' => [
+ 'Yangın üçgeni ve yangın sınıfları',
+ 'Yangın söndürme araç ve gereçleri',
+ 'Sabit yangın söndürme sistemleri',
+ 'Yangında tahliye prosedürleri',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Yangın Önleme ve Mücadele (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW teorik yangın eğitimi başvurusu. Gemide yangın güvenliği bilinci kazanın.',
+ ],
+ [
+ 'slug' => 'kisisel-emniyet-ve-sosyal-sorumluluk',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Kişisel Emniyet ve Sosyal Sorumluluk',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemide güvenli çalışma uygulamalarını, çevre bilincini ve kişilerarası iletişim becerilerini kapsayan zorunlu STCW eğitimi.',
+ 'long_desc' => 'Kişisel Emniyet ve Sosyal Sorumluluk eğitimi, STCW Sözleşmesi kapsamında tüm denizcilerin alması zorunlu olan temel eğitimlerden biridir. Gemide güvenli çalışma uygulamalarını, çevre bilincini ve kişilerarası iletişim becerilerini kapsamaktadır.',
+ 'duration' => '3 Gün',
+ 'students' => 573,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺5.200',
+ 'includes' => [
+ 'Gemide iş güvenliği ve sağlık kuralları',
+ 'Deniz çevresi koruma ve kirlilik önleme',
+ 'Ekip çalışması ve iletişim becerileri',
+ 'Yorgunluk yönetimi ve vardiya düzeni',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ ],
+ 'meta_title' => 'Kişisel Emniyet ve Sosyal Sorumluluk | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW kişisel emniyet ve sosyal sorumluluk eğitimi başvurusu. Zorunlu denizcilik sertifikası.',
+ ],
+ [
+ 'slug' => 'can-kurtarma-araclarini-kullanma-egitimi-teorik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Can Kurtarma Araçlarını Kullanma Eğitimi (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Can kurtarma botları, can salları ve diğer kurtarma araçlarının doğru ve etkin kullanımını kapsayan STCW zorunlu teorik eğitim.',
+ 'long_desc' => 'Can Kurtarma Araçlarını Kullanma Eğitimi, gemideki tüm can kurtarma araç ve gereçlerinin doğru ve etkin kullanılmasını sağlayan STCW zorunlu eğitimlerinden biridir.',
+ 'duration' => '2 Gün',
+ 'students' => 673,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Can kurtarma botlarının çeşitleri ve özellikleri',
+ 'Can salı kullanım ve aktivasyon prosedürleri',
+ 'SOLAS gereklilikleri ve düzenlemeler',
+ 'Terk-i gemi tatbikat prosedürleri',
+ ],
+ 'requirements' => [
+ '18 yaşını bitirmiş olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Can Kurtarma Araçları (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW can kurtarma araçları teorik eğitimi. Acil durum yetkinliğinizi geliştirin.',
+ ],
+ [
+ 'slug' => 'hizli-cankurtarma-botu-kullanma-yeterligi-egitimi-teorik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Hızlı Cankurtarma Botu Kullanma Yeterliği Eğitimi (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Hızlı cankurtarma botlarının operasyonunu öğreten ve kurtarma operasyonlarında görev alacak personelin yetiştirilmesini amaçlayan teorik eğitim.',
+ 'long_desc' => 'Hızlı Cankurtarma Botu Kullanma Yeterliği Eğitimi, denize düşen kişilerin kurtarılmasında kullanılan hızlı kurtarma botlarının operasyonunu kapsamlı şekilde öğreten bir yeterlilik programıdır.',
+ 'duration' => '3 Gün',
+ 'students' => 257,
+ 'rating' => 4.5,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'Hızlı cankurtarma botu özellikleri ve donanımı',
+ 'Bot indirme, kaldırma ve manevra teknikleri',
+ 'Denize düşen kişi kurtarma yöntemleri',
+ 'Bot bakım ve kontrol prosedürleri',
+ ],
+ 'requirements' => [
+ 'Geçerli sağlık raporuna sahip olmak',
+ '18 yaş ve üzeri olmak',
+ ],
+ 'meta_title' => 'Hızlı Cankurtarma Botu (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW hızlı cankurtarma botu yeterliği teorik eğitimi.',
+ ],
+ [
+ 'slug' => 'i-leri-yanginla-mucadele-egitimi-teorik',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'İleri Yangınla Mücadele Eğitimi (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Yangın söndürme ekiplerinde liderlik rolü üstlenecek personelin yetiştirilmesine yönelik ileri düzey teorik STCW yangın eğitimi.',
+ 'long_desc' => 'İleri Yangınla Mücadele Eğitimi, yangın söndürme ekiplerinde ve yangın müdahale operasyonlarında liderlik rolü üstlenecek personelin yetiştirilmesine yönelik ileri düzey bir STCW eğitimidir.',
+ 'duration' => '3 Gün',
+ 'students' => 128,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'Yangın müdahale stratejileri ve taktikleri',
+ 'Yangın söndürme ekibi liderliği',
+ 'Sabit yangın söndürme sistemlerinin yönetimi',
+ 'Yangın tatbikatı planlama ve değerlendirme',
+ ],
+ 'requirements' => [
+ 'Geçerli sağlık raporuna sahip olmak',
+ '18 yaş ve üzeri olmak',
+ ],
+ 'meta_title' => 'İleri Yangınla Mücadele (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW ileri yangınla mücadele teorik eğitimi. Yangın liderliği yetkinliği kazanın.',
+ ],
+ [
+ 'slug' => 'petrol-ve-kimyasal-tankerlerinde-yuk-i-slemleri-temel-egitimi',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Petrol ve Kimyasal Tankerlerinde Yük İşlemleri Temel Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Tanker gemilerinde görev yapacak personelin tehlikeli yüklerle güvenli çalışma konusunda temel bilgi kazanmasını sağlayan STCW zorunlu eğitim.',
+ 'long_desc' => 'Petrol ve Kimyasal Tankerlerinde Yük İşlemleri Temel Eğitimi, tanker gemilerinde görev yapacak personelin tehlikeli yüklerle güvenli çalışma konusunda temel bilgi ve becerilerini kazandıran STCW zorunlu eğitimlerinden biridir.',
+ 'duration' => '2 Gün',
+ 'students' => 282,
+ 'rating' => 4.5,
+ 'badge' => null,
+ 'price' => '₺5.200',
+ 'includes' => [
+ 'Petrol ve kimyasal maddelerin özellikleri ve tehlikeleri',
+ 'Yük elleçleme temel prosedürleri',
+ 'Statik elektrik ve inert gaz sistemleri',
+ 'MARPOL ve çevre koruma gereklilikleri',
+ ],
+ 'requirements' => [
+ 'Geçerli sağlık raporuna sahip olmak',
+ '18 yaş ve üzeri olmak',
+ ],
+ 'meta_title' => 'Petrol ve Kimyasal Tanker Yük İşlemleri | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW petrol ve kimyasal tanker temel eğitimi. Tanker sektörüne ilk adımı atın.',
+ ],
+ [
+ 'slug' => 'sivilastirilmis-gaz-tankerlerinde-yuk-i-slemleri-temel-egitimi',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Sıvılaştırılmış Gaz Tankerlerinde Yük İşlemleri Temel Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'LPG ve LNG tankerlerinde görev yapacak personelin sıvılaştırılmış gaz yükleriyle güvenli çalışma yetkinliği kazanmasını sağlayan STCW eğitimi.',
+ 'long_desc' => 'Sıvılaştırılmış Gaz Tankerlerinde Yük İşlemleri Temel Eğitimi, LPG ve LNG tankerlerinde görev yapacak personelin sıvılaştırılmış gaz yükleriyle güvenli çalışma konusunda yetkinlik kazanmasını sağlayan bir STCW eğitimidir.',
+ 'duration' => '2 Gün',
+ 'students' => 840,
+ 'rating' => 4.5,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'Sıvılaştırılmış gazların fiziksel ve kimyasal özellikleri',
+ 'Yük elleçleme ve transfer prosedürleri',
+ 'Gaz algılama ve kişisel güvenlik',
+ 'IGC Kod gereklilikleri',
+ ],
+ 'requirements' => [
+ 'Geçerli sağlık raporuna sahip olmak',
+ '18 yaş ve üzeri olmak',
+ ],
+ 'meta_title' => 'Sıvılaştırılmış Gaz Tanker Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'LPG/LNG tankerlerinde çalışmak için STCW temel eğitim başvurusu.',
+ ],
+ [
+ 'slug' => 'temel-i-lk-yardim',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Temel İlk Yardım',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemide meydana gelebilecek kaza ve acil sağlık durumlarında ilk müdahaleyi yapabilecek personelin yetiştirilmesine yönelik STCW zorunlu eğitim.',
+ 'long_desc' => 'Temel İlk Yardım eğitimi, gemide meydana gelebilecek kaza ve acil sağlık durumlarında ilk müdahaleyi yapabilecek personelin yetiştirilmesine yönelik STCW zorunlu eğitimlerinden biridir.',
+ 'duration' => '3 Gün',
+ 'students' => 299,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Temel yaşam desteği (CPR) uygulamaları',
+ 'Kanama kontrolü ve yara bakımı',
+ 'Yanık ve hipotermi tedavisi',
+ 'Hasta ve yaralı taşıma teknikleri',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'Denizcilik sektöründe çalışıyor veya çalışacak olmak',
+ ],
+ 'meta_title' => 'Temel İlk Yardım Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW temel ilk yardım eğitimi başvurusu. Gemide acil sağlık durumlarına hazır olun.',
+ ],
+ [
+ 'slug' => 'tibbi-bakim-egitimi',
+ 'category_id' => $cats['stcw'],
+ 'title' => 'Tıbbi Bakım Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemide tıbbi sorumlu olarak görev yapacak zabitlerin ileri düzey tıbbi bakım ve müdahale yetkinliği kazanmasını sağlayan STCW eğitimi.',
+ 'long_desc' => 'Tıbbi Bakım Eğitimi, gemide tıbbi sorumlu olarak görev yapacak zabitlerin ileri düzey tıbbi bakım ve müdahale yetkinliği kazanmasını sağlayan bir STCW eğitimidir. Uzak deniz seferlerinde tıbbi desteğin sınırlı olduğu durumlarda etkin müdahale becerisi kazandırır.',
+ 'duration' => '3 Gün',
+ 'students' => 369,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺3.000',
+ 'includes' => [
+ 'İleri yaşam desteği uygulamaları',
+ 'İlaç yönetimi ve gemi eczanesi',
+ 'TMAS ile iletişim ve teletıp',
+ 'Psikolojik ilk yardım ve kriz müdahalesi',
+ ],
+ 'requirements' => [
+ 'En az zabit düzeyinde yeterliğe sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Tıbbi Bakım Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW tıbbi bakım eğitimi. Gemide sağlık sorumluluğu üstlenmek için gerekli yeterlilik.',
+ ],
+
+ // ── MAKİNE EĞİTİMLERİ ─────────────────────────────────────────
+ [
+ 'slug' => 'yagci-birlesik',
+ 'category_id' => $cats['makine'],
+ 'title' => 'Yağcı (Birleşik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemilerin makine dairesinde yağcı olarak görev yapacak adayların yetiştirilmesine yönelik kapsamlı eğitim programı.',
+ 'long_desc' => 'Yağcı (Birleşik) Eğitimi, gemilerin makine dairesinde yağcı olarak görev yapacak adayların yetiştirilmesine yönelik kapsamlı bir eğitim programıdır. Denizde güvenlik modülleri ile mesleki eğitimi tek bir programda birleştirmektedir.',
+ 'duration' => '32 Gün',
+ 'students' => 404,
+ 'rating' => 4.5,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'Denizde güvenlik ve can kurtarma teknikleri',
+ 'Ana makine ve yardımcı makine tanıtımı',
+ 'Makine dairesi vardiya prosedürleri',
+ 'Yağlama sistemleri ve bakımı',
+ 'Pompa ve boru sistemleri',
+ ],
+ 'requirements' => [
+ '16 yaşını bitirmiş olmak',
+ 'En az ortaöğretim mezunu olmak',
+ 'Sağlık raporu almaya engel durumu bulunmamak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Yağcı (Birleşik) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => '32 günlük Yağcı (Birleşik) eğitimi başvurusu. STCW uyumlu makine dairesi personel programı.',
+ ],
+ [
+ 'slug' => 'yagci-temel',
+ 'category_id' => $cats['makine'],
+ 'title' => 'Yağcı (Temel)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Denizde güvenlik eğitimlerini tamamlamış adayların yağcı yeterlik belgesi alabilmesi için gereken mesleki bilgi ve becerileri kazandıran program.',
+ 'long_desc' => 'Yağcı (Temel) Eğitimi, denizde güvenlik eğitimlerini daha önce tamamlamış adayların yağcı yeterlik belgesi alabilmesi için gereken mesleki bilgi ve becerileri kazandıran bir programdır.',
+ 'duration' => '19 Gün',
+ 'students' => 519,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺4.500',
+ 'includes' => [
+ 'Ana makine ve yardımcı makine sistemleri',
+ 'Makine dairesi vardiya prosedürleri',
+ 'Yağlama ve soğutma sistemleri',
+ 'Temel elektrik bilgisi',
+ ],
+ 'requirements' => [
+ '16 yaş ve üzeri olmak',
+ 'En az orta öğretim mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Yağcı (Temel) Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Yağcı (Temel) eğitimi başvurusu. 19 günlük STCW uyumlu makine dairesi programı.',
+ ],
+ [
+ 'slug' => 'usta-makine-tayfasi-yetistirme-egitimi-a-iii-5',
+ 'category_id' => $cats['makine'],
+ 'title' => 'Usta Makine Tayfası Yetiştirme Eğitimi (A-III/5)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'STCW Kod A-III/5 gerekliliklerine uygun, deneyimli makine tayfasının ileri düzey yetkinlik kazanmasını sağlayan eğitim.',
+ 'long_desc' => 'Usta Makine Tayfası Yetiştirme Eğitimi, STCW Kod A-III/5 gerekliliklerine uygun olarak deneyimli makine tayfasının ileri düzey yetkinlik kazanmasını sağlayan bir programdır. Makine bölümünde kariyer basamaklarını tırmanan profesyoneller için tasarlanmıştır.',
+ 'duration' => '10 Gün',
+ 'students' => 807,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'İleri makine bakım ve onarım teknikleri',
+ 'Otomasyon ve kontrol sistemleri',
+ 'Enerji verimliliği ve yakıt yönetimi',
+ 'Arıza teşhis ve giderme yöntemleri',
+ ],
+ 'requirements' => [
+ '18 yaşını bitirmiş olmak',
+ 'Yağcı yeterlik belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Usta Makine Tayfası (A-III/5) | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW A-III/5 Usta Makine Tayfası eğitimi. Makine bölümünde kariyer basamağınızı yükseltin.',
+ ],
+ [
+ 'slug' => 'dizel-motor-teknigi',
+ 'category_id' => $cats['makine'],
+ 'title' => 'Dizel Motor Tekniği',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemi dizel motorlarının yapısını, çalışma prensibini ve bakım prosedürlerini kapsayan uygulamalı makine dairesi eğitimi.',
+ 'long_desc' => 'Gemi dizel motorlarının yapısını, çalışma prensibini ve bakım prosedürlerini kapsayan uygulamalı makine dairesi eğitimi. Deneyimli makine mühendisleri eşliğinde motor bakımı ve arıza giderme becerilerinizi geliştirin.',
+ 'duration' => '4 Gün',
+ 'students' => 380,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺4.000',
+ 'includes' => [
+ 'Dizel motor çalışma prensibi ve bileşenleri',
+ 'Motor bakım planlaması ve prosedürleri',
+ 'Arıza teşhis ve giderme',
+ 'Yakıt sistemleri ve yönetimi',
+ ],
+ 'requirements' => [
+ 'Makine bölümünde çalışma deneyimi',
+ 'Teknik lise mezunu (tercih)',
+ 'İş güvenliği sertifikası',
+ ],
+ 'meta_title' => 'Dizel Motor Tekniği Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Gemi dizel motor tekniği eğitimi başvurusu. Makine dairesinde uzmanlık kazanın.',
+ ],
+ [
+ 'slug' => 'makine-dairesi-operasyonu',
+ 'category_id' => $cats['makine'],
+ 'title' => 'Makine Dairesi Operasyonu',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemi makine dairesinin günlük operasyonu, sistemlerin yönetimi ve güvenli çalışma prosedürlerini kapsayan kapsamlı makine eğitimi.',
+ 'long_desc' => 'Gemi makine dairesinin günlük operasyonu, sistemlerin yönetimi ve güvenli çalışma prosedürlerini kapsayan kapsamlı makine eğitimi. Makine dairesindeki tüm sistemler ve ekipmanların tanıtımını içeren uygulamalı bir programdır.',
+ 'duration' => '3 Gün',
+ 'students' => 310,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺3.500',
+ 'includes' => [
+ 'Makine dairesi sistemleri tanıtımı',
+ 'Günlük operasyon prosedürleri',
+ 'Güvenli çalışma uygulamaları',
+ 'Acil durum prosedürleri',
+ ],
+ 'requirements' => [
+ 'Makine bölümünde çalışıyor olmak veya olmak istemek',
+ 'Temel elektrik ve mekanik bilgisi',
+ ],
+ 'meta_title' => 'Makine Dairesi Operasyonu Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'Gemi makine dairesi operasyonu eğitimi. Sistematik ve güvenli makine yönetimi öğrenin.',
+ ],
+
+ // ── YAT KAPTANLIĞI ─────────────────────────────────────────────
+ [
+ 'slug' => 'yat-kaptani-25-gt',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (25 GT)',
+ 'sub' => 'Kaptan Yeterlik Belgesi',
+ 'desc' => '25 GT\'ye kadar yat ve teknelerde kaptan olarak görev yapabilmek için gereken yeterlik eğitimi.',
+ 'long_desc' => '25 GT\'ye kadar yat ve teknelerde kaptan olarak görev yapabilmek için gereken yeterlik eğitimi. Kıyı seyri, temel seyir bilgisi ve deniz güvenliği konularını kapsayan bu program, yat kaptanlığı kariyerinin ilk adımıdır.',
+ 'duration' => '3 Gün',
+ 'students' => 880,
+ 'rating' => 4.8,
+ 'badge' => 'popular',
+ 'price' => '₺3.500',
+ 'includes' => [
+ 'Kıyı seyri temel bilgileri',
+ 'Yat manevrası ve demirleme',
+ 'Deniz hukuku ve mevzuat',
+ 'VHF telsiz kullanımı',
+ 'Temel meteoroloji bilgisi',
+ ],
+ 'requirements' => [
+ 'En az 18 yaşında olmak',
+ 'STCW Temel Güvenlik (BST) sertifikası',
+ 'En az 200 saat deniz seyir tecrübesi',
+ 'Doktor raporu (denizcilik sağlık belgesi)',
+ ],
+ 'meta_title' => 'Yat Kaptanı 25 GT Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => '25 GT yat kaptanlığı eğitimi ve sertifika programı. Denizcilik kariyerinize yön verin.',
+ ],
+ [
+ 'slug' => 'yat-kaptani-149-gt-egitimi-birlesik',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (149 GT) Eğitimi (Birleşik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => '149 GT\'ye kadar yatlarda kaptan olarak görev yapacak adayları yetiştiren kapsamlı eğitim. Denizde güvenlik modülleri ile yat kaptanlığını birleştirir.',
+ 'long_desc' => 'Yat Kaptanı (149 GT) Eğitimi Birleşik programı, 149 Gross Ton\'a kadar olan ticari ve özel yatlarda kaptan olarak görev yapacak adayları yetiştiren kapsamlı bir eğitimdir. Türkiye\'nin zengin kıyı şeridi ve büyüyen yat turizmi sektörü, nitelikli yat kaptanlarına olan talebi artırmaktadır.',
+ 'duration' => '25 Gün',
+ 'students' => 463,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺5.200',
+ 'includes' => [
+ 'Denizde güvenlik ve can kurtarma',
+ 'Kıyı seyri ve seyir planlaması',
+ 'Deniz haritaları ve seyir aletleri kullanımı',
+ 'Deniz hukuku ve liman mevzuatı',
+ 'Yat manevraları ve demirleme',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'En az lise mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Yat Kaptanı (149 GT) Birleşik Eğitim | Boğaziçi Denizcilik',
+ 'meta_description' => '149 GT yat kaptanlığı birleşik eğitimi. Güvenlik modülleri dahil kapsamlı program.',
+ ],
+ [
+ 'slug' => 'yat-kaptani-149-gt-egitimi-temel',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (149 GT) Eğitimi (Temel)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Güvenlik eğitimlerini tamamlamış adayların 149 GT yat kaptanlığı yeterliliği kazanması için tasarlanmış temel mesleki program.',
+ 'long_desc' => 'Yat Kaptanı (149 GT) Eğitimi Temel programı, denizde güvenlik eğitimlerini tamamlamış adayların yat kaptanlığı yeterliliği kazanması için tasarlanmış bir eğitimdir. 149 GT\'ye kadar yatlarda kaptan olarak görev yapacak adayların mesleki bilgi ve becerilerini geliştirmeye odaklanmaktadır.',
+ 'duration' => '10 Gün',
+ 'students' => 830,
+ 'rating' => 5.0,
+ 'badge' => null,
+ 'price' => '₺4.500',
+ 'includes' => [
+ 'Kıyı seyri ve harita çalışması',
+ 'Seyir aletleri ve GPS/plotter kullanımı',
+ 'Deniz hukuku ve mevzuat',
+ 'VHF haberleşme prosedürleri',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'En az lise mezunu olmak',
+ 'Denizde güvenlik eğitimlerini tamamlamış olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Yat Kaptanı 149 GT Temel Eğitim | Boğaziçi Denizcilik',
+ 'meta_description' => '149 GT yat kaptanlığı temel eğitimi. BST belgesi olanlar için 10 günlük yoğun program.',
+ ],
+ [
+ 'slug' => 'yat-kaptani-499-gt-temel',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (499 GT) (Temel)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => '149 GT yat kaptanı belgesine sahip adayların 499 GT yat kaptanlığına yükselmesini sağlayan ileri düzey eğitim.',
+ 'long_desc' => 'Yat Kaptanı (499 GT) Temel programı, güvenlik eğitimlerini tamamlamış ve 149 GT yat kaptanı belgesine sahip adayların 499 GT yat kaptanlığına yükselmesini sağlayan ileri düzey bir eğitimdir.',
+ 'duration' => '35 Gün',
+ 'students' => 410,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'İleri seyir ve rota planlama',
+ 'ECDIS ve elektronik harita sistemleri',
+ 'Radar/ARPA çatışma önleme',
+ 'Gemi stabilitesi ve yük yönetimi',
+ ],
+ 'requirements' => [
+ 'Yat Kaptanı (149 GT) belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Yat Kaptanı 499 GT Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => '499 GT yat kaptanlığı eğitimi. 149 GT belge sahiplerine özel ileri yeterlik programı.',
+ ],
+ [
+ 'slug' => 'yat-kaptani-3000-gt',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (3000 GT)',
+ 'sub' => 'Kaptan Yeterlik Belgesi',
+ 'desc' => '3000 GT\'ye kadar büyük yatlarda kaptan olarak görev yapabilmek için gereken en üst düzey yat kaptanlığı yeterlik programı.',
+ 'long_desc' => '3000 GT\'ye kadar büyük yatlarda kaptan olarak görev yapabilmek için gereken en üst düzey yat kaptanlığı yeterlik programı. Süperyat sektöründe kariyer hedefleyen deneyimli kaptanlar için kapsamlı bir ileri eğitimdir.',
+ 'duration' => '10 Gün',
+ 'students' => 195,
+ 'rating' => 4.9,
+ 'badge' => null,
+ 'price' => '₺9.500',
+ 'includes' => [
+ 'İleri uluslararası seyir teknikleri',
+ 'Büyük yat operasyonları ve yönetimi',
+ 'Mürettebat yönetimi ve liderlik',
+ 'Uluslararası deniz hukuku',
+ ],
+ 'requirements' => [
+ 'Yat Kaptanı 499 GT belgesi',
+ 'En az 2000 saat deniz seyir tecrübesi',
+ 'GMDSS GOC sertifikası',
+ ],
+ 'meta_title' => 'Yat Kaptanı 3000 GT Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => '3000 GT yat kaptanlığı eğitimi. Süperyat sektöründe kariyer yapmak için en üst yeterlik.',
+ ],
+ [
+ 'slug' => 'yat-kaptani-149-gt-tazeleme-egitimi',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (149 GT) Tazeleme Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => '149 GT yat kaptanlığı belgesinin geçerlilik süresini uzatmak için seyir teknolojileri ve güncel mevzuatı kapsayan tazeleme programı.',
+ 'long_desc' => 'Yat Kaptanı (149 GT) Tazeleme Eğitimi, 149 GT yat kaptanlığı belgesinin geçerlilik süresini uzatmak isteyen kaptanların mesleki yetkinliklerini güncellemesini sağlayan bir yenileme programıdır.',
+ 'duration' => '5 Gün',
+ 'students' => 679,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Güncel seyir teknolojileri ve uygulamaları',
+ 'Güvenlik standartları güncellemeleri',
+ 'Deniz mevzuatı değişiklikleri',
+ 'Acil durum prosedürleri tazelemesi',
+ ],
+ 'requirements' => [
+ 'Geçerli veya süresi dolmuş Yat Kaptanı (149 GT) belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Yat Kaptanı 149 GT Tazeleme | Boğaziçi Denizcilik',
+ 'meta_description' => '149 GT yat kaptanlığı belge tazeleme eğitimi. Belgenizin geçerliliğini uzatın.',
+ ],
+ [
+ 'slug' => 'yat-kaptani-499-gt-tazeleme-egitimi',
+ 'category_id' => $cats['yat-kaptanligi'],
+ 'title' => 'Yat Kaptanı (499 GT) Tazeleme Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => '499 GT yat kaptanlığı belgesinin geçerlilik süresini uzatmak isteyen kaptanlar için ileri düzey mesleki bilgi güncelleme programı.',
+ 'long_desc' => 'Yat Kaptanı (499 GT) Tazeleme Eğitimi, 499 GT yat kaptanlığı belgesinin geçerlilik süresini uzatmak isteyen kaptanların ileri düzey mesleki bilgilerini güncellemesini sağlayan bir yenileme programıdır.',
+ 'duration' => '5 Gün',
+ 'students' => 564,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺5.200',
+ 'includes' => [
+ 'İleri seyir teknolojileri ve ECDIS güncellemeleri',
+ 'Uluslararası deniz hukuku güncellemeleri',
+ 'Büyük yat güvenlik prosedürleri',
+ 'Acil durum yönetimi ve tatbikat değerlendirme',
+ ],
+ 'requirements' => [
+ 'Geçerli veya süresi dolmuş Yat Kaptanı (499 GT) belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Yat Kaptanı 499 GT Tazeleme | Boğaziçi Denizcilik',
+ 'meta_description' => '499 GT yat kaptanlığı belge tazeleme eğitimi. Mesleki bilgilerinizi güncelleyin.',
+ ],
+
+ // ── YENİLEME EĞİTİMLERİ ───────────────────────────────────────
+ [
+ 'slug' => 'denizde-guvenlik-egitimleri-yenileme-teorik',
+ 'category_id' => $cats['yenileme'],
+ 'title' => 'Denizde Güvenlik Eğitimleri Yenileme (Teorik)',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Süresi dolan denizde güvenlik belgelerini yenilemek isteyen denizciler için kısa süreli teorik güncelleme programı.',
+ 'long_desc' => 'Denizde Güvenlik Eğitimleri Yenileme programı, daha önce alınan denizde güvenlik eğitimlerinin süresi dolan denizcilerin bilgi ve becerilerini güncellemesini sağlayan zorunlu bir tazeleme eğitimidir.',
+ 'duration' => '2 Gün',
+ 'students' => 561,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'Güncellenmiş deniz güvenliği prosedürleri',
+ 'Can kurtarma teknikleri tazelemesi',
+ 'Mevzuat değişiklikleri ve yeni düzenlemeler',
+ 'Vaka çalışmaları ve senaryo analizleri',
+ ],
+ 'requirements' => [
+ 'Daha önce denizde güvenlik eğitimlerini tamamlamış olmak',
+ 'Belge yenileme süresinde olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Denizde Güvenlik Yenileme (Teorik) | Boğaziçi Denizcilik',
+ 'meta_description' => 'BST/STCW belge yenileme eğitimi. 2 günlük teorik güncelleme programı.',
+ ],
+ [
+ 'slug' => 'bst-yenileme',
+ 'category_id' => $cats['yenileme'],
+ 'title' => 'BST Yenileme',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Süresi dolmak üzere olan veya süresi dolmuş BST belgesini yenilemek isteyen denizciler için kısa güncelleme eğitimi.',
+ 'long_desc' => 'BST Yenileme Eğitimi, Basic Safety Training belgesinin yenilenmesi için gerekli kısa süreli güncelleme programıdır. Güncel güvenlik prosedürleri ve mevzuat değişiklikleri konusunda bilgi tazeleyerek belgenizin geçerliliğini uzatın.',
+ 'duration' => '1 Gün',
+ 'students' => 420,
+ 'rating' => 4.7,
+ 'badge' => null,
+ 'price' => '₺1.800',
+ 'includes' => [
+ 'BST kapsamı güvenlik bilgisi tazelemesi',
+ 'Can kurtarma araçları güncelleme',
+ 'Yangın güvenliği güncel uygulamalar',
+ 'Mevzuat ve standart değişiklikleri',
+ ],
+ 'requirements' => [
+ 'Geçerli/Süresi dolmuş BST sertifikası',
+ 'Denizcilik sağlık belgesi',
+ ],
+ 'meta_title' => 'BST Yenileme Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'BST belge yenileme eğitimi. 1 günlük kısa güncelleme ile sertifikanızı yenileyin.',
+ ],
+ [
+ 'slug' => 'guverte-sinirli-i-sletim-duzeyi-tazeleme-egitimi',
+ 'category_id' => $cats['yenileme'],
+ 'title' => 'Güverte Sınırlı İşletim Düzeyi Tazeleme Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Sınırlı vardiya zabiti belgesinin geçerlilik süresini uzatmak isteyen güverte zabitlerinin mesleki bilgilerini güncelleyen tazeleme programı.',
+ 'long_desc' => 'Güverte Sınırlı İşletim Düzeyi Tazeleme Eğitimi, sınırlı vardiya zabiti belgesinin geçerlilik süresini uzatmak isteyen güverte zabitlerinin mesleki bilgilerini güncellemesini sağlayan bir yenileme programıdır.',
+ 'duration' => '5 Gün',
+ 'students' => 506,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Güncel seyir teknolojileri ve ECDIS',
+ 'COLREG ve mevzuat güncellemeleri',
+ 'Radar/ARPA kullanım pratiği',
+ 'Deniz kazaları vaka çalışmaları',
+ ],
+ 'requirements' => [
+ 'Geçerli veya süresi dolmuş sınırlı vardiya zabiti belgesine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Güverte Sınırlı İşletim Tazeleme | Boğaziçi Denizcilik',
+ 'meta_description' => 'Güverte sınırlı vardiya zabiti belge tazeleme eğitimi. 5 günlük güncelleme programı.',
+ ],
+
+ // ── GÜVENLİK (ISPS) ───────────────────────────────────────────
+ [
+ 'slug' => 'gemi-guvenlik-zabiti',
+ 'category_id' => $cats['guvenlik'],
+ 'title' => 'Gemi Güvenlik Zabiti',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'ISPS Kod gereklilikleri doğrultusunda gemide güvenlik sorumluluğunu üstlenecek zabitler için kapsamlı güvenlik yeterlilik programı.',
+ 'long_desc' => 'Gemi Güvenlik Zabiti Eğitimi, ISPS Kod gereklilikleri doğrultusunda gemide güvenlik sorumluluğunu üstlenecek zabitlerin yetiştirilmesine yönelik önemli bir programdır. Gemi güvenlik planının uygulanması ve güvenlik tehditlerinin yönetilmesi konularında kapsamlı bilgi sunar.',
+ 'duration' => '2 Gün',
+ 'students' => 465,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'ISPS Kod gereklilikleri ve uygulamaları',
+ 'Gemi güvenlik planı hazırlama ve yönetimi',
+ 'Güvenlik değerlendirmesi ve denetim',
+ 'Güvenlik ekipmanları ve sistemleri',
+ ],
+ 'requirements' => [
+ 'En az 12 ay deniz hizmetine sahip olmak',
+ 'En az zabit düzeyinde yeterliğe sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ ],
+ 'meta_title' => 'Gemi Güvenlik Zabiti Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'ISPS Kod Gemi Güvenlik Zabiti eğitimi. Gemide güvenlik sorumluluğu için zorunlu yeterlik.',
+ ],
+ [
+ 'slug' => 'sirket-guvenlik-sorumlusu',
+ 'category_id' => $cats['guvenlik'],
+ 'title' => 'Şirket Güvenlik Sorumlusu',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'ISPS Kod kapsamında denizcilik şirketlerinin kara ofislerinde güvenlik yönetim sorumluluğunu üstlenecek personelin yetiştirildiği program.',
+ 'long_desc' => 'Şirket Güvenlik Sorumlusu Eğitimi, ISPS Kod kapsamında denizcilik şirketlerinin kara ofislerinde güvenlik yönetim sorumluluğunu üstlenecek personelin yetiştirilmesini hedefleyen bir programdır. Filo güvenlik yönetimi konusunda derinlemesine bilgi ve beceri kazandırır.',
+ 'duration' => '3 Gün',
+ 'students' => 435,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺4.500',
+ 'includes' => [
+ 'ISPS Kod ve uluslararası güvenlik mevzuatı',
+ 'Şirket güvenlik politikası oluşturma',
+ 'Güvenlik değerlendirmesi ve risk analizi',
+ 'İç ve dış denetim süreçleri',
+ ],
+ 'requirements' => [
+ 'Zabit yeterliğine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Şirket Güvenlik Sorumlusu Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'ISPS Şirket Güvenlik Sorumlusu sertifika programı. Denizcilik şirketleri için zorunlu yeterlik.',
+ ],
+ [
+ 'slug' => 'birlestirilmis-gemi-guvenlik-zabiti-ve-sirket-guvenlik-sorumlusu-egitimi',
+ 'category_id' => $cats['guvenlik'],
+ 'title' => 'Birleştirilmiş Gemi Güvenlik Zabiti ve Şirket Güvenlik Sorumlusu Eğitimi',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'Gemi Güvenlik Zabiti ve Şirket Güvenlik Sorumlusu yeterliklerini tek bir programda birleştiren entegre eğitim.',
+ 'long_desc' => 'Birleştirilmiş Gemi Güvenlik Zabiti ve Şirket Güvenlik Sorumlusu Eğitimi, ISPS Kod gerekliliklerini hem gemi hem de şirket tarafında karşılayacak personelin yetiştirilmesi için tasarlanmış entegre bir programdır. İki yeterliliği tek bir programda birleştirerek zaman ve maliyet avantajı sağlar.',
+ 'duration' => '4 Gün',
+ 'students' => 118,
+ 'rating' => 4.8,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'ISPS Kod kapsamlı uygulama ve gereklilikler',
+ 'Gemi güvenlik planı hazırlama ve yönetimi',
+ 'Şirket güvenlik politikası ve prosedürleri',
+ 'Gemi-kıyı güvenlik koordinasyonu',
+ ],
+ 'requirements' => [
+ 'Zabit yeterliğine sahip olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Birleştirilmiş Gemi + Şirket Güvenlik Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'ISPS kapsamlı iki yeterliği tek programda alın. Gemi ve Şirket Güvenlik Sorumlusu birleşik eğitim.',
+ ],
+ [
+ 'slug' => 'balikci-gemisi-tayfasi-deniz-guvenlik-egitimleri',
+ 'category_id' => $cats['guvenlik'],
+ 'title' => 'Balıkçı Gemisi Tayfası Deniz Güvenlik Eğitimleri',
+ 'sub' => 'STCW-F / IMO Uyumlu',
+ 'desc' => 'Balıkçı gemilerinde görev yapacak tayfaların denizde karşılaşabilecekleri tehlikelere karşı hazırlanmasını sağlayan zorunlu eğitim.',
+ 'long_desc' => 'Balıkçı Gemisi Tayfası Deniz Güvenlik Eğitimleri, balıkçı gemilerinde görev yapacak tayfaların denizde karşılaşabilecekleri tehlikelere karşı hazırlanmasını sağlayan zorunlu bir eğitim programıdır. STCW-F Sözleşmesi gerekliliklerine uygun olarak verilmektedir.',
+ 'duration' => '4 Gün',
+ 'students' => 206,
+ 'rating' => 4.6,
+ 'badge' => null,
+ 'price' => '₺2.500',
+ 'includes' => [
+ 'Denizde kişisel can kurtarma teknikleri',
+ 'Yangın önleme ve söndürme yöntemleri',
+ 'Denizde hayatta kalma teknikleri',
+ 'Temel ilk yardım bilgisi',
+ ],
+ 'requirements' => [
+ '18 yaş ve üzeri olmak',
+ 'En az ilköğretim mezunu olmak',
+ 'Geçerli sağlık raporuna sahip olmak',
+ 'Adli sicil kaydında engel bulunmamak',
+ ],
+ 'meta_title' => 'Balıkçı Gemisi Tayfası Güvenlik Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'STCW-F balıkçı gemisi tayfası deniz güvenlik eğitimi. Balıkçılık sektöründe güvenli çalışın.',
+ ],
+ [
+ 'slug' => 'gemi-guvenlik-egitimleri',
+ 'category_id' => $cats['guvenlik'],
+ 'title' => 'Gemi Güvenlik Eğitimleri',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'ISPS Kod kapsamında tüm gemi personelinin güvenlik bilincini artırmaya yönelik zorunlu eğitim programı.',
+ 'long_desc' => 'Gemi Güvenlik Eğitimleri, ISPS Kod kapsamında tüm gemi personelinin güvenlik bilincini artırmaya yönelik zorunlu bir eğitim programıdır. Gemide güvenlik kültürünün oluşturulması ve sürdürülmesi için temel bilgileri kapsamaktadır.',
+ 'duration' => '2 Gün',
+ 'students' => 416,
+ 'rating' => 5.0,
+ 'badge' => null,
+ 'price' => '₺7.500',
+ 'includes' => [
+ 'ISPS Kod genel bilgi ve gereklilikler',
+ 'Güvenlik tehditleri ve risk değerlendirmesi',
+ 'Güvenlik seviyeleri ve prosedürler',
+ 'Güvenlik tatbikatları ve uygulamaları',
+ ],
+ 'requirements' => [
+ 'Gemide görev yapıyor veya yapacak olmak',
+ '18 yaş ve üzeri olmak',
+ ],
+ 'meta_title' => 'Gemi Güvenlik Eğitimi | Boğaziçi Denizcilik',
+ 'meta_description' => 'ISPS Kod gemi güvenlik eğitimi. Tüm gemi personeli için zorunlu güvenlik bilinci programı.',
+ ],
+ [
+ 'slug' => 'liman-tesisi-guvenlik-sorumlusu',
+ 'category_id' => $cats['guvenlik'],
+ 'title' => 'Liman Tesisi Güvenlik Sorumlusu',
+ 'sub' => 'STCW / IMO Uyumlu',
+ 'desc' => 'ISPS Kod kapsamında liman tesislerinin güvenlik yönetiminden sorumlu olacak personelin yetiştirilmesine yönelik program.',
+ 'long_desc' => 'Liman Tesisi Güvenlik Sorumlusu Eğitimi, ISPS Kod kapsamında liman tesislerinin güvenlik yönetiminden sorumlu olacak personelin yetiştirilmesine yönelik bir programdır. Liman tesisi güvenlik planının hazırlanması, uygulanması ve denetlenmesi konularında kapsamlı bilgi kazandırmaktadır.',
+ 'duration' => '3 Gün',
+ 'students' => 769,
+ 'rating' => 5.0,
+ 'badge' => null,
+ 'price' => '₺5.200',
+ 'includes' => [
+ 'ISPS Kod ve liman tesisi güvenliği',
+ 'Liman tesisi güvenlik değerlendirmesi',
+ 'Erişim kontrolü ve gözetleme sistemleri',
+ 'Güvenlik denetimi ve iç tetkik',
+ ],
+ 'requirements' => [
+ 'Liman tesisinde görev yapıyor veya yapacak olmak',
+ 'En az ortaöğretim mezunu olmak',
+ ],
+ 'meta_title' => 'Liman Tesisi Güvenlik Sorumlusu | Boğaziçi Denizcilik',
+ 'meta_description' => 'ISPS Liman Tesisi Güvenlik Sorumlusu sertifika programı. Liman güvenlik yönetimi için zorunlu yeterlik.',
+ ],
+ ];
+
+ foreach ($courses as $data) {
+ Course::updateOrCreate(
+ ['slug' => $data['slug']],
+ $data,
+ );
+ }
+
+ // ── Mega menu sırası (her kategoriden 3 kurs) ─────────────────────
+ // Admin panelinden kurs düzenleyerek menu_order = 1, 2, 3 verilir.
+ // null olan kurslar mega menu'de görünmez.
+ $menuOrder = [
+ // Güverte
+ 'arpa-radar-simulator' => 1,
+ 'ecdis-tip-bazli-egitim' => 2,
+ 'gmdss-genel-telsiz-operatoru-goc' => 3,
+ // STCW
+ 'stcw-temel-guvenlik' => 1,
+ 'aff-yangin-sondurme' => 2,
+ 'denizde-kisisel-can-kurtarma-teknikleri-egitimi-teorik' => 3,
+ // Makine
+ 'dizel-motor-teknigi' => 1,
+ 'usta-makine-tayfasi-yetistirme-egitimi-a-iii-5' => 2,
+ 'makine-dairesi-operasyonu' => 3,
+ // Yat Kaptanlığı
+ 'yat-kaptani-25-gt' => 1,
+ 'yat-kaptani-149-gt-egitimi-temel' => 2,
+ 'yat-kaptani-3000-gt' => 3,
+ // Yenileme
+ 'bst-yenileme' => 1,
+ 'guverte-sinirli-i-sletim-duzeyi-tazeleme-egitimi' => 2,
+ 'denizde-guvenlik-egitimleri-yenileme-teorik' => 3,
+ // Güvenlik (ISPS)
+ 'gemi-guvenlik-zabiti' => 1,
+ 'liman-tesisi-guvenlik-sorumlusu' => 2,
+ 'gemi-guvenlik-egitimleri' => 3,
+ ];
+
+ foreach ($menuOrder as $slug => $order) {
+ Course::where('slug', $slug)->update(['menu_order' => $order]);
+ }
+ }
+}
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
new file mode 100644
index 0000000..bec1c45
--- /dev/null
+++ b/database/seeders/DatabaseSeeder.php
@@ -0,0 +1,31 @@
+call([
+ RolePermissionSeeder::class,
+ AdminUserSeeder::class,
+ SettingSeeder::class,
+ CategorySeeder::class,
+ CourseSeeder::class,
+ CourseScheduleSeeder::class,
+ AnnouncementSeeder::class,
+ HeroSlideSeeder::class,
+ FaqSeeder::class,
+ // MenuSeeder kaldırıldı - navbar categories + courses tablosundan dinamik olarak besleniyor
+ CorporatePagesSeeder::class,
+ ]);
+ }
+}
diff --git a/database/seeders/FaqContentSeeder.php b/database/seeders/FaqContentSeeder.php
new file mode 100644
index 0000000..91658d9
--- /dev/null
+++ b/database/seeders/FaqContentSeeder.php
@@ -0,0 +1,68 @@
+command->error('parsed_faqs.json bulunamadı. Önce Python parse script çalıştırın.');
+
+ return;
+ }
+
+ /** @var array $faqs */
+ $faqs = json_decode(file_get_contents($jsonPath), true);
+
+ $categoryMap = [
+ 'Guverte_Egitimleri' => 'egitimler',
+ 'STCW_Egitimleri' => 'stcw',
+ 'Makine_Egitimleri' => 'makine',
+ 'Yat_Kaptanligi_Egitimleri' => 'yat-kaptanligi',
+ 'Yenileme_Egitimleri' => 'yenileme',
+ 'Seminer_Sertifikalari' => 'guvenlik',
+ ];
+
+ $created = 0;
+ $skipped = 0;
+ $orderCounters = [];
+
+ foreach ($faqs as $faq) {
+ // Determine category from source folder
+ $sourceFolder = explode('/', $faq['source'])[0] ?? '';
+ $category = $categoryMap[$sourceFolder] ?? 'egitimler';
+
+ // Track order per category
+ $orderCounters[$category] = ($orderCounters[$category] ?? -1) + 1;
+
+ $result = Faq::firstOrCreate(
+ ['question' => $faq['question']],
+ [
+ 'category' => $category,
+ 'answer' => $faq['answer'],
+ 'order_index' => $orderCounters[$category],
+ 'is_active' => true,
+ ],
+ );
+
+ if ($result->wasRecentlyCreated) {
+ $created++;
+ } else {
+ $skipped++;
+ }
+ }
+
+ $this->command->info("FAQ: {$created} oluşturuldu, {$skipped} zaten mevcuttu.");
+ }
+}
diff --git a/database/seeders/FaqSeeder.php b/database/seeders/FaqSeeder.php
new file mode 100644
index 0000000..18f1fcc
--- /dev/null
+++ b/database/seeders/FaqSeeder.php
@@ -0,0 +1,83 @@
+truncate();
+
+ $faqs = [
+ // EĞİTİMLER
+ [
+ 'category' => 'egitimler',
+ 'question' => 'Eğitimleriniz hangi kurumlar tarafından onaylıdır?',
+ 'answer' => 'Tüm eğitimlerimiz Ulaştırma ve Altyapı Bakanlığı Denizcilik Genel Müdürlüğü onaylı olmakla birlikte, uluslararası IMO ve STCW sözleşmelerine %100 uyumludur.',
+ 'order_index' => 1,
+ 'is_active' => true,
+ ],
+ [
+ 'category' => 'egitimler',
+ 'question' => 'Simülatör eğitimleriniz nasıl gerçekleştiriliyor?',
+ 'answer' => 'Köprüüstü ARPA/Radar ve ECDIS eğitimlerimiz ile Makine Dairesi operasyonlarımız son teknoloji Kongsberg simülatör sistemleri ile uygulamalı olarak gerçekleştirilmektedir.',
+ 'order_index' => 2,
+ 'is_active' => true,
+ ],
+ [
+ 'category' => 'egitimler',
+ 'question' => 'Eğitim süreleri ne kadar devam ediyor?',
+ 'answer' => 'Temel sertifika programları 2-5 gün, yeterlik hazırlık kursları (Yat Kaptanlığı vb.) ise 10-15 gün arasında değişmektedir.',
+ 'order_index' => 3,
+ 'is_active' => true,
+ ],
+
+ // KAYIT SÜREÇLERİ
+ [
+ 'category' => 'kayit',
+ 'question' => 'Kayıt olmak için hangi belgelere ihtiyacım var?',
+ 'answer' => 'Kayıt olmak istediğiniz eğitim kategorisine göre değişiklik göstermekle beraber genel olarak; Gemiadamı Cüzdanı fotokopisi, Nüfus Cüzdanı, Fotoğraf ve Sağlık Raporu istenmektedir.',
+ 'order_index' => 4,
+ 'is_active' => true,
+ ],
+ [
+ 'category' => 'kayit',
+ 'question' => 'Ön kayıt sonrası ödeme süreci nasıl ilerliyor?',
+ 'answer' => 'Web sitemiz üzerinden ön kayıt oluşturduğunuzda eğitim danışmanlarımız sizi arayarak belgeleriniz ve kontenjan durumu hakkında bilgi verir. Kesin kayıt sırasında havale, EFT veya kredi kartı ile ödeme yapabilirsiniz.',
+ 'order_index' => 5,
+ 'is_active' => true,
+ ],
+ [
+ 'category' => 'kayit',
+ 'question' => 'Eğitimlere uzaktan (online) katılmak mümkün mü?',
+ 'answer' => 'Ulaştırma Bakanlığı mevzuatı gereği STCW kapsamındaki güvenlik eğitimleri ve harita uygulamaları örgün (yüz yüze) olmak zorundadır. Ancak bazı seminer ve yenileme teorik dersleri uzaktan eğitim modeliyle sunulabilmektedir.',
+ 'order_index' => 6,
+ 'is_active' => true,
+ ],
+
+ // İLETİŞİM & ULAŞIM
+ [
+ 'category' => 'iletisim',
+ 'question' => 'Eğitim merkezinize nasıl ulaşabilirim?',
+ 'answer' => 'Eğitim merkezimiz Kadıköy Rıhtım\'a 5 dakika yürüme mesafesinde, merkezi bir konumdadır. Şehir içinden metro, vapur veya otobüs ile kolayca ulaşım sağlayabilirsiniz.',
+ 'order_index' => 7,
+ 'is_active' => true,
+ ],
+ [
+ 'category' => 'iletisim',
+ 'question' => 'Şehir dışından gelenler için konaklama desteği var mı?',
+ 'answer' => 'Kurumumuza ait bir misafirhane bulunmamakla birlikte, anlaşmalı olduğumuz yakın otel ve yurtlarda öğrencilerimize özel indirimli fiyat avantajlarından yararlanmanızı sağlıyoruz.',
+ 'order_index' => 8,
+ 'is_active' => true,
+ ],
+ ];
+
+ DB::table('faqs')->insert(array_map(fn ($f) => array_merge($f, [
+ 'created_at' => now(),
+ 'updated_at' => now(),
+ ]), $faqs));
+ }
+}
diff --git a/database/seeders/HeroSlideSeeder.php b/database/seeders/HeroSlideSeeder.php
new file mode 100644
index 0000000..5ed6f96
--- /dev/null
+++ b/database/seeders/HeroSlideSeeder.php
@@ -0,0 +1,46 @@
+truncate();
+
+ $slides = [
+ [
+ 'label' => 'Güvenlik Eğitimleri',
+ 'title' => 'Profesyonel Eğitimle Güvenli Seferler İçin',
+ 'description' => 'IMO standartlarında yangın, cankurtarma ve tehlikeli madde eğitimleriyle kariyerinizi güvene alın.',
+ 'image' => null,
+ 'order_index' => 1,
+ 'is_active' => true,
+ ],
+ [
+ 'label' => 'Yat Kaptanlığı',
+ 'title' => 'Denizde Kendi Rotanızı Çizin',
+ 'description' => '149 GT ve 499 GT yat kaptanlığı eğitimleriyle Türkiye\'nin en gözde kıyılarında profesyonel kaptan olarak görev yapın.',
+ 'image' => null,
+ 'order_index' => 2,
+ 'is_active' => true,
+ ],
+ [
+ 'label' => 'Belge Yenileme',
+ 'title' => 'Belgelerinizi Zamanında Yenileyin',
+ 'description' => 'STCW yenileme, GOC/ROC tazeleme ve yat kaptanlığı tazeleme eğitimleriyle yeterliliklerinizi güncel tutun.',
+ 'image' => null,
+ 'order_index' => 3,
+ 'is_active' => true,
+ ],
+ ];
+
+ DB::table('hero_slides')->insert(array_map(fn ($s) => array_merge($s, [
+ 'created_at' => now(),
+ 'updated_at' => now(),
+ ]), $slides));
+ }
+}
diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php
new file mode 100644
index 0000000..ff603d8
--- /dev/null
+++ b/database/seeders/MenuSeeder.php
@@ -0,0 +1,100 @@
+truncate();
+
+ $now = now();
+
+ // ── HEADER menüsü ─────────────────────────────────────────────────
+ $headerItems = [
+ ['location' => 'header', 'label' => 'Anasayfa', 'url' => '/', 'type' => 'link', 'parent_id' => null, 'order' => 1, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Kurumsal', 'url' => '/kurumsal', 'type' => 'link', 'parent_id' => null, 'order' => 2, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Eğitimler', 'url' => '/egitimler', 'type' => 'link', 'parent_id' => null, 'order' => 3, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Eğitim Takvimi', 'url' => '/egitim-takvimi', 'type' => 'link', 'parent_id' => null, 'order' => 4, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Duyurular', 'url' => '/duyurular', 'type' => 'link', 'parent_id' => null, 'order' => 5, 'is_active' => true],
+ ['location' => 'header', 'label' => 'S.S.S.', 'url' => '/sss', 'type' => 'link', 'parent_id' => null, 'order' => 6, 'is_active' => true],
+ ['location' => 'header', 'label' => 'İletişim', 'url' => '/iletisim', 'type' => 'link', 'parent_id' => null, 'order' => 7, 'is_active' => true],
+ ];
+
+ foreach ($headerItems as $item) {
+ DB::table('menus')->insert(array_merge($item, ['created_at' => $now, 'updated_at' => $now]));
+ }
+
+ // Kurumsal dropdown parent id
+ $kurumsalId = DB::table('menus')->where('label', 'Kurumsal')->where('location', 'header')->value('id');
+
+ $kurumsalChildren = [
+ ['location' => 'header', 'label' => 'Hakkımızda', 'url' => '/kurumsal/hakkimizda', 'type' => 'link', 'parent_id' => $kurumsalId, 'order' => 1, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Vizyon ve Misyon', 'url' => '/kurumsal/vizyon-ve-misyon', 'type' => 'link', 'parent_id' => $kurumsalId, 'order' => 2, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Kalite Politikamız', 'url' => '/kurumsal/kalite-politikamiz', 'type' => 'link', 'parent_id' => $kurumsalId, 'order' => 3, 'is_active' => true],
+ ];
+
+ foreach ($kurumsalChildren as $item) {
+ DB::table('menus')->insert(array_merge($item, ['created_at' => $now, 'updated_at' => $now]));
+ }
+
+ // Eğitimler dropdown parent id
+ $egitimlerParentId = DB::table('menus')->where('label', 'Eğitimler')->where('location', 'header')->value('id');
+
+ $egitimlerChildren = [
+ ['location' => 'header', 'label' => 'Güverte Eğitimleri', 'url' => '/egitimler/guverte', 'type' => 'category', 'parent_id' => $egitimlerParentId, 'order' => 1, 'is_active' => true],
+ ['location' => 'header', 'label' => 'STCW Eğitimleri', 'url' => '/egitimler/stcw', 'type' => 'category', 'parent_id' => $egitimlerParentId, 'order' => 2, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Makine Eğitimleri', 'url' => '/egitimler/makine', 'type' => 'category', 'parent_id' => $egitimlerParentId, 'order' => 3, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Yat Kaptanlığı', 'url' => '/egitimler/yat-kaptanligi', 'type' => 'category', 'parent_id' => $egitimlerParentId, 'order' => 4, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Yenileme Eğitimleri', 'url' => '/egitimler/yenileme', 'type' => 'category', 'parent_id' => $egitimlerParentId, 'order' => 5, 'is_active' => true],
+ ['location' => 'header', 'label' => 'Güvenlik (ISPS)', 'url' => '/egitimler/guvenlik', 'type' => 'category', 'parent_id' => $egitimlerParentId, 'order' => 6, 'is_active' => true],
+ ];
+
+ foreach ($egitimlerChildren as $item) {
+ DB::table('menus')->insert(array_merge($item, ['created_at' => $now, 'updated_at' => $now]));
+ }
+
+ // ── FOOTER menüsü ─────────────────────────────────────────────────
+ $footerItems = [
+ // Kurumsal grubu
+ ['location' => 'footer', 'label' => 'Kurumsal', 'url' => '/kurumsal', 'type' => 'link', 'parent_id' => null, 'order' => 1, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Eğitimler', 'url' => '/egitimler', 'type' => 'link', 'parent_id' => null, 'order' => 2, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Hızlı Linkler', 'url' => '#', 'type' => 'link', 'parent_id' => null, 'order' => 3, 'is_active' => true],
+ ];
+
+ foreach ($footerItems as $item) {
+ DB::table('menus')->insert(array_merge($item, ['created_at' => $now, 'updated_at' => $now]));
+ }
+
+ $footerKurumsalId = DB::table('menus')->where('label', 'Kurumsal')->where('location', 'footer')->value('id');
+ $footerEgitimId = DB::table('menus')->where('label', 'Eğitimler')->where('location', 'footer')->value('id');
+ $footerHizliId = DB::table('menus')->where('label', 'Hızlı Linkler')->where('location', 'footer')->value('id');
+
+ $footerChildren = [
+ // Kurumsal alt menü
+ ['location' => 'footer', 'label' => 'Hakkımızda', 'url' => '/kurumsal/hakkimizda', 'type' => 'link', 'parent_id' => $footerKurumsalId, 'order' => 1, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Misyon & Vizyon', 'url' => '/kurumsal/vizyon-ve-misyon', 'type' => 'link', 'parent_id' => $footerKurumsalId, 'order' => 2, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Kalite Politikamız', 'url' => '/kurumsal/kalite-politikamiz', 'type' => 'link', 'parent_id' => $footerKurumsalId, 'order' => 3, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'İletişim', 'url' => '/iletisim', 'type' => 'link', 'parent_id' => $footerKurumsalId, 'order' => 4, 'is_active' => true],
+
+ // Eğitimler alt menü
+ ['location' => 'footer', 'label' => 'Tüm Eğitimler', 'url' => '/egitimler', 'type' => 'link', 'parent_id' => $footerEgitimId, 'order' => 1, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Güverte Eğitimleri', 'url' => '/egitimler/guverte', 'type' => 'link', 'parent_id' => $footerEgitimId, 'order' => 2, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'STCW Eğitimleri', 'url' => '/egitimler/stcw', 'type' => 'link', 'parent_id' => $footerEgitimId, 'order' => 3, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Yat Kaptanlığı', 'url' => '/egitimler/yat-kaptanligi', 'type' => 'link', 'parent_id' => $footerEgitimId, 'order' => 4, 'is_active' => true],
+
+ // Hızlı Linkler alt menü
+ ['location' => 'footer', 'label' => 'Eğitim Takvimi', 'url' => '/egitim-takvimi', 'type' => 'link', 'parent_id' => $footerHizliId, 'order' => 1, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Duyurular & Haberler', 'url' => '/duyurular', 'type' => 'link', 'parent_id' => $footerHizliId, 'order' => 2, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'Ön Kayıt Ekranı', 'url' => '/kayit', 'type' => 'link', 'parent_id' => $footerHizliId, 'order' => 3, 'is_active' => true],
+ ['location' => 'footer', 'label' => 'S.S.S.', 'url' => '/sss', 'type' => 'link', 'parent_id' => $footerHizliId, 'order' => 4, 'is_active' => true],
+ ];
+
+ foreach ($footerChildren as $item) {
+ DB::table('menus')->insert(array_merge($item, ['created_at' => $now, 'updated_at' => $now]));
+ }
+ }
+}
diff --git a/database/seeders/RolePermissionSeeder.php b/database/seeders/RolePermissionSeeder.php
new file mode 100644
index 0000000..2f73a1c
--- /dev/null
+++ b/database/seeders/RolePermissionSeeder.php
@@ -0,0 +1,78 @@
+
+ */
+ private const MODULES = [
+ 'category',
+ 'course',
+ 'schedule',
+ 'announcement',
+ 'hero-slide',
+ 'lead',
+ 'menu',
+ 'comment',
+ 'faq',
+ 'guide-card',
+ 'setting',
+ 'page',
+ 'user',
+ 'role',
+ ];
+
+ /**
+ * Her modül için oluşturulacak CRUD aksiyonlar.
+ *
+ * @var list
+ */
+ private const ACTIONS = ['view', 'create', 'update', 'delete'];
+
+ /**
+ * Editor rolüne verilmeyecek aksiyonlar.
+ *
+ * @var list
+ */
+ private const EDITOR_EXCLUDED_ACTIONS = ['delete'];
+
+ /**
+ * Run the database seeds.
+ */
+ public function run(): void
+ {
+ app()[PermissionRegistrar::class]->forgetCachedPermissions();
+
+ $allPermissions = [];
+ $editorPermissions = [];
+
+ foreach (self::MODULES as $module) {
+ foreach (self::ACTIONS as $action) {
+ $permissionName = "{$action}-{$module}";
+ Permission::firstOrCreate(['name' => $permissionName, 'guard_name' => 'web']);
+ $allPermissions[] = $permissionName;
+
+ if (! in_array($action, self::EDITOR_EXCLUDED_ACTIONS)) {
+ $editorPermissions[] = $permissionName;
+ }
+ }
+ }
+
+ // super-admin: tüm yetkiler
+ $superAdmin = Role::firstOrCreate(['name' => 'super-admin', 'guard_name' => 'web']);
+ $superAdmin->syncPermissions($allPermissions);
+
+ // editor: silme hariç tüm yetkiler
+ $editor = Role::firstOrCreate(['name' => 'editor', 'guard_name' => 'web']);
+ $editor->syncPermissions($editorPermissions);
+ }
+}
diff --git a/database/seeders/RoleSeeder.php b/database/seeders/RoleSeeder.php
new file mode 100644
index 0000000..cc25aca
--- /dev/null
+++ b/database/seeders/RoleSeeder.php
@@ -0,0 +1,18 @@
+general(),
+ ...$this->contact(),
+ ...$this->maps(),
+ ...$this->social(),
+ ...$this->seo(),
+ ...$this->analytics(),
+ ...$this->header(),
+ ...$this->footer(),
+ ...$this->integrations(),
+ ...$this->infoSections(),
+ ];
+
+ foreach ($settings as $setting) {
+ $value = $setting['value'];
+ unset($setting['value']);
+
+ Setting::query()->updateOrCreate(
+ ['group' => $setting['group'], 'key' => $setting['key']],
+ array_merge($setting, [
+ 'value' => Setting::query()
+ ->where('group', $setting['group'])
+ ->where('key', $setting['key'])
+ ->value('value') ?? $value,
+ ]),
+ );
+ }
+ }
+
+ /**
+ * @return list>
+ */
+ private function general(): array
+ {
+ $g = 'general';
+
+ return [
+ ['group' => $g, 'key' => 'site_name', 'value' => 'Boğaziçi Denizcilik Eğitim Kurumu', 'type' => 'text', 'label' => 'Site Adı', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'site_tagline', 'value' => null, 'type' => 'text', 'label' => 'Slogan', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'site_description', 'value' => null, 'type' => 'textarea', 'label' => 'Kısa Site Açıklaması', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'logo_light', 'value' => null, 'type' => 'image', 'label' => 'Logo — Açık Tema (beyaz navbar)', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'logo_dark', 'value' => null, 'type' => 'image', 'label' => 'Logo — Koyu Tema (dark bg)', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'favicon', 'value' => null, 'type' => 'image', 'label' => 'Favicon (32x32 PNG)', 'order_index' => 5, 'is_public' => true],
+ ['group' => $g, 'key' => 'apple_touch_icon', 'value' => null, 'type' => 'image', 'label' => 'Apple Touch Icon (180x180)', 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'announcement_bar_active', 'value' => 'false', 'type' => 'boolean', 'label' => 'Üst Bar Aktif mi', 'order_index' => 7, 'is_public' => true],
+ ['group' => $g, 'key' => 'announcement_bar_text', 'value' => null, 'type' => 'text', 'label' => 'Üst Bar Metni', 'order_index' => 8, 'is_public' => true],
+ ['group' => $g, 'key' => 'announcement_bar_url', 'value' => null, 'type' => 'url', 'label' => 'Üst Bar Linki', 'order_index' => 9, 'is_public' => true],
+ ['group' => $g, 'key' => 'announcement_bar_bg_color', 'value' => '#1a3e74', 'type' => 'color', 'label' => 'Üst Bar Arka Plan Rengi', 'order_index' => 10, 'is_public' => true],
+ ['group' => $g, 'key' => 'maintenance_mode', 'value' => 'false', 'type' => 'boolean', 'label' => 'Bakım Modu', 'order_index' => 11, 'is_public' => true],
+ ['group' => $g, 'key' => 'maintenance_message', 'value' => null, 'type' => 'textarea', 'label' => 'Bakım Modu Mesajı', 'order_index' => 12, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function contact(): array
+ {
+ $g = 'contact';
+
+ return [
+ ['group' => $g, 'key' => 'phone_primary', 'value' => null, 'type' => 'text', 'label' => 'Ana Telefon', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'phone_secondary', 'value' => null, 'type' => 'text', 'label' => 'İkinci Telefon', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'email_info', 'value' => null, 'type' => 'text', 'label' => 'Bilgi E-postası', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'email_support', 'value' => null, 'type' => 'text', 'label' => 'Destek E-postası', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'email_kayit', 'value' => null, 'type' => 'text', 'label' => 'Kayıt E-postası', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'address_full', 'value' => null, 'type' => 'textarea', 'label' => 'Tam Adres', 'order_index' => 5, 'is_public' => true],
+ ['group' => $g, 'key' => 'address_short', 'value' => null, 'type' => 'text', 'label' => 'Kısa Adres (navbar için)', 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'district', 'value' => null, 'type' => 'text', 'label' => 'İlçe', 'order_index' => 7, 'is_public' => true],
+ ['group' => $g, 'key' => 'city', 'value' => null, 'type' => 'text', 'label' => 'Şehir', 'order_index' => 8, 'is_public' => true],
+ ['group' => $g, 'key' => 'postal_code', 'value' => null, 'type' => 'text', 'label' => 'Posta Kodu', 'order_index' => 9, 'is_public' => true],
+ ['group' => $g, 'key' => 'working_hours_weekday', 'value' => null, 'type' => 'text', 'label' => 'Hafta İçi Saatleri', 'order_index' => 10, 'is_public' => true],
+ ['group' => $g, 'key' => 'working_hours_saturday', 'value' => null, 'type' => 'text', 'label' => 'Cumartesi Saatleri', 'order_index' => 11, 'is_public' => true],
+ ['group' => $g, 'key' => 'working_hours_sunday', 'value' => null, 'type' => 'text', 'label' => 'Pazar Saatleri', 'order_index' => 12, 'is_public' => true],
+ ['group' => $g, 'key' => 'whatsapp_number', 'value' => null, 'type' => 'text', 'label' => 'WhatsApp (+90 ile başlayan)', 'order_index' => 13, 'is_public' => true],
+ ['group' => $g, 'key' => 'whatsapp_message', 'value' => null, 'type' => 'text', 'label' => 'WhatsApp Varsayılan Mesaj', 'order_index' => 14, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function maps(): array
+ {
+ $g = 'maps';
+
+ return [
+ ['group' => $g, 'key' => 'google_maps_embed_url', 'value' => null, 'type' => 'textarea', 'label' => 'Google Maps Embed URL (iframe src)', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'google_maps_place_url', 'value' => null, 'type' => 'url', 'label' => 'Google Maps Profil Linki', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'google_maps_api_key', 'value' => null, 'type' => 'text', 'label' => 'Google Maps API Key', 'order_index' => 2, 'is_public' => false],
+ ['group' => $g, 'key' => 'latitude', 'value' => null, 'type' => 'text', 'label' => 'Enlem', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'longitude', 'value' => null, 'type' => 'text', 'label' => 'Boylam', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'map_zoom_level', 'value' => '15', 'type' => 'text', 'label' => 'Harita Zoom (1-20)', 'order_index' => 5, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function social(): array
+ {
+ $g = 'social';
+
+ return [
+ ['group' => $g, 'key' => 'instagram_url', 'value' => null, 'type' => 'url', 'label' => 'Instagram Profil URL', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'instagram_handle', 'value' => null, 'type' => 'text', 'label' => 'Instagram Kullanıcı Adı (@siz)', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'facebook_url', 'value' => null, 'type' => 'url', 'label' => 'Facebook Sayfası URL', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'facebook_page_id', 'value' => null, 'type' => 'text', 'label' => 'Facebook Page ID', 'order_index' => 3, 'is_public' => false],
+ ['group' => $g, 'key' => 'twitter_url', 'value' => null, 'type' => 'url', 'label' => 'X (Twitter) Profil URL', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'twitter_handle', 'value' => null, 'type' => 'text', 'label' => 'X Kullanıcı Adı (@siz)', 'order_index' => 5, 'is_public' => true],
+ ['group' => $g, 'key' => 'youtube_url', 'value' => null, 'type' => 'url', 'label' => 'YouTube Kanal URL', 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'youtube_channel_id', 'value' => null, 'type' => 'text', 'label' => 'YouTube Channel ID', 'order_index' => 7, 'is_public' => false],
+ ['group' => $g, 'key' => 'linkedin_url', 'value' => null, 'type' => 'url', 'label' => 'LinkedIn Sayfa URL', 'order_index' => 8, 'is_public' => true],
+ ['group' => $g, 'key' => 'tiktok_url', 'value' => null, 'type' => 'url', 'label' => 'TikTok Profil URL', 'order_index' => 9, 'is_public' => true],
+ ['group' => $g, 'key' => 'pinterest_url', 'value' => null, 'type' => 'url', 'label' => 'Pinterest URL', 'order_index' => 10, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function seo(): array
+ {
+ $g = 'seo';
+
+ return [
+ // Temel SEO
+ ['group' => $g, 'key' => 'meta_title_suffix', 'value' => 'Boğaziçi Denizcilik', 'type' => 'text', 'label' => 'Title Eki', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'meta_title_separator', 'value' => '|', 'type' => 'text', 'label' => 'Ayraç Karakteri', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'default_meta_description', 'value' => null, 'type' => 'textarea', 'label' => 'Varsayılan Meta Açıklama', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'default_meta_keywords', 'value' => null, 'type' => 'textarea', 'label' => 'Varsayılan Keywords (virgülle)', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'robots', 'value' => 'index, follow', 'type' => 'text', 'label' => 'Robots', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'canonical_domain', 'value' => null, 'type' => 'url', 'label' => 'Canonical Domain', 'order_index' => 5, 'is_public' => true],
+ // Open Graph
+ ['group' => $g, 'key' => 'og_title', 'value' => null, 'type' => 'text', 'label' => 'OG Default Title', 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'og_description', 'value' => null, 'type' => 'textarea', 'label' => 'OG Default Description', 'order_index' => 7, 'is_public' => true],
+ ['group' => $g, 'key' => 'og_image', 'value' => null, 'type' => 'image', 'label' => 'OG Default Görsel (1200x630 px)', 'order_index' => 8, 'is_public' => true],
+ ['group' => $g, 'key' => 'og_type', 'value' => 'website', 'type' => 'text', 'label' => 'OG Type', 'order_index' => 9, 'is_public' => true],
+ ['group' => $g, 'key' => 'og_locale', 'value' => 'tr_TR', 'type' => 'text', 'label' => 'OG Locale', 'order_index' => 10, 'is_public' => true],
+ ['group' => $g, 'key' => 'og_site_name', 'value' => null, 'type' => 'text', 'label' => 'OG Site Name', 'order_index' => 11, 'is_public' => true],
+ ['group' => $g, 'key' => 'facebook_app_id', 'value' => null, 'type' => 'text', 'label' => 'Facebook App ID', 'order_index' => 12, 'is_public' => false],
+ // Twitter / X Card
+ ['group' => $g, 'key' => 'twitter_card_type', 'value' => 'summary_large_image', 'type' => 'text', 'label' => 'Card Tipi', 'order_index' => 13, 'is_public' => true],
+ ['group' => $g, 'key' => 'twitter_site', 'value' => null, 'type' => 'text', 'label' => 'Site @handle', 'order_index' => 14, 'is_public' => true],
+ ['group' => $g, 'key' => 'twitter_creator', 'value' => null, 'type' => 'text', 'label' => 'İçerik Sahibi @handle', 'order_index' => 15, 'is_public' => true],
+ ['group' => $g, 'key' => 'twitter_title', 'value' => null, 'type' => 'text', 'label' => 'Twitter Default Title', 'order_index' => 16, 'is_public' => true],
+ ['group' => $g, 'key' => 'twitter_description', 'value' => null, 'type' => 'textarea', 'label' => 'Twitter Default Description', 'order_index' => 17, 'is_public' => true],
+ ['group' => $g, 'key' => 'twitter_image', 'value' => null, 'type' => 'image', 'label' => 'Twitter Card Görseli (1200x600 px)', 'order_index' => 18, 'is_public' => true],
+ // Doğrulama Kodları
+ ['group' => $g, 'key' => 'google_site_verification', 'value' => null, 'type' => 'text', 'label' => 'Google Search Console Kodu', 'order_index' => 19, 'is_public' => true],
+ ['group' => $g, 'key' => 'bing_site_verification', 'value' => null, 'type' => 'text', 'label' => 'Bing Webmaster Kodu', 'order_index' => 20, 'is_public' => true],
+ ['group' => $g, 'key' => 'yandex_verification', 'value' => null, 'type' => 'text', 'label' => 'Yandex Webmaster Kodu', 'order_index' => 21, 'is_public' => true],
+ ['group' => $g, 'key' => 'pinterest_verification', 'value' => null, 'type' => 'text', 'label' => 'Pinterest Doğrulama Kodu', 'order_index' => 22, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function analytics(): array
+ {
+ $g = 'analytics';
+
+ return [
+ ['group' => $g, 'key' => 'google_analytics_id', 'value' => null, 'type' => 'text', 'label' => 'Google Analytics 4 ID (G-XXXXXXXX)', 'order_index' => 0, 'is_public' => false],
+ ['group' => $g, 'key' => 'google_tag_manager_id', 'value' => null, 'type' => 'text', 'label' => 'Google Tag Manager ID (GTM-XXXXXXX)', 'order_index' => 1, 'is_public' => false],
+ ['group' => $g, 'key' => 'google_ads_id', 'value' => null, 'type' => 'text', 'label' => 'Google Ads Conversion ID', 'order_index' => 2, 'is_public' => false],
+ ['group' => $g, 'key' => 'facebook_pixel_id', 'value' => null, 'type' => 'text', 'label' => 'Meta (Facebook) Pixel ID', 'order_index' => 3, 'is_public' => false],
+ ['group' => $g, 'key' => 'hotjar_id', 'value' => null, 'type' => 'text', 'label' => 'Hotjar Site ID', 'order_index' => 4, 'is_public' => false],
+ ['group' => $g, 'key' => 'clarity_id', 'value' => null, 'type' => 'text', 'label' => 'Microsoft Clarity ID', 'order_index' => 5, 'is_public' => false],
+ ['group' => $g, 'key' => 'tiktok_pixel_id', 'value' => null, 'type' => 'text', 'label' => 'TikTok Pixel ID', 'order_index' => 6, 'is_public' => false],
+ ['group' => $g, 'key' => 'crisp_website_id', 'value' => null, 'type' => 'text', 'label' => 'Crisp Chat Website ID', 'order_index' => 7, 'is_public' => false],
+ ['group' => $g, 'key' => 'custom_head_scripts', 'value' => null, 'type' => 'textarea', 'label' => ' içine özel script', 'order_index' => 8, 'is_public' => false],
+ ['group' => $g, 'key' => 'custom_body_scripts', 'value' => null, 'type' => 'textarea', 'label' => ' sonuna özel script', 'order_index' => 9, 'is_public' => false],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function header(): array
+ {
+ $g = 'header';
+
+ return [
+ ['group' => $g, 'key' => 'navbar_style_default', 'value' => 'transparent', 'type' => 'text', 'label' => 'Varsayılan Navbar Stili (transparent/white)', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'cta_button_text', 'value' => 'Başvuru Yap', 'type' => 'text', 'label' => 'Sağ Üst Buton Metni', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'cta_button_url', 'value' => '/kayit', 'type' => 'url', 'label' => 'Sağ Üst Buton Linki', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'cta_button_color', 'value' => '#1a3e74', 'type' => 'color', 'label' => 'Sağ Üst Buton Rengi', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'show_phone_topbar', 'value' => 'true', 'type' => 'boolean', 'label' => "Üst Bar'da Telefon Göster", 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'show_email_topbar', 'value' => 'true', 'type' => 'boolean', 'label' => "Üst Bar'da E-posta Göster", 'order_index' => 5, 'is_public' => true],
+ ['group' => $g, 'key' => 'show_address_topbar', 'value' => 'true', 'type' => 'boolean', 'label' => "Üst Bar'da Adres Göster", 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'show_hours_topbar', 'value' => 'true', 'type' => 'boolean', 'label' => "Üst Bar'da Saat Göster", 'order_index' => 7, 'is_public' => true],
+ ['group' => $g, 'key' => 'show_social_navbar', 'value' => 'true', 'type' => 'boolean', 'label' => "Navbar'da Sosyal Medya İkonları Göster", 'order_index' => 8, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function footer(): array
+ {
+ $g = 'footer';
+
+ return [
+ ['group' => $g, 'key' => 'footer_description', 'value' => null, 'type' => 'textarea', 'label' => 'Footer Açıklaması', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'footer_logo', 'value' => null, 'type' => 'image', 'label' => 'Footer Logo (varsa ayrı)', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'copyright_text', 'value' => '© 2026 Boğaziçi Denizcilik', 'type' => 'text', 'label' => 'Copyright Metni', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'footer_address', 'value' => null, 'type' => 'textarea', 'label' => 'Footer Adres', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'footer_phone', 'value' => null, 'type' => 'text', 'label' => 'Footer Telefon', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'footer_email', 'value' => null, 'type' => 'text', 'label' => 'Footer E-posta', 'order_index' => 5, 'is_public' => true],
+ ['group' => $g, 'key' => 'footer_bg_color', 'value' => '#0f2847', 'type' => 'color', 'label' => 'Footer Arka Plan Rengi', 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'show_social_footer', 'value' => 'true', 'type' => 'boolean', 'label' => "Footer'da Sosyal Medya Göster", 'order_index' => 7, 'is_public' => true],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function integrations(): array
+ {
+ $g = 'integrations';
+
+ return [
+ ['group' => $g, 'key' => 'recaptcha_site_key', 'value' => null, 'type' => 'text', 'label' => 'reCAPTCHA v3 Site Key', 'order_index' => 0, 'is_public' => false],
+ ['group' => $g, 'key' => 'recaptcha_secret_key', 'value' => null, 'type' => 'text', 'label' => 'reCAPTCHA v3 Secret Key', 'order_index' => 1, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_host', 'value' => null, 'type' => 'text', 'label' => 'SMTP Host', 'order_index' => 2, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_port', 'value' => '587', 'type' => 'text', 'label' => 'SMTP Port', 'order_index' => 3, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_username', 'value' => null, 'type' => 'text', 'label' => 'SMTP Kullanıcı Adı', 'order_index' => 4, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_password', 'value' => null, 'type' => 'text', 'label' => 'SMTP Şifre', 'order_index' => 5, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_encryption', 'value' => 'tls', 'type' => 'text', 'label' => 'SMTP Şifreleme (tls/ssl)', 'order_index' => 6, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_from_name', 'value' => 'Boğaziçi Denizcilik', 'type' => 'text', 'label' => 'Mail Gönderen Adı', 'order_index' => 7, 'is_public' => false],
+ ['group' => $g, 'key' => 'smtp_from_email', 'value' => null, 'type' => 'text', 'label' => 'Mail Gönderen Adresi', 'order_index' => 8, 'is_public' => false],
+ ['group' => $g, 'key' => 'notification_emails', 'value' => null, 'type' => 'textarea', 'label' => 'Bildirim E-postaları (virgülle)', 'order_index' => 9, 'is_public' => false],
+ ];
+ }
+
+ /**
+ * @return list>
+ */
+ private function infoSections(): array
+ {
+ $g = 'info_sections';
+
+ return [
+ // Info Section 1
+ ['group' => $g, 'key' => 'info_section_1_badge', 'value' => 'Neden Boğaziçi Denizcilik?', 'type' => 'text', 'label' => 'Bölüm 1 — Etiket', 'order_index' => 0, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_1_title', 'value' => 'Uluslararası Standartlarda Denizcilik Eğitimi', 'type' => 'text', 'label' => 'Bölüm 1 — Başlık', 'order_index' => 1, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_1_body', 'value' => 'Boğaziçi Denizcilik Eğitim Kurumu, Ulaştırma ve Altyapı Bakanlığı onaylı eğitim programlarıyla denizcilik sektörüne nitelikli personel yetiştirmektedir. STCW Sözleşmesi gerekliliklerini karşılayan müfredatımız; köprüüstü simülatörleri, GMDSS telsiz laboratuvarı ve yangın tatbikat alanında uygulamalı olarak verilmektedir.', 'type' => 'textarea', 'label' => 'Bölüm 1 — İçerik', 'order_index' => 2, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_1_quote', 'value' => "Boğaziçi Denizcilik'ten aldığım STCW eğitimleri ve simülatör deneyimi sayesinde uluslararası bir denizcilik şirketinde güverte zabiti olarak göreve başladım.", 'type' => 'text', 'label' => 'Bölüm 1 — Alıntı', 'order_index' => 3, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_1_quote_author', 'value' => 'Kpt. Murat Aydın — Vardiya Zabiti, MSC Denizcilik', 'type' => 'text', 'label' => 'Bölüm 1 — Alıntı Yazarı', 'order_index' => 4, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_1_image', 'value' => null, 'type' => 'image', 'label' => 'Bölüm 1 — Görsel', 'order_index' => 5, 'is_public' => true],
+ // Info Section 2
+ ['group' => $g, 'key' => 'info_section_2_badge', 'value' => 'Simülatör Destekli Eğitim', 'type' => 'text', 'label' => 'Bölüm 2 — Etiket', 'order_index' => 6, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_2_title', 'value' => 'Teoriden Pratiğe, Sınıftan Köprüüstüne', 'type' => 'text', 'label' => 'Bölüm 2 — Başlık', 'order_index' => 7, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_2_body', 'value' => 'Eğitim merkezimizde bulunan tam donanımlı köprüüstü simülatörü, ARPA/radar eğitim istasyonları ve ECDIS terminalleri ile kursiyerlerimiz gerçek seyir senaryolarında deneyim kazanmaktadır. GMDSS laboratuvarımızda DSC, NAVTEX, Inmarsat-C ve VHF/MF/HF cihazları üzerinde birebir uygulama yapılmaktadır.', 'type' => 'textarea', 'label' => 'Bölüm 2 — İçerik', 'order_index' => 8, 'is_public' => true],
+ ['group' => $g, 'key' => 'info_section_2_image', 'value' => null, 'type' => 'image', 'label' => 'Bölüm 2 — Görsel', 'order_index' => 9, 'is_public' => true],
+ ];
+ }
+}
diff --git a/database/seeders/StorySeeder.php b/database/seeders/StorySeeder.php
new file mode 100644
index 0000000..64c838b
--- /dev/null
+++ b/database/seeders/StorySeeder.php
@@ -0,0 +1,79 @@
+ 'Boğaziçi Denizcilik',
+ 'badge' => 'Tanıtım',
+ 'content' => "1998'den bu yana Türk denizciliğine nitelikli personel yetiştiriyoruz. IMO standartlarında, STCW uyumlu eğitimlerimizle 15.000+ mezun.",
+ 'image' => null,
+ 'cta_text' => 'Hakkımızda',
+ 'cta_url' => '/kurumsal/hakkimizda',
+ 'order_index' => 0,
+ ],
+ [
+ 'title' => 'Eğitimler Başlıyor',
+ 'badge' => 'Yeni Dönem',
+ 'content' => 'Güverte, makine ve STCW eğitim gruplarımız açılıyor. Teori ve simülatör destekli uygulamalı müfredat.',
+ 'image' => null,
+ 'cta_text' => 'Eğitim Takvimi',
+ 'cta_url' => '/egitimler/takvim',
+ 'order_index' => 1,
+ ],
+ [
+ 'title' => 'Eğitim Kategorileri',
+ 'badge' => 'Katalog',
+ 'content' => 'Güverte, makine, STCW güvenlik, yat kaptanlığı, telsiz ve belge yenileme — 6 ana kategoride 45+ eğitim programı.',
+ 'image' => null,
+ 'cta_text' => 'Tüm Eğitimler',
+ 'cta_url' => '/egitimler',
+ 'order_index' => 2,
+ ],
+ [
+ 'title' => 'Belge Yenileme',
+ 'badge' => 'Yenileme',
+ 'content' => 'BST, AFF, ilk yardım ve güverte/makine yeterlik belgelerinizin süresi mi doluyor? Hafta sonu tazeleme programlarımız açık.',
+ 'image' => null,
+ 'cta_text' => 'Yenileme Eğitimleri',
+ 'cta_url' => '/egitimler/yenileme',
+ 'order_index' => 3,
+ ],
+ [
+ 'title' => 'Yat Kaptanlığı',
+ 'badge' => 'Yat',
+ 'content' => '25 GT, 149 GT ve 3000 GT tonaj sınıflarında yat kaptanlığı eğitimleri. Kıyı seyri, manevra, deniz hukuku ve güvenlik.',
+ 'image' => null,
+ 'cta_text' => 'Detaylı Bilgi',
+ 'cta_url' => '/egitimler/yat-kaptanligi',
+ 'order_index' => 4,
+ ],
+ [
+ 'title' => 'STCW Güvenlik',
+ 'badge' => 'STCW',
+ 'content' => 'Temel Güvenlik (BST), ileri yangın söndürme (AFF), denizde kişisel can kurtarma ve ilk yardım — zorunlu STCW sertifikaları.',
+ 'image' => null,
+ 'cta_text' => 'STCW Eğitimleri',
+ 'cta_url' => '/egitimler/stcw',
+ 'order_index' => 5,
+ ],
+ ];
+
+ foreach ($stories as $story) {
+ Story::firstOrCreate(
+ ['title' => $story['title']],
+ $story,
+ );
+ }
+ }
+}
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
new file mode 100644
index 0000000..3a15cb5
--- /dev/null
+++ b/docker-compose.prod.yml
@@ -0,0 +1,15 @@
+services:
+ bdc-api-prod:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: bdc-api-prod
+ restart: unless-stopped
+ volumes:
+ - ./:/var/www/html
+ - ./docker/apache/000-default.conf:/etc/apache2/sites-available/000-default.conf
+ - /opt/projects/bogazici/corporate-api/prod/uploads:/var/www/html/public/uploads
+ ports:
+ - "127.0.0.1:9201:80"
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
diff --git a/docker-compose.test.yml b/docker-compose.test.yml
new file mode 100644
index 0000000..aadb2d2
--- /dev/null
+++ b/docker-compose.test.yml
@@ -0,0 +1,15 @@
+services:
+ bdc-api-test:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: bdc-api-test
+ restart: unless-stopped
+ volumes:
+ - ./:/var/www/html
+ - ./docker/apache/000-default.conf:/etc/apache2/sites-available/000-default.conf
+ - /opt/projects/bogazici/corporate-api/test/uploads:/var/www/html/public/uploads
+ ports:
+ - "127.0.0.1:9101:80"
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
diff --git a/docker/apache/000-default.conf b/docker/apache/000-default.conf
new file mode 100644
index 0000000..67ccfd2
--- /dev/null
+++ b/docker/apache/000-default.conf
@@ -0,0 +1,13 @@
+
+ ServerAdmin webmaster@localhost
+ DocumentRoot /var/www/html/public
+
+
+ Options Indexes FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
new file mode 100755
index 0000000..5febd47
--- /dev/null
+++ b/docker/entrypoint.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+set -e
+
+cd /var/www/html
+
+if [ ! -d "vendor" ]; then
+ composer install --no-interaction --prefer-dist --optimize-autoloader
+fi
+
+chown -R www-data:www-data storage bootstrap/cache
+chmod -R 775 storage bootstrap/cache
+
+exec apache2-foreground
diff --git a/opencode.json b/opencode.json
new file mode 100644
index 0000000..d9843b0
--- /dev/null
+++ b/opencode.json
@@ -0,0 +1,25 @@
+{
+ "$schema": "https://opencode.ai/config.json",
+ "mcp": {
+ "laravel-boost": {
+ "type": "local",
+ "enabled": true,
+ "command": [
+ "php",
+ "artisan",
+ "boost:mcp"
+ ]
+ },
+ "herd": {
+ "type": "local",
+ "enabled": true,
+ "command": [
+ "php",
+ "/Applications/Herd.app/Contents/Resources/herd-mcp.phar"
+ ],
+ "environment": {
+ "SITE_PATH": "/Users/bulutkuru/Herd/bogazici-api"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7686b29
--- /dev/null
+++ b/package.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://www.schemastore.org/package.json",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite"
+ },
+ "devDependencies": {
+ "@tailwindcss/vite": "^4.0.0",
+ "axios": "^1.11.0",
+ "concurrently": "^9.0.1",
+ "laravel-vite-plugin": "^2.0.0",
+ "tailwindcss": "^4.0.0",
+ "vite": "^7.0.7"
+ }
+}
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..d703241
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ tests/Unit
+
+
+ tests/Feature
+
+
+
+
+ app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/prompts/admin-course-blocks.md b/prompts/admin-course-blocks.md
new file mode 100644
index 0000000..36e6afb
--- /dev/null
+++ b/prompts/admin-course-blocks.md
@@ -0,0 +1,209 @@
+# Admin Panel — Eğitim Blokları (Course Blocks)
+
+## Genel Bakış
+
+Eğitim detay sayfalarında artık **Page Builder** mantığı var. Her eğitimin altına sıralı bloklar eklenebilir. Yapı, Page Blocks ile birebir aynı — aynı blok tipleri, aynı `_width` desteği, aynı content JSON formatı.
+
+---
+
+## API Endpoints
+
+Tüm endpoint'ler `auth:sanctum` ile korunuyor. Base URL: `{API_URL}/api/admin`
+
+| Method | Endpoint | Açıklama |
+|--------|----------|----------|
+| `GET` | `/admin/courses/{course}/blocks` | Eğitimin bloklarını listele |
+| `POST` | `/admin/courses/{course}/blocks` | Yeni blok oluştur |
+| `GET` | `/admin/courses/{course}/blocks/{block}` | Blok detayı |
+| `PUT` | `/admin/courses/{course}/blocks/{block}` | Blok güncelle |
+| `DELETE` | `/admin/courses/{course}/blocks/{block}` | Blok sil |
+| `POST` | `/admin/courses/{course}/blocks/reorder` | Sıralama güncelle |
+
+---
+
+## GET /admin/courses/{course}/blocks
+
+```json
+{
+ "data": [
+ {
+ "id": 1,
+ "type": "hero",
+ "content": {
+ "title": "Köprüüstü Kaynak Yönetimi",
+ "subtitle": "BRM",
+ "description": "STCW uyumlu ileri düzey eğitim..."
+ },
+ "order_index": 0
+ },
+ {
+ "id": 2,
+ "type": "text",
+ "content": {
+ "_width": "half",
+ "title": "Eğitim Kapsamı",
+ "body": ""
+ },
+ "order_index": 1
+ }
+ ]
+}
+```
+
+---
+
+## POST /admin/courses/{course}/blocks — Yeni Blok
+
+### Request:
+```json
+{
+ "type": "hero",
+ "content": {
+ "title": "Blok başlığı",
+ "description": "Açıklama..."
+ },
+ "order_index": 0,
+ "is_active": true
+}
+```
+
+### Response (201):
+```json
+{
+ "id": 5,
+ "type": "hero",
+ "content": { "title": "Blok başlığı", "description": "Açıklama..." },
+ "order_index": 0
+}
+```
+
+### Validation Kuralları:
+| Alan | Kural |
+|------|-------|
+| `type` | required, string, max:50 |
+| `content` | present, array (boş obje `{}` gönderilebilir) |
+| `order_index` | optional, integer, min:0 (gönderilmezse otomatik son sıraya eklenir) |
+| `is_active` | optional, boolean |
+
+---
+
+## PUT /admin/courses/{course}/blocks/{block} — Güncelle
+
+Sadece değişen alanları gönder:
+
+```json
+{
+ "content": {
+ "_width": "half",
+ "title": "Güncel Başlık",
+ "body": "Yeni içerik
"
+ }
+}
+```
+
+---
+
+## DELETE /admin/courses/{course}/blocks/{block}
+
+```json
+{ "message": "Blok silindi." }
+```
+
+---
+
+## POST /admin/courses/{course}/blocks/reorder — Sıralama
+
+```json
+{
+ "items": [
+ { "id": 3, "order_index": 0 },
+ { "id": 1, "order_index": 1 },
+ { "id": 2, "order_index": 2 }
+ ]
+}
+```
+
+```json
+{ "message": "Blok sıralaması güncellendi." }
+```
+
+---
+
+## Blok Tipleri
+
+Page Blocks ile aynı blok tipleri kullanılır:
+
+| type | Açıklama | Örnek Kullanım |
+|------|----------|----------------|
+| `hero` | Üst banner/başlık alanı | Eğitim hero bölümü |
+| `text` | Zengin metin bloğu | Eğitim kapsamı, açıklama |
+| `text_image` | Metin + görsel yan yana | Eğitim tanıtımı |
+| `cards` | Kart grid | Özellikler, sertifikalar |
+| `stats_grid` | İstatistik/adım kartları | Süre, katılımcı, başarı oranı |
+| `cta` | Call-to-action | Kayıt ol butonu |
+| `faq` | Sıkça sorulan sorular | Eğitimle ilgili SSS |
+| `gallery` | Görsel galeri | Eğitim ortamı fotoğrafları |
+| `video` | Video embed | Tanıtım videosu |
+| `testimonials` | Yorumlar/referanslar | Mezun görüşleri |
+| `html` | Serbest HTML | Özel içerik |
+
+---
+
+## `_width` Desteği
+
+`content` JSON içinde `_width` key'i blok genişliğini belirler:
+
+| Değer | Açıklama |
+|-------|----------|
+| `"full"` | Tam genişlik (varsayılan — key gönderilmezse otomatik full) |
+| `"half"` | Yarım genişlik — ardışık iki half blok yan yana render edilir |
+
+```json
+// Yan yana iki blok
+{ "type": "text", "content": { "_width": "half", "title": "Sol", "body": "..." }, "order_index": 0 }
+{ "type": "stats_grid", "content": { "_width": "half", "title": "Sağ", ... }, "order_index": 1 }
+```
+
+---
+
+## Public API — Frontend
+
+`GET /api/v1/courses/{slug}` artık `blocks` array'ini de döner:
+
+```json
+{
+ "data": {
+ "id": 1,
+ "slug": "kopruustu-kaynak-yonetimi",
+ "title": "Köprüüstü Kaynak Yönetimi (BRM)",
+ "category": { ... },
+ "blocks": [
+ { "id": 1, "type": "hero", "content": { ... }, "order_index": 0 },
+ { "id": 2, "type": "text", "content": { "_width": "half", ... }, "order_index": 1 },
+ { "id": 3, "type": "stats_grid", "content": { "_width": "half", ... }, "order_index": 2 }
+ ],
+ "schedules": [ ... ],
+ ...
+ }
+}
+```
+
+Frontend, sayfa blokları ile aynı `BlockRenderer` bileşenini kullanabilir.
+
+---
+
+## Admin Panel Entegrasyonu
+
+### Önerilen UI:
+Eğitim düzenleme sayfasında (`/admin/courses/{id}/edit`) mevcut form alanlarının altına bir **"Bloklar"** sekmesi/bölümü ekle. Bu bölüm Page Builder ile aynı mantıkta çalışır:
+
+1. Blok listesi `order_index` sıralı gösterilir
+2. Sürükle-bırak ile sıralama → `POST .../reorder`
+3. "Blok Ekle" butonu → tip seçimi → `POST .../blocks`
+4. Blok düzenleme → inline edit veya modal → `PUT .../blocks/{id}`
+5. Blok silme → onay dialog → `DELETE .../blocks/{id}`
+
+### Aynı bileşenleri paylaşabilirsin:
+Page Blocks için yazdığın `BlockEditor`, `BlockTypeSelector`, `ContentEditor` bileşenlerini **doğrudan** course blocks için de kullan. Sadece API endpoint prefix'i değişir:
+- Page: `/admin/pages/{id}/blocks`
+- Course: `/admin/courses/{id}/blocks`
diff --git a/prompts/admin-leads.md b/prompts/admin-leads.md
new file mode 100644
index 0000000..ac4243d
--- /dev/null
+++ b/prompts/admin-leads.md
@@ -0,0 +1,246 @@
+# Admin Panel — Leads (Başvuru Yönetimi) Modülü
+
+## Genel Bakış
+
+Web sitesindeki formlardan gelen tüm başvurular `leads` tablosuna yazılır. Admin panelden başvurular listelenir, detay görüntülenir, durum güncellenir ve not eklenir. **Lead'ler sadece API'den oluşur — admin panelde "Yeni Oluştur" butonu olmayacak.**
+
+---
+
+## API Endpoints (Admin — auth:sanctum)
+
+| Method | Endpoint | Açıklama |
+|--------|----------|----------|
+| `GET` | `/admin/leads` | Başvuruları listele (paginated, filtrelenebilir) |
+| `GET` | `/admin/leads/{id}` | Başvuru detayı (otomatik okundu işaretler) |
+| `PUT` | `/admin/leads/{id}` | Durum/not güncelle |
+| `DELETE` | `/admin/leads/{id}` | Başvuru sil (soft delete) |
+
+---
+
+## GET /admin/leads — Liste
+
+### Query Parametreleri:
+| Parametre | Tip | Açıklama |
+|-----------|-----|----------|
+| `status` | string | Durum filtresi: `new`, `contacted`, `enrolled`, `cancelled` |
+| `source` | string | Kaynak filtresi: `kurs_kayit`, `danismanlik`, `duyuru`, `iletisim` |
+| `is_read` | boolean | Okundu/okunmadı filtresi |
+| `search` | string | İsim/telefon arama |
+| `per_page` | integer | Sayfa başına (varsayılan: 15) |
+
+### Response:
+```json
+{
+ "data": [
+ {
+ "id": 1,
+ "name": "Ahmet Yılmaz",
+ "phone": "+90 532 724 15 32",
+ "email": "ahmet@email.com",
+ "source": "kurs_kayit",
+ "status": "new",
+ "target_course": "gemici-birlesik-egitimi",
+ "education_level": "lise",
+ "subject": null,
+ "message": "Eğitim hakkında bilgi almak istiyorum",
+ "is_read": false,
+ "kvkk_consent": true,
+ "marketing_consent": false,
+ "utm_source": "google",
+ "utm_medium": "cpc",
+ "utm_campaign": "denizcilik-2026",
+ "admin_note": null,
+ "created_at": "2026-03-24T10:30:00.000000Z",
+ "updated_at": "2026-03-24T10:30:00.000000Z"
+ }
+ ],
+ "meta": { "current_page": 1, "last_page": 5, "per_page": 15, "total": 72 }
+}
+```
+
+---
+
+## GET /admin/leads/{id} — Detay
+
+Detay açıldığında backend otomatik olarak `is_read: true` yapar.
+
+---
+
+## PUT /admin/leads/{id} — Güncelle
+
+Admin sadece şu alanları güncelleyebilir:
+
+```json
+{
+ "status": "contacted",
+ "is_read": true,
+ "admin_note": "Arandı, bilgi verildi. Nisan dönemine kayıt olacak."
+}
+```
+
+---
+
+## Veri Modeli
+
+### Lead Alanları
+
+| Alan | Tip | Açıklama |
+|------|-----|----------|
+| `id` | integer | — |
+| `name` | string | Ad Soyad |
+| `phone` | string | Telefon |
+| `email` | string (nullable) | E-posta |
+| `source` | enum | Başvuru kaynağı (form tipi) |
+| `status` | enum | İşlem durumu |
+| `target_course` | string (nullable) | Hedef eğitim slug'ı |
+| `education_level` | string (nullable) | Eğitim seviyesi |
+| `subject` | string (nullable) | Konu (iletişim formunda) |
+| `message` | text (nullable) | Mesaj |
+| `is_read` | boolean | Admin tarafından okundu mu |
+| `kvkk_consent` | boolean | KVKK onayı |
+| `marketing_consent` | boolean | Pazarlama onayı |
+| `utm_source` | string (nullable) | UTM Source |
+| `utm_medium` | string (nullable) | UTM Medium |
+| `utm_campaign` | string (nullable) | UTM Campaign |
+| `admin_note` | text (nullable) | Admin notu |
+| `created_at` | datetime | Başvuru tarihi |
+
+### Source (Kaynak) Değerleri
+
+| Değer | Açıklama | Hangi Form? |
+|-------|----------|-------------|
+| `kurs_kayit` | Kurs ön kayıt | Eğitim detay sayfası kayıt formu |
+| `danismanlik` | Danışmanlık | Danışmanlık sayfası formu |
+| `duyuru` | Duyuru | Duyuru sidebar'daki mini form |
+| `iletisim` | İletişim | İletişim sayfası formu |
+| `hero_form` | Hero form | Anasayfa hero bölümü formu |
+| `whatsapp_widget` | WhatsApp | WhatsApp widget üzerinden gelen |
+
+### Status (Durum) Değerleri
+
+| Değer | Label | Badge Rengi | Açıklama |
+|-------|-------|-------------|----------|
+| `new` | Yeni | `warning` (sarı) | Henüz işlenmemiş |
+| `contacted` | İletişim Kuruldu | `info` (mavi) | Aranmış/e-posta gönderilmiş |
+| `enrolled` | Kayıt Oldu | `success` (yeşil) | Eğitime kaydolmuş |
+| `cancelled` | İptal | `danger` (kırmızı) | Vazgeçmiş/iptal |
+
+---
+
+## Önerilen Admin Panel Sayfası
+
+### Liste Sayfası (`/admin/leads`)
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│ Başvurular [Filtreler ▼] │
+├─────────────────────────────────────────────────────────────┤
+│ Filtreler: [Kaynak ▼] [Durum ▼] [Okundu ▼] [Ara...] │
+├──────┬──────────────┬──────────────┬────────────┬───────────┤
+│ ● │ Ahmet Yılmaz │ +90 532 ... │ kurs_kayit │ 🟡 Yeni │
+│ ○ │ Mehmet Kaya │ +90 555 ... │ iletisim │ 🔵 İlet. │
+│ ○ │ Ayşe Demir │ +90 212 ... │ danismanlik│ 🟢 Kayıt │
+└──────┴──────────────┴──────────────┴────────────┴───────────┘
+ ● = okunmadı (bold göster) ○ = okundu
+```
+
+#### Tablo Sütunları:
+| Sütun | Açıklama |
+|-------|----------|
+| Okundu göstergesi | `is_read` false ise bold/dot göster |
+| Ad Soyad | `name` |
+| Telefon | `phone` |
+| E-posta | `email` (varsa) |
+| Kaynak | `source` — badge ile göster |
+| Hedef Eğitim | `target_course` (varsa) |
+| Durum | `status` — renkli badge |
+| Tarih | `created_at` — relative (2 saat önce) |
+
+#### Kaynak Badge Renkleri:
+| Source | Renk |
+|--------|------|
+| `kurs_kayit` | `primary` (mavi) |
+| `danismanlik` | `purple` |
+| `duyuru` | `orange` |
+| `iletisim` | `teal` |
+| `hero_form` | `indigo` |
+| `whatsapp_widget` | `green` |
+
+### Detay/Düzenleme Sayfası (`/admin/leads/{id}`)
+
+```
+┌─────────────────────────────────────────────────┐
+│ Başvuru #42 — Ahmet Yılmaz │
+├─────────────────────────────────────────────────┤
+│ Bilgiler │
+│ ┌─────────────────┬───────────────────────────┐ │
+│ │ Ad Soyad │ Ahmet Yılmaz │ │
+│ │ Telefon │ +90 532 724 15 32 │ │
+│ │ E-posta │ ahmet@email.com │ │
+│ │ Kaynak │ 🔵 kurs_kayit │ │
+│ │ Hedef Eğitim │ Gemici (Birleşik) Eğitimi │ │
+│ │ Eğitim Seviyesi │ Lise │ │
+│ │ Mesaj │ Bilgi almak istiyorum │ │
+│ │ KVKK Onay │ ✅ Evet │ │
+│ │ Pazarlama Onay │ ❌ Hayır │ │
+│ │ Tarih │ 24 Mar 2026, 10:30 │ │
+│ └─────────────────┴───────────────────────────┘ │
+│ │
+│ UTM Bilgileri │
+│ ┌─────────────────┬───────────────────────────┐ │
+│ │ utm_source │ google │ │
+│ │ utm_medium │ cpc │ │
+│ │ utm_campaign │ denizcilik-2026 │ │
+│ └─────────────────┴───────────────────────────┘ │
+│ │
+│ İşlem │
+│ ┌───────────────────────────────────────────────┐│
+│ │ Durum: [Yeni ▼] → contacted / enrolled /.. ││
+│ │ ││
+│ │ Admin Notu: ││
+│ │ ┌─────────────────────────────────────────┐ ││
+│ │ │ Arandı, bilgi verildi. Nisan dönemine │ ││
+│ │ │ kayıt olacak. │ ││
+│ │ └─────────────────────────────────────────┘ ││
+│ │ ││
+│ │ [Kaydet] ││
+│ └───────────────────────────────────────────────┘│
+└─────────────────────────────────────────────────┘
+```
+
+#### Düzenleme Kuralları:
+- Başvuru bilgileri (name, phone, message vb.) **readonly** — sadece görüntüleme
+- Sadece `status`, `is_read` ve `admin_note` düzenlenebilir
+- `target_course` slug ise, linke çevir: `/admin/courses/{slug}/edit`
+- "Yeni Oluştur" butonu **yok** — lead'ler sadece frontend formlarından gelir
+
+---
+
+## İstatistik Kartları (Dashboard için, opsiyonel)
+
+Liste sayfasının üstüne istatistik kartları eklenebilir:
+
+```
+┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
+│ 🟡 Yeni │ │ 🔵 İletişim │ │ 🟢 Kayıt │ │ 📊 Toplam │
+│ 12 │ │ 28 │ │ 45 │ │ 93 │
+│ Bu hafta: 5 │ │ Bu hafta: 8 │ │ Bu ay: 15 │ │ Bu ay: 32 │
+└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
+```
+
+API'den alınabilir:
+```
+GET /admin/leads?status=new → meta.total
+GET /admin/leads?status=contacted → meta.total
+GET /admin/leads?status=enrolled → meta.total
+GET /admin/leads → meta.total
+```
+
+---
+
+## Notlar
+
+- `is_read` detay sayfası açıldığında otomatik `true` olur (backend tarafından)
+- Soft delete kullanılıyor — silinen lead'ler geri alınabilir
+- UTM verileri backend'de tek JSON sütununda (`utm`) saklanır, API response'da ayrı ayrı döner
+- KVKK ve pazarlama onayları readonly gösterilmeli — admin tarafından değiştirilemez
diff --git a/prompts/admin-settings.md b/prompts/admin-settings.md
new file mode 100644
index 0000000..d744283
--- /dev/null
+++ b/prompts/admin-settings.md
@@ -0,0 +1,375 @@
+# Admin Panel — Site Ayarları Modülü
+
+## Genel Bakış
+
+Backend'de `settings` tablosu güncellendi. Artık her ayarın **label** (Türkçe etiket) ve **order_index** (sıralama) alanları var. Ayarlar **9 gruba** ayrılmış durumda. Admin panelde her grup kendi sekmesi/sayfası olacak.
+
+---
+
+## API Endpoints
+
+Tüm admin endpoint'leri `auth:sanctum` ile korunuyor. Base URL: `{API_URL}/api/admin`
+
+| Method | Endpoint | Açıklama |
+|--------|----------|----------|
+| `GET` | `/admin/settings` | Tüm ayarları flat liste olarak getir |
+| `GET` | `/admin/settings/group/{group}` | Tek grup ayarlarını getir |
+| `PUT` | `/admin/settings` | Toplu güncelleme (dot notation) |
+| `POST` | `/admin/settings/clear-cache` | Ayar cache'ini temizle |
+
+---
+
+## GET /admin/settings — Tüm Ayarlar
+
+Her ayar şu formatta döner:
+
+```json
+{
+ "data": [
+ {
+ "id": 1,
+ "key": "site_name",
+ "value": "Boğaziçi Denizcilik Eğitim Kurumu",
+ "group": "general",
+ "type": "text",
+ "label": "Site Adı",
+ "order_index": 0
+ },
+ {
+ "id": 8,
+ "key": "announcement_bar_active",
+ "value": "true",
+ "group": "general",
+ "type": "boolean",
+ "label": "Üst Bar Aktif mi",
+ "order_index": 7
+ }
+ ]
+}
+```
+
+**Frontend'de `group` bazında filtrele** → Her sekme/tab kendi grubunu gösterir.
+
+---
+
+## GET /admin/settings/group/{group} — Tek Grup
+
+Sadece o grubun ayarlarını döner. `order_index` sıralı gelir.
+
+Geçerli group değerleri:
+- `general` — Genel site ayarları
+- `contact` — İletişim bilgileri
+- `maps` — Harita ayarları
+- `social` — Sosyal medya linkleri
+- `seo` — SEO, Open Graph, Twitter Card, doğrulama kodları
+- `analytics` — Google Analytics, Tag Manager, Pixel ID'leri
+- `header` — Navbar ve üst bar ayarları
+- `footer` — Footer içerik ve stili
+- `integrations` — SMTP, reCAPTCHA, bildirim ayarları
+
+---
+
+## PUT /admin/settings — Toplu Güncelleme
+
+**Dot notation** formatında gönder: `{group}.{key}: value`
+
+### Request Body:
+
+```json
+{
+ "settings": {
+ "general.site_name": "Yeni Site Adı",
+ "general.announcement_bar_active": "true",
+ "contact.phone_primary": "+90 555 123 45 67",
+ "social.instagram_url": "https://instagram.com/bogazicidenizcilik",
+ "header.cta_button_text": "Kayıt Ol",
+ "footer.copyright_text": "© 2026 Boğaziçi Denizcilik"
+ }
+}
+```
+
+### Response:
+```json
+{ "message": "Ayarlar güncellendi." }
+```
+
+### Önemli:
+- Sadece değişen ayarları gönderin, hepsini göndermenize gerek yok
+- PUT sonrası backend otomatik olarak tüm cache'leri temizler
+- Validation: `settings` required array, her value nullable string
+
+---
+
+## POST /admin/settings/clear-cache
+
+Body gerekmez. Manuel cache temizleme butonu için.
+
+```json
+{ "message": "Ayar cache temizlendi." }
+```
+
+---
+
+## Type'lara Göre Form Bileşenleri
+
+Her ayarın `type` alanı, admin panelde hangi input bileşeninin kullanılacağını belirler:
+
+| type | Bileşen | Açıklama |
+|------|---------|----------|
+| `text` | ` ` | Tek satır metin |
+| `textarea` | `