From 1c002e44373fba0ccdd7f24b9841ea2d32d2c523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Mon, 31 Aug 2026 12:03:59 +0300 Subject: [PATCH] feat(career): stajyer transkripti ve resmi belgelerin admin ile stajyer panellerine entegrasyonu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Stajı tamamlanan stajyerlerin repo ve defter tutarlılığı doğrulanarak akademik transkriptleri oluşturuldu - Stajyer paneline resmi staj belgeleri showcase kartı, transkript sekmesi ve hızlı indirme aksiyonları eklendi - Admin paneli listesine ve defter inceleme modalına A4/A5 defter, transkript ve repo butonları entegre edildi - Filament InternApplicationResource tablosuna belge doğrulama ve yazdırma aksiyonları tanımlandı - Doğrulama sayfası PDF çıktısı ve buton hover renkleri optimize edildi --- .../InternApplicationResource.php | 45 ++- app/Http/Controllers/CareerController.php | 2 + .../front/career/admin_dashboard.blade.php | 137 +++++++- .../front/career/intern_dashboard.blade.php | 304 +++++++++++++++++- .../front/career/partials/list.blade.php | 33 +- resources/views/front/career/verify.blade.php | 18 +- 6 files changed, 510 insertions(+), 29 deletions(-) diff --git a/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php b/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php index 489b040..fc1b7ef 100644 --- a/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php +++ b/app/Filament/Admin/Resources/InternApplications/InternApplicationResource.php @@ -485,24 +485,45 @@ class InternApplicationResource extends Resource ]), ]) ->actions([ - Action::make('download_cv') - ->label(__('career.download_cv')) - ->icon('heroicon-o-arrow-down-tray') - ->url(fn ($record) => Storage::disk('public')->url($record->cv_path)) - ->openUrlInNewTab(), - Action::make('download_signed_form') - ->label('İmzalı Form İndir') - ->icon('heroicon-o-document-check') - ->url(fn ($record) => $record->signed_internship_form_path ? Storage::disk('public')->url($record->signed_internship_form_path) : null) - ->visible(fn ($record) => !empty($record->signed_internship_form_path)) - ->openUrlInNewTab(), Action::make('view_certificate') - ->label('Sertifika Doğrulama') + ->label('Sertifika & Transkript') ->icon('heroicon-o-academic-cap') ->color('success') ->url(fn ($record) => $record->certificate_code ? route('internship.verify', $record->certificate_code) : null) ->visible(fn ($record) => !empty($record->certificate_code)) ->openUrlInNewTab(), + Action::make('print_journal_a4') + ->label('A4 Defter') + ->icon('heroicon-o-printer') + ->color('info') + ->url(fn ($record) => route('intern.print-journal') . '?size=a4&intern_id=' . $record->id) + ->visible(fn ($record) => !empty($record->internship_total_days)) + ->openUrlInNewTab(), + Action::make('print_journal_a5') + ->label('A5 Defter') + ->icon('heroicon-o-printer') + ->color('gray') + ->url(fn ($record) => route('intern.print-journal') . '?size=a5&intern_id=' . $record->id) + ->visible(fn ($record) => !empty($record->internship_total_days)) + ->openUrlInNewTab(), + Action::make('download_markdown') + ->label('Günlük (.md)') + ->icon('heroicon-o-arrow-down-tray') + ->color('warning') + ->url(fn ($record) => route('intern.download-journal') . '?intern_id=' . $record->id) + ->visible(fn ($record) => !empty($record->github_repo)) + ->openUrlInNewTab(), + Action::make('download_signed_form') + ->label('İmzalı Form') + ->icon('heroicon-o-document-check') + ->url(fn ($record) => $record->signed_internship_form_path ? Storage::disk('public')->url($record->signed_internship_form_path) : null) + ->visible(fn ($record) => !empty($record->signed_internship_form_path)) + ->openUrlInNewTab(), + Action::make('download_cv') + ->label(__('career.download_cv')) + ->icon('heroicon-o-arrow-down-tray') + ->url(fn ($record) => Storage::disk('public')->url($record->cv_path)) + ->openUrlInNewTab(), DeleteAction::make(), ]) ->bulkActions([ diff --git a/app/Http/Controllers/CareerController.php b/app/Http/Controllers/CareerController.php index 2bc5639..5743dac 100644 --- a/app/Http/Controllers/CareerController.php +++ b/app/Http/Controllers/CareerController.php @@ -811,6 +811,8 @@ class CareerController extends Controller 'end_date' => $intern->internship_end_date, 'total_days' => $intern->internship_total_days, 'filled_days' => $filledDaysCount, + 'certificate_code' => $intern->certificate_code, + 'github_repo' => $intern->github_repo, 'notebook_supervisor_signed' => (bool)$intern->notebook_supervisor_signed, 'notebook_supervisor_name' => $intern->notebook_supervisor_name, 'notebook_unit_signed' => (bool)$intern->notebook_unit_signed, diff --git a/resources/views/front/career/admin_dashboard.blade.php b/resources/views/front/career/admin_dashboard.blade.php index 3b6e168..2cf1acf 100644 --- a/resources/views/front/career/admin_dashboard.blade.php +++ b/resources/views/front/career/admin_dashboard.blade.php @@ -137,6 +137,38 @@ + +
+
+ + Resmi Belgeler & Çıktılar +
+ + +
+ @@ -198,7 +230,13 @@ -
+
@@ -217,6 +255,63 @@ border-color: #dbeafe; color: #1e40af !important; } + + /* Prevent theme red text color on link buttons hover */ + a.btn-doc-emerald, .btn-doc-emerald { + color: #ffffff !important; + } + a.btn-doc-emerald:hover, a.btn-doc-emerald:focus, .btn-doc-emerald:hover { + color: #ffffff !important; + background-color: #047857 !important; + text-decoration: none !important; + } + a.btn-doc-blue, .btn-doc-blue { + color: #1d4ed8 !important; + } + a.btn-doc-blue:hover, a.btn-doc-blue:focus, .btn-doc-blue:hover { + color: #1e40af !important; + background-color: #dbeafe !important; + text-decoration: none !important; + } + a.btn-doc-slate, .btn-doc-slate { + color: #475569 !important; + } + a.btn-doc-slate:hover, a.btn-doc-slate:focus, .btn-doc-slate:hover { + color: #0f172a !important; + background-color: #e2e8f0 !important; + text-decoration: none !important; + } + a.btn-doc-amber, .btn-doc-amber { + color: #b45309 !important; + } + a.btn-doc-amber:hover, a.btn-doc-amber:focus, .btn-doc-amber:hover { + color: #92400e !important; + background-color: #fef3c7 !important; + text-decoration: none !important; + } + a.btn-doc-green, .btn-doc-green { + color: #15803d !important; + } + a.btn-doc-green:hover, a.btn-doc-green:focus, .btn-doc-green:hover { + color: #166534 !important; + background-color: #dcfce7 !important; + text-decoration: none !important; + } + a.btn-doc-repo, .btn-doc-repo { + color: #2563eb !important; + } + a.btn-doc-repo:hover, a.btn-doc-repo:focus, .btn-doc-repo:hover { + color: #1d4ed8 !important; + text-decoration: underline !important; + } + a.btn-doc-md, .btn-doc-md { + color: #059669 !important; + } + a.btn-doc-md:hover, a.btn-doc-md:focus, .btn-doc-md:hover { + color: #047857 !important; + background-color: #d1fae5 !important; + text-decoration: none !important; + } @endpush @@ -318,6 +413,46 @@ updateSignatureUI('unit', data.intern.notebook_unit_signed, data.intern.notebook_unit_name); updateSignatureUI('approved', data.intern.notebook_approved, null); + // Setup Official Document URLs + const certCode = data.intern.certificate_code; + const certBtn = document.getElementById('ijm-btn-verify-cert'); + const footerCertBtn = document.getElementById('ijm-footer-verify'); + if (certCode) { + const verifyUrl = `/staj-dogrulama/${certCode}`; + if (certBtn) { + certBtn.href = verifyUrl; + certBtn.classList.remove('hidden'); + } + if (footerCertBtn) { + footerCertBtn.href = verifyUrl; + footerCertBtn.classList.remove('hidden'); + } + } else { + if (certBtn) certBtn.classList.add('hidden'); + if (footerCertBtn) footerCertBtn.classList.add('hidden'); + } + + const printA4Btn = document.getElementById('ijm-btn-print-a4'); + if (printA4Btn) printA4Btn.href = `/stajyer/defteri-yazdir?size=a4&intern_id=${internId}`; + + const printA5Btn = document.getElementById('ijm-btn-print-a5'); + if (printA5Btn) printA5Btn.href = `/stajyer/defteri-yazdir?size=a5&intern_id=${internId}`; + + const mdBtn = document.getElementById('ijm-btn-download-md'); + if (mdBtn) mdBtn.href = `/stajyer/gunluk-indir?intern_id=${internId}`; + + const repoBtn = document.getElementById('ijm-btn-repo'); + if (repoBtn) { + if (data.intern.github_repo) { + repoBtn.href = data.intern.github_repo; + repoBtn.classList.remove('hidden'); + repoBtn.classList.add('flex'); + } else { + repoBtn.classList.add('hidden'); + repoBtn.classList.remove('flex'); + } + } + // Setup carousel slide data journalEntries = data.entries; diff --git a/resources/views/front/career/intern_dashboard.blade.php b/resources/views/front/career/intern_dashboard.blade.php index df3bdf0..ca868a8 100644 --- a/resources/views/front/career/intern_dashboard.blade.php +++ b/resources/views/front/career/intern_dashboard.blade.php @@ -119,6 +119,69 @@ } @endphp + + @if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted')) +
+ +
+
+ +
+
+
+ + Resmi Onaylı Staj Belgesi + + @if($intern->notebook_supervisor_signed) + + Sorumlu Onayladı: {{ $intern->notebook_supervisor_name ?: 'Alperen Trunç' }} + + @endif + @if($intern->notebook_approved) + + Defter Genel Onaylı + + @endif +
+ +

+ Staj Bitirme Sertifikası & Akademik Transkriptiniz Hazır! +

+

+ Trunçgil Teknoloji bünyesinde başarıyla tamamladığınız staj dönemi için resmi staj bitirme sertifikanız, detaylı akademik performans transkriptiniz ve onaylı staj defteriniz sistemde aktif edilmiştir. +

+
+ Doğrulama No: + {{ $intern->certificate_code }} +
+
+ + + +
+
+ @endif +

@@ -394,6 +457,22 @@ Sitede yayınlanacak bloglar

+ + + @@ -644,9 +723,73 @@ Bekleniyor - @endif + @if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted')) + +
+
+
+ +
+
+
+

Staj Bitirme Sertifikası & Akademik Transkript

+ Onaylı +
+

Dijital imzalı staj sertifikanız, akademik transkriptiniz ve performans değerlendirme raporunuz.

+ Kod: {{ $intern->certificate_code }} +
+
+
+ +
+
+
+ +
+
+

Onaylı Staj Defteri Raporu

+

Sorumlu ve birim imzalarıyla onaylanmış günlük staj defteri çıktısı.

+
+
+ +
+ @endif + + @if($intern->github_repo) + +
+
+
+ +
+
+

Staj Günlüğü Markdown Dosyası (.md)

+

GitHub deponuzdaki commitler ve günlük defter kayıtlarınızla derlenmiş markdown çıktısı.

+
+
+ + + İndir (.md) + +
+ @endif + @@ -1018,6 +1161,82 @@ + + + @@ -1924,9 +2143,86 @@ .no-scrollbar::-webkit-scrollbar { display: none; } - .no-scrollbar { - -ms-overflow-style: none; - scrollbar-width: none; + .transcript-markdown-wrapper table { + width: 100%; + margin-top: 0.75rem; + margin-bottom: 1.25rem; + border-collapse: collapse; + } + .transcript-markdown-wrapper th { + background-color: #f8fafc; + border: 1px solid #e2e8f0; + padding: 8px 12px; + font-size: 12px; + font-weight: 700; + color: #1e293b; + text-align: left; + } + .transcript-markdown-wrapper td { + border: 1px solid #e2e8f0; + padding: 8px 12px; + font-size: 13px; + color: #334155; + } + .transcript-markdown-wrapper h3 { + font-size: 16px; + font-weight: 800; + color: #0f172a; + margin-top: 1rem; + margin-bottom: 0.75rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid #e2e8f0; + } + .transcript-markdown-wrapper h4 { + font-size: 14px; + font-weight: 700; + color: #1e293b; + margin-top: 1.25rem; + margin-bottom: 0.5rem; + } + .transcript-markdown-wrapper blockquote { + border-left: 4px solid #f97316; + padding-left: 1rem; + font-style: italic; + color: #475569; + background: #fff7ed; + padding: 12px; + border-radius: 0 12px 12px 0; + margin: 1rem 0; + } + + /* Prevent theme red text color on link buttons hover */ + a.btn-doc-emerald, .btn-doc-emerald { + color: #ffffff !important; + } + a.btn-doc-emerald:hover, a.btn-doc-emerald:focus, .btn-doc-emerald:hover { + color: #ffffff !important; + background-color: #047857 !important; + text-decoration: none !important; + } + a.btn-doc-blue, .btn-doc-blue { + color: #1d4ed8 !important; + } + a.btn-doc-blue:hover, a.btn-doc-blue:focus, .btn-doc-blue:hover { + color: #1e40af !important; + background-color: #dbeafe !important; + text-decoration: none !important; + } + a.btn-doc-slate, .btn-doc-slate { + color: #475569 !important; + } + a.btn-doc-slate:hover, a.btn-doc-slate:focus, .btn-doc-slate:hover { + color: #0f172a !important; + background-color: #e2e8f0 !important; + text-decoration: none !important; + } + a.btn-doc-purple, .btn-doc-purple { + color: #ffffff !important; + } + a.btn-doc-purple:hover, a.btn-doc-purple:focus, .btn-doc-purple:hover { + color: #ffffff !important; + background-color: #7e22ce !important; + text-decoration: none !important; } @endpush diff --git a/resources/views/front/career/partials/list.blade.php b/resources/views/front/career/partials/list.blade.php index a207a36..ae6f357 100644 --- a/resources/views/front/career/partials/list.blade.php +++ b/resources/views/front/career/partials/list.blade.php @@ -89,22 +89,37 @@ -
+
+ @if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted')) + + Sertifika & Transkript + + @endif + + @if($intern->internship_total_days) + + A4 Defter + + + A5 Defter + + @endif + @if($intern->cv_path) - - CV + + CV @endif @if($intern->to_be_signed_internship_form_path) - - İmzalanacak Form + + Başvuru Formu @endif @if($intern->signed_internship_form_path) - - İmzalı Form + + İmzalı Form @endif
@@ -114,11 +129,11 @@ @if($intern->github_repo) diff --git a/resources/views/front/career/verify.blade.php b/resources/views/front/career/verify.blade.php index 5dbd486..9fbdf58 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' && $application->notebook_approved) +@if($application->status === 'accepted' && ($application->notebook_approved || $application->notebook_supervisor_signed || !empty($application->transcript_markdown)))
@@ -17,11 +17,18 @@ Bu staj sertifikası ve transkripti, Trunçgil Teknopark sistemi üzerinden dijital olarak imzalanıp onaylanmıştır.
-
+
+ + + + A4 Defter + -
@@ -261,6 +268,11 @@