diff --git a/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php b/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php
index ecdafc7..3477523 100644
--- a/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php
+++ b/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php
@@ -199,7 +199,13 @@ class InternApplicationResource extends Resource
$saved = $record->journalEntries()->get()->keyBy('day_number');
- $html = '
';
+ $html = '';
+ $html .= '
';
foreach ($days as $d) {
$dayNum = $d['day_number'];
$dateF = $d['formatted_date'];
@@ -220,11 +226,114 @@ class InternApplicationResource extends Resource
$html .= ' ' . $dateF . ' ';
}
$html .= '
';
- $html .= '
' . ($content ? e($content) : 'Rapor yazılmamış ') . '
';
+
+ $cleanContent = $content ? strip_tags($content, ['p', 'strong', 'ul', 'li', 'em', 'br', 'b', 'i', 'ol', 'span']) : '
Rapor yazılmamış ';
+ $html .= '
' . $cleanContent . '
';
+
+ if ($entry && trim($content) !== '') {
+ $supApproved = $entry->supervisor_approved;
+ $unitApproved = $entry->unit_approved;
+
+ $html .= '
';
+
+ // Supervisor approval
+ $supBg = $supApproved ? '#d1fae5' : '#f1f5f9';
+ $supColor = $supApproved ? '#065f46' : '#64748b';
+ $supText = $supApproved ? 'Sorumlu Onayladı' : 'Sorumlu Onayı Bekliyor';
+ $html .= ' ' . $supText . ' ';
+
+ // Unit approval
+ $unitBg = $unitApproved ? '#d1fae5' : '#f1f5f9';
+ $unitColor = $unitApproved ? '#065f46' : '#64748b';
+ $unitText = $unitApproved ? 'Birim Yetkilisi Onayladı' : 'Birim Yetkilisi Onayı Bekliyor';
+ $html .= ' ' . $unitText . ' ';
+
+ // Buttons
+ $supBtnText = $supApproved ? 'Onayı Kaldır' : 'Onayla';
+ $supBtnBg = $supApproved ? '#ef4444' : '#2563eb';
+ $html .= ' Sorumlu ' . $supBtnText . ' ';
+
+ $unitBtnText = $unitApproved ? 'Onayı Kaldır' : 'Onayla';
+ $unitBtnBg = $unitApproved ? '#ef4444' : '#2563eb';
+ $html .= ' Yetkili ' . $unitBtnText . ' ';
+
+ $html .= '
';
+ }
+
$html .= '
';
}
$html .= '';
+ // JS handler
+ $html .= '
+
+ ';
+
// Add preview buttons
$html .= '';
$html .= '
A4 Defteri Önizle / Yazdır ';
diff --git a/app/Http/Controllers/CareerController.php b/app/Http/Controllers/CareerController.php
index 627b265..97bea4a 100644
--- a/app/Http/Controllers/CareerController.php
+++ b/app/Http/Controllers/CareerController.php
@@ -529,5 +529,37 @@ class CareerController extends Controller
'size' => $size,
]);
}
+
+ public function toggleJournalApproval(Request $request)
+ {
+ if (!auth()->check()) {
+ return response()->json(['success' => false, 'message' => 'Yetkisiz işlem.'], 403);
+ }
+
+ $request->validate([
+ 'entry_id' => 'required|integer|exists:internship_journal_entries,id',
+ 'type' => 'required|string|in:supervisor,unit',
+ ]);
+
+ $entry = \App\Models\InternshipJournalEntry::findOrFail($request->entry_id);
+
+ if ($request->type === 'supervisor') {
+ $entry->supervisor_approved = !$entry->supervisor_approved;
+ $entry->save();
+ return response()->json([
+ 'success' => true,
+ 'status' => $entry->supervisor_approved,
+ 'message' => 'Staj sorumlusu onayı güncellendi.'
+ ]);
+ } else {
+ $entry->unit_approved = !$entry->unit_approved;
+ $entry->save();
+ return response()->json([
+ 'success' => true,
+ 'status' => $entry->unit_approved,
+ 'message' => 'Birim yetkilisi onayı güncellendi.'
+ ]);
+ }
+ }
}
diff --git a/app/Models/InternshipJournalEntry.php b/app/Models/InternshipJournalEntry.php
index 8afa936..acb67cb 100644
--- a/app/Models/InternshipJournalEntry.php
+++ b/app/Models/InternshipJournalEntry.php
@@ -15,10 +15,14 @@ class InternshipJournalEntry extends Model
'date',
'content',
'is_retroactive',
+ 'supervisor_approved',
+ 'unit_approved',
];
protected $casts = [
'is_retroactive' => 'boolean',
+ 'supervisor_approved' => 'boolean',
+ 'unit_approved' => 'boolean',
];
/**
diff --git a/database/migrations/2026_07_01_165734_add_approval_fields_to_internship_journal_entries.php b/database/migrations/2026_07_01_165734_add_approval_fields_to_internship_journal_entries.php
new file mode 100644
index 0000000..f064c94
--- /dev/null
+++ b/database/migrations/2026_07_01_165734_add_approval_fields_to_internship_journal_entries.php
@@ -0,0 +1,29 @@
+boolean('supervisor_approved')->default(false);
+ $table->boolean('unit_approved')->default(false);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('internship_journal_entries', function (Blueprint $table) {
+ $table->dropColumn(['supervisor_approved', 'unit_approved']);
+ });
+ }
+};
diff --git a/resources/views/front/career/intern_dashboard.blade.php b/resources/views/front/career/intern_dashboard.blade.php
index 4a56da8..ea642a1 100644
--- a/resources/views/front/career/intern_dashboard.blade.php
+++ b/resources/views/front/career/intern_dashboard.blade.php
@@ -887,7 +887,14 @@
commits.forEach(item => {
const dateStr = item.commit.author.date;
if (dateStr) {
- const dateOnly = dateStr.substring(0, 10);
+ const d = new Date(dateStr);
+ const formatter = new Intl.DateTimeFormat('fr-CA', {
+ timeZone: 'Europe/Istanbul',
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit'
+ });
+ const dateOnly = formatter.format(d);
if (!allGithubCommits[dateOnly]) {
allGithubCommits[dateOnly] = [];
}
@@ -985,7 +992,7 @@
const msg = c.commit.message;
const sha = c.sha.substring(0, 7);
const authorDate = new Date(c.commit.author.date);
- const time = authorDate.toLocaleTimeString('tr-TR', { hour: '2-digit', minute: '2-digit' });
+ const time = authorDate.toLocaleTimeString('tr-TR', { timeZone: 'Europe/Istanbul', hour: '2-digit', minute: '2-digit' });
commitHtml += `
[${time}] (${sha} ) ${msg}`;
});
commitHtml += "";
diff --git a/resources/views/front/career/print.blade.php b/resources/views/front/career/print.blade.php
index 3bf3ea8..742ce60 100644
--- a/resources/views/front/career/print.blade.php
+++ b/resources/views/front/career/print.blade.php
@@ -420,7 +420,7 @@
Staj Sorumlusu
- @if($intern->notebook_supervisor_signed)
+ @if($entry && $entry->supervisor_approved)
E-ONAYLI
@@ -437,7 +437,7 @@
Birim Yetkilisi
- @if($intern->notebook_unit_signed)
+ @if($entry && $entry->unit_approved)
E-ONAYLI
diff --git a/resources/views/front/career/verify.blade.php b/resources/views/front/career/verify.blade.php
index b774290..a58fb59 100644
--- a/resources/views/front/career/verify.blade.php
+++ b/resources/views/front/career/verify.blade.php
@@ -3,7 +3,7 @@
@section('content')
-@if($application->status === 'accepted')
+@if($application->status === 'accepted' && $application->notebook_approved)
@@ -68,7 +68,7 @@
{{ \Carbon\Carbon::parse($application->internship_start_date)->format('d.m.Y') }} -
{{ \Carbon\Carbon::parse($application->internship_end_date)->format('d.m.Y') }} tarihleri arasında,
- Trunçgil Teknoloji bünyesinde gerçekleştirdiği uzaktan staj programını başarıyla tamamlayarak bu belgeyi almaya hak kazanmıştır.
+ Trunçgil Teknoloji bünyesinde gerçekleştirdiği staj programını başarıyla tamamlayarak bu belgeyi almaya hak kazanmıştır.
Gösterdiği üstün gayret, sorumluluk bilinci, teknik beceriler ve ekip çalışmasına sağladığı değerli katkılardan dolayı teşekkür eder, profesyonel kariyerinde başarılar dileriz.
@@ -212,7 +212,15 @@
@if($entry && trim($entry->content))
-
+
{{ $day['formatted_date'] }}
{!! $entry->content !!}
diff --git a/routes/web.php b/routes/web.php
index 2296dd7..802ac3e 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -131,6 +131,7 @@ Route::post('/stajyer/cikis', [\App\Http\Controllers\CareerController::class, 'i
Route::get('/stajyer/admin/giris', [\App\Http\Controllers\CareerController::class, 'internAdminLoginForm'])->name('intern.admin.login');
Route::post('/stajyer/admin/giris', [\App\Http\Controllers\CareerController::class, 'internAdminLogin'])->name('intern.admin.login.submit');
Route::get('/stajyer/admin/panel', [\App\Http\Controllers\CareerController::class, 'internAdminDashboard'])->name('intern.admin.dashboard');
+Route::post('/stajyer/admin/toggle-approval', [\App\Http\Controllers\CareerController::class, 'toggleJournalApproval'])->name('intern.admin.toggle-journal-approval');
Route::post('/stajyer/admin/cikis', [\App\Http\Controllers\CareerController::class, 'internAdminLogout'])->name('intern.admin.logout');