Compare commits
8 Commits
3747b4e44f
...
2026-july
| Author | SHA1 | Date | |
|---|---|---|---|
| 197033dc14 | |||
| 64a997f3c3 | |||
| b9a069b905 | |||
| a2fe9e136b | |||
| ff3e084222 | |||
| f1a579c8ee | |||
| 3b0d2664e4 | |||
| 1c002e4437 |
@@ -27,6 +27,8 @@ use Illuminate\Support\Str;
|
||||
use Filament\Schemas\Components\Utilities\Set;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
use Filament\Forms\Components\Radio;
|
||||
|
||||
class InternApplicationResource extends Resource
|
||||
{
|
||||
protected static ?string $model = CareerApplication::class;
|
||||
@@ -77,21 +79,28 @@ class InternApplicationResource extends Resource
|
||||
->label(__('career.phone'))
|
||||
->disabled(),
|
||||
|
||||
Select::make('status')
|
||||
->label(__('career.status'))
|
||||
->options([
|
||||
'pending' => __('career.pending'),
|
||||
'reviewed' => __('career.reviewed'),
|
||||
'rejected' => __('career.rejected'),
|
||||
'accepted' => __('career.accepted'),
|
||||
'waiting_document' => __('career.waiting_document'),
|
||||
])
|
||||
->required(),
|
||||
|
||||
Textarea::make('message')
|
||||
->label(__('career.message'))
|
||||
->disabled()
|
||||
->columnSpanFull(),
|
||||
->disabled(),
|
||||
|
||||
Radio::make('status')
|
||||
->label('Stajyer Başvuru & İlerleme Aşaması')
|
||||
->options([
|
||||
'pending' => '1. Aşama: Başvuru Alındı (Beklemede)',
|
||||
'reviewed' => '2. Aşama: Ön Değerlendirme Yapıldı (İncelendi)',
|
||||
'waiting_document' => '3. Aşama: Staj Formu Bekleniyor (Stajyer Form Yükleyecek)',
|
||||
'accepted' => '4. Aşama: Kabul Edildi & Staj Aktif (İmzalı Form Onaylandı)',
|
||||
'rejected' => 'Reddedildi (Başvuru İptal / Olumsuz)',
|
||||
])
|
||||
->descriptions([
|
||||
'pending' => 'Stajyer yeni başvurdu. CV ve başvuru bilgileri incelenmeyi bekliyor.',
|
||||
'reviewed' => 'CV ve ön başvuru incelendi, uygunluk değerlendirmesi tamamlandı.',
|
||||
'waiting_document' => 'Stajyer kabul sürecine alındı. Okulundan alacağı staj formunu ve tarihlerini panelinden yüklemesi bekleniyor.',
|
||||
'accepted' => 'İmzalı staj formu sisteme yüklendi/onaylandı ve staj defteri doldurma süreci başladı.',
|
||||
'rejected' => 'Başvuru kriterlere uymadığı için olumsuz sonuçlandırıldı.',
|
||||
])
|
||||
->columnSpanFull()
|
||||
->required(),
|
||||
])->columns(2),
|
||||
|
||||
Tab::make('Staj Belgeleri & Giriş Bilgileri')
|
||||
@@ -477,32 +486,53 @@ class InternApplicationResource extends Resource
|
||||
SelectFilter::make('status')
|
||||
->label(__('career.status'))
|
||||
->options([
|
||||
'pending' => __('career.pending'),
|
||||
'reviewed' => __('career.reviewed'),
|
||||
'rejected' => __('career.rejected'),
|
||||
'accepted' => __('career.accepted'),
|
||||
'waiting_document' => __('career.waiting_document'),
|
||||
'pending' => '1. Aşama: Beklemede',
|
||||
'reviewed' => '2. Aşama: İncelendi',
|
||||
'waiting_document' => '3. Aşama: Staj Formu Bekleniyor',
|
||||
'accepted' => '4. Aşama: Kabul Edildi',
|
||||
'rejected' => 'Reddedildi',
|
||||
]),
|
||||
])
|
||||
->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([
|
||||
|
||||
@@ -56,7 +56,7 @@ class BlogController extends Controller
|
||||
}
|
||||
|
||||
$posts = $query
|
||||
? $query->latest('published_at')->paginate(12)
|
||||
? $query->orderByRaw('COALESCE(published_at, created_at) DESC')->paginate(12)
|
||||
: collect();
|
||||
|
||||
// Blog sayfa ayarlarını bul (varsa)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -53,7 +53,7 @@ class CareerApplication extends Model
|
||||
*/
|
||||
public function blogs()
|
||||
{
|
||||
return $this->hasMany(Blog::class, 'career_application_id');
|
||||
return $this->hasMany(Blog::class, 'career_application_id')->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
protected static function booted()
|
||||
|
||||
@@ -80,11 +80,11 @@ return [
|
||||
'intent_letter' => 'Niyet Mektubu',
|
||||
|
||||
// Statuses
|
||||
'pending' => 'Beklemede',
|
||||
'reviewed' => 'İncelendi',
|
||||
'pending' => '1. Aşama: Beklemede',
|
||||
'reviewed' => '2. Aşama: İncelendi',
|
||||
'waiting_document' => '3. Aşama: Staj Formu Bekleniyor',
|
||||
'accepted' => '4. Aşama: Kabul Edildi',
|
||||
'rejected' => 'Reddedildi',
|
||||
'accepted' => 'Kabul Edildi',
|
||||
'waiting_document' => 'İmzalı Staj Formu Bekleniyor',
|
||||
|
||||
// Wizard and Mermaid
|
||||
'step_1_title' => '1. Şartlar & Koşullar',
|
||||
|
||||
|
After Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 252 KiB |
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="theme-color" content="#0B1B3A" />
|
||||
<meta name="theme-color" content="#e6eef9" />
|
||||
<title>Trunçgil B2B | Toptancı & Bayi Yönetim Platformu</title>
|
||||
<meta
|
||||
name="description"
|
||||
@@ -16,8 +16,8 @@
|
||||
rel="stylesheet"
|
||||
/>
|
||||
<link rel="canonical" href="https://truncgil.com/b2b/" />
|
||||
<script type="module" crossorigin src="/b2b/assets/index-B1Hl_CEN.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/b2b/assets/index-Dc8a63TK.css">
|
||||
<script type="module" crossorigin src="/b2b/assets/index-B0gy-q6S.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/b2b/assets/index-CIcsclZq.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
|
After Width: | Height: | Size: 708 KiB |
@@ -0,0 +1,16 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#1D4ED8"/>
|
||||
<stop offset="0.55" stop-color="#2563EB"/>
|
||||
<stop offset="1" stop-color="#22D3EE"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="ring" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#22D3EE" stop-opacity="0.9"/>
|
||||
<stop offset="1" stop-color="#67E8F9" stop-opacity="0.5"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect width="512" height="512" rx="112" fill="url(#bg)"/>
|
||||
<circle cx="256" cy="256" r="168" fill="none" stroke="url(#ring)" stroke-width="10" opacity="0.85"/>
|
||||
<text x="256" y="292" text-anchor="middle" font-family="Plus Jakarta Sans, Segoe UI, system-ui, sans-serif" font-size="148" font-weight="800" fill="#FFFFFF" letter-spacing="-4">B2B</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 898 B |
|
After Width: | Height: | Size: 595 KiB |
|
After Width: | Height: | Size: 508 KiB |
|
After Width: | Height: | Size: 64 KiB |
@@ -3,7 +3,7 @@
|
||||
$blogs = \App\Models\Blog::with(['category', 'author', 'careerApplication'])
|
||||
->withCount('comments')
|
||||
->published()
|
||||
->latest('published_at')
|
||||
->orderByRaw('COALESCE(published_at, created_at) DESC')
|
||||
->limit(6)
|
||||
->get();
|
||||
@endphp
|
||||
|
||||
@@ -137,6 +137,38 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Official Documents & Quick Exports Card -->
|
||||
<div class="bg-slate-50 rounded-2xl p-5 border border-slate-200/50 space-y-3">
|
||||
<h5 class="font-bold text-slate-700 text-xs uppercase tracking-wider flex items-center gap-1.5">
|
||||
<i class="uil uil-file-download-alt text-emerald-600"></i>
|
||||
<span>Resmi Belgeler & Çıktılar</span>
|
||||
</h5>
|
||||
|
||||
<div class="space-y-2" id="ijm-documents-container">
|
||||
<a href="#" id="ijm-btn-verify-cert" target="_blank" class="btn-doc-emerald w-full px-3 py-2 bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white font-extrabold text-xs rounded-xl transition-all flex items-center justify-between shadow-sm">
|
||||
<span class="flex items-center gap-1.5"><i class="uil uil-award"></i> Sertifika & Transkript</span>
|
||||
<i class="uil uil-external-link-alt text-xs"></i>
|
||||
</a>
|
||||
|
||||
<div class="grid grid-cols-2 gap-2">
|
||||
<a href="#" id="ijm-btn-print-a4" target="_blank" class="btn-doc-slate px-3 py-2 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 hover:text-slate-900 font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1">
|
||||
<i class="uil uil-print text-xs"></i> A4 Defter
|
||||
</a>
|
||||
<a href="#" id="ijm-btn-print-a5" target="_blank" class="btn-doc-slate px-3 py-2 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 hover:text-slate-900 font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1">
|
||||
<i class="uil uil-print text-xs"></i> A5 Defter
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<a href="#" id="ijm-btn-download-md" target="_blank" class="btn-doc-slate w-full px-3 py-2 bg-slate-100 hover:bg-slate-200 text-slate-700 hover:text-slate-900 font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5">
|
||||
<i class="uil uil-arrow-down-tray"></i> Günlüğü İndir (.md)
|
||||
</a>
|
||||
|
||||
<a href="#" id="ijm-btn-repo" target="_blank" class="hidden w-full px-3 py-2 bg-slate-900 hover:bg-black text-white hover:text-white font-bold text-xs rounded-xl transition-all items-center justify-center gap-1.5">
|
||||
<i class="uil uil-github"></i> GitHub Reposu
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Right Section: Carousel & Navigation (col-span-8) -->
|
||||
@@ -198,7 +230,13 @@
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="px-6 py-4 bg-slate-50 border-t border-slate-100 flex items-center justify-end flex-shrink-0">
|
||||
<div class="px-6 py-4 bg-slate-50 border-t border-slate-100 flex items-center justify-between flex-shrink-0">
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="#" id="ijm-footer-verify" target="_blank" class="btn-doc-emerald px-4 py-2 bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white font-bold rounded-xl text-xs transition-colors shadow-sm flex items-center gap-1.5">
|
||||
<i class="uil uil-award"></i>
|
||||
<span>Sertifika & Transkript Doğrula</span>
|
||||
</a>
|
||||
</div>
|
||||
<button type="button" onclick="closeInternJournalModal()" class="px-5 py-2.5 bg-slate-800 hover:bg-slate-900 text-white font-bold rounded-xl text-xs transition-colors shadow-md cursor-pointer">Kapat</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -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;
|
||||
}
|
||||
</style>
|
||||
@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;
|
||||
|
||||
|
||||
@@ -119,6 +119,69 @@
|
||||
}
|
||||
@endphp
|
||||
|
||||
<!-- Staj Bitirme Belgeleri & Transkript Showcase Card -->
|
||||
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
|
||||
<div class="bg-gradient-to-br from-slate-900 via-slate-800 to-indigo-950 rounded-3xl p-6 md:p-8 shadow-2xl text-white mb-8 relative overflow-hidden border border-slate-700/50">
|
||||
<!-- Glow accents -->
|
||||
<div class="absolute -right-20 -top-20 w-80 h-80 bg-blue-500/20 rounded-full blur-3xl pointer-events-none"></div>
|
||||
<div class="absolute -left-20 -bottom-20 w-80 h-80 bg-emerald-500/20 rounded-full blur-3xl pointer-events-none"></div>
|
||||
|
||||
<div class="relative z-10 flex flex-col lg:flex-row justify-between items-start lg:items-center gap-6">
|
||||
<div class="space-y-3 max-w-2xl">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<span class="px-3 py-1 rounded-full bg-emerald-500/20 border border-emerald-400/40 text-emerald-300 text-xs font-extrabold uppercase tracking-wider flex items-center gap-1.5">
|
||||
<i class="uil uil-shield-check text-sm"></i> Resmi Onaylı Staj Belgesi
|
||||
</span>
|
||||
@if($intern->notebook_supervisor_signed)
|
||||
<span class="px-3 py-1 rounded-full bg-blue-500/20 border border-blue-400/40 text-blue-300 text-xs font-extrabold uppercase tracking-wider">
|
||||
Sorumlu Onayladı: {{ $intern->notebook_supervisor_name ?: 'Alperen Trunç' }}
|
||||
</span>
|
||||
@endif
|
||||
@if($intern->notebook_approved)
|
||||
<span class="px-3 py-1 rounded-full bg-purple-500/20 border border-purple-400/40 text-purple-300 text-xs font-extrabold uppercase tracking-wider">
|
||||
Defter Genel Onaylı
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<h2 class="text-2xl md:text-3xl font-extrabold text-white tracking-tight">
|
||||
Staj Bitirme Sertifikası & Akademik Transkriptiniz Hazır!
|
||||
</h2>
|
||||
<p class="text-sm text-slate-300 leading-relaxed">
|
||||
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.
|
||||
</p>
|
||||
<div class="text-xs text-slate-400 font-mono flex items-center gap-2">
|
||||
<span>Doğrulama No:</span>
|
||||
<strong class="text-emerald-400 bg-slate-800/90 px-3 py-1 rounded-lg border border-slate-700 font-bold tracking-wider">{{ $intern->certificate_code }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<div class="flex flex-col sm:flex-row lg:flex-col gap-2.5 w-full lg:w-auto flex-shrink-0">
|
||||
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="px-6 py-3.5 bg-gradient-to-r from-emerald-500 to-teal-500 hover:from-emerald-600 hover:to-teal-600 text-white font-extrabold text-sm rounded-2xl transition-all shadow-lg shadow-emerald-500/20 flex items-center justify-center gap-2 text-center">
|
||||
<i class="uil uil-award text-lg"></i>
|
||||
<span>Sertifika & Transkripti Aç</span>
|
||||
</a>
|
||||
|
||||
<div class="grid grid-cols-2 gap-2">
|
||||
<a href="{{ route('intern.print-journal') }}?size=a4" target="_blank" class="px-3.5 py-2.5 bg-white/10 hover:bg-white/20 text-white font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5 border border-white/10 text-center">
|
||||
<i class="uil uil-print"></i> A4 Defter
|
||||
</a>
|
||||
<a href="{{ route('intern.print-journal') }}?size=a5" target="_blank" class="px-3.5 py-2.5 bg-white/10 hover:bg-white/20 text-white font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5 border border-white/10 text-center">
|
||||
<i class="uil uil-print"></i> A5 Defter
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if($intern->github_repo)
|
||||
<a href="{{ route('intern.download-journal') }}" class="px-4 py-2.5 bg-blue-600/80 hover:bg-blue-600 text-white font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5 border border-blue-500/30 text-center">
|
||||
<i class="uil uil-arrow-down-tray"></i> Günlüğü İndir (.md)
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Stage Timeline Card -->
|
||||
<div class="bg-white rounded-3xl p-6 md:p-8 shadow-xl border border-slate-100/50 mb-8">
|
||||
<h3 class="font-bold text-slate-800 text-lg mb-6 pb-2 border-b border-slate-100 flex items-center gap-2">
|
||||
@@ -394,6 +457,22 @@
|
||||
<span class="block text-xs text-slate-400 font-semibold mt-0.5">Sitede yayınlanacak bloglar</span>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<!-- Menu Item 5: Sertifika & Transkript -->
|
||||
<button type="button" role="tab" aria-selected="false" data-tab-target="transcript" class="tab-btn w-full flex items-center gap-4 p-3 rounded-2xl text-left transition-all border border-transparent">
|
||||
<div class="w-10 h-10 rounded-xl bg-slate-50 text-slate-500 flex items-center justify-center text-xl flex-shrink-0 tab-icon">
|
||||
<i class="uil uil-award"></i>
|
||||
</div>
|
||||
<div class="flex-grow">
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="block text-sm font-extrabold text-slate-800">Sertifika & Transkript</span>
|
||||
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
|
||||
<span class="text-[10px] font-extrabold px-2 py-0.5 rounded-full bg-emerald-100 text-emerald-700">Hazır</span>
|
||||
@endif
|
||||
</div>
|
||||
<span class="block text-xs text-slate-400 font-semibold mt-0.5">Akademik rapor & onay</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -581,11 +660,11 @@
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label for="internship_start_date" class="block text-xs font-extrabold text-slate-500 uppercase tracking-wider mb-1.5">Staj Başlangıç Tarihi</label>
|
||||
<input type="date" name="internship_start_date" id="internship_start_date" onchange="calculateEndDateFrontend()" oninput="calculateEndDateFrontend()" required value="{{ $intern->internship_start_date }}" @if($intern->status !== 'pending') disabled @endif class="w-full px-4 py-3 rounded-xl border border-slate-200 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 focus:outline-none text-sm font-semibold text-slate-700 bg-white transition-all disabled:bg-slate-50 disabled:text-slate-500 disabled:cursor-not-allowed" />
|
||||
<input type="date" name="internship_start_date" id="internship_start_date" onchange="calculateEndDateFrontend()" oninput="calculateEndDateFrontend()" required value="{{ $intern->internship_start_date }}" @if(!in_array($intern->status, ['pending', 'waiting_document', 'reviewed'])) disabled @endif class="w-full px-4 py-3 rounded-xl border border-slate-200 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 focus:outline-none text-sm font-semibold text-slate-700 bg-white transition-all disabled:bg-slate-50 disabled:text-slate-500 disabled:cursor-not-allowed" />
|
||||
</div>
|
||||
<div>
|
||||
<label for="internship_total_days" class="block text-xs font-extrabold text-slate-500 uppercase tracking-wider mb-1.5">Staj Süresi (İş Günü)</label>
|
||||
<input type="number" name="internship_total_days" id="internship_total_days" onchange="calculateEndDateFrontend()" oninput="calculateEndDateFrontend()" min="1" required value="{{ $intern->internship_total_days }}" placeholder="Örn: 20" @if($intern->status !== 'pending') disabled @endif class="w-full px-4 py-3 rounded-xl border border-slate-200 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 focus:outline-none text-sm font-semibold text-slate-700 bg-white transition-all disabled:bg-slate-50 disabled:text-slate-500 disabled:cursor-not-allowed" />
|
||||
<input type="number" name="internship_total_days" id="internship_total_days" onchange="calculateEndDateFrontend()" oninput="calculateEndDateFrontend()" min="1" required value="{{ $intern->internship_total_days }}" placeholder="Örn: 20" @if(!in_array($intern->status, ['pending', 'waiting_document', 'reviewed'])) disabled @endif class="w-full px-4 py-3 rounded-xl border border-slate-200 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 focus:outline-none text-sm font-semibold text-slate-700 bg-white transition-all disabled:bg-slate-50 disabled:text-slate-500 disabled:cursor-not-allowed" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@@ -594,7 +673,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if($intern->status === 'pending')
|
||||
@if(in_array($intern->status, ['pending', 'waiting_document', 'reviewed']))
|
||||
<div class="relative border-2 border-dashed border-slate-200 hover:border-blue-400 rounded-2xl p-6 transition-all bg-white flex flex-col items-center justify-center text-center cursor-pointer group">
|
||||
<input type="file" name="internship_form" id="internship_form" accept=".pdf,.docx,.jpg,.png,.jpeg" onchange="handleFileSelected(this)" class="absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10" />
|
||||
<i class="uil uil-cloud-upload text-4xl text-slate-400 group-hover:text-blue-500 transition-colors mb-2"></i>
|
||||
@@ -611,7 +690,7 @@
|
||||
</div>
|
||||
@else
|
||||
<div class="p-4 bg-slate-50 border border-slate-100 rounded-2xl text-center text-xs text-slate-500 font-semibold">
|
||||
<i class="uil uil-lock-alt text-base mr-1"></i> Başvurunuz bekleme aşamasında (beklemede) olmadığı için staj bilgilerinizi ve dosyanızı güncelleyemezsiniz.
|
||||
<i class="uil uil-lock-alt text-base mr-1"></i> Başvurunuz kabul veya ret durumunda olduğu için staj formunuzu ve tarihlerinizi güncelleyemezsiniz.
|
||||
</div>
|
||||
@endif
|
||||
</form>
|
||||
@@ -647,6 +726,73 @@
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
|
||||
<!-- Certificate & Transcript Document Card -->
|
||||
<div class="p-5 rounded-2xl border border-emerald-200 bg-gradient-to-r from-emerald-50/70 to-teal-50/50 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 hover:border-emerald-300 transition-all">
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="w-12 h-12 rounded-xl bg-emerald-600 text-white flex items-center justify-center text-2xl flex-shrink-0 shadow-md shadow-emerald-600/20">
|
||||
<i class="uil uil-award"></i>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-2">
|
||||
<h4 class="font-bold text-slate-800 text-base">Staj Bitirme Sertifikası & Akademik Transkript</h4>
|
||||
<span class="px-2 py-0.5 rounded-md bg-emerald-100 text-emerald-800 text-[10px] font-extrabold uppercase">Onaylı</span>
|
||||
</div>
|
||||
<p class="text-xs text-slate-500 mt-0.5">Dijital imzalı staj sertifikanız, akademik transkriptiniz ve performans değerlendirme raporunuz.</p>
|
||||
<span class="text-[11px] font-mono text-emerald-700 font-bold mt-1 block">Kod: {{ $intern->certificate_code }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 w-full sm:w-auto">
|
||||
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="w-full sm:w-auto px-5 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white font-bold rounded-xl text-sm transition-all flex items-center justify-center gap-2 shadow-md shadow-emerald-600/10">
|
||||
<i class="uil uil-external-link-alt"></i>
|
||||
<span>Görüntüle / Doğrula</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Approved Notebook Card -->
|
||||
<div class="p-5 rounded-2xl border border-slate-100 bg-slate-50/50 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 hover:border-slate-200 transition-all">
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="w-12 h-12 rounded-xl bg-blue-50 text-blue-600 flex items-center justify-center text-2xl flex-shrink-0">
|
||||
<i class="uil uil-book-alt"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="font-bold text-slate-800 text-base">Onaylı Staj Defteri Raporu</h4>
|
||||
<p class="text-xs text-slate-400 mt-0.5">Sorumlu ve birim imzalarıyla onaylanmış günlük staj defteri çıktısı.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 w-full sm:w-auto">
|
||||
<a href="{{ route('intern.print-journal') }}?size=a4" target="_blank" class="px-4 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs transition-all flex items-center justify-center gap-1.5 shadow-sm">
|
||||
<i class="uil uil-print"></i>
|
||||
<span>A4 Yazdır</span>
|
||||
</a>
|
||||
<a href="{{ route('intern.print-journal') }}?size=a5" target="_blank" class="px-4 py-2.5 bg-slate-800 hover:bg-slate-900 text-white font-bold rounded-xl text-xs transition-all flex items-center justify-center gap-1.5 shadow-sm">
|
||||
<i class="uil uil-print"></i>
|
||||
<span>A5 Yazdır</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($intern->github_repo)
|
||||
<!-- Markdown Journal Download Card -->
|
||||
<div class="p-5 rounded-2xl border border-slate-100 bg-slate-50/50 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 hover:border-slate-200 transition-all">
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="w-12 h-12 rounded-xl bg-purple-50 text-purple-600 flex items-center justify-center text-2xl flex-shrink-0">
|
||||
<i class="uil uil-file-download-alt"></i>
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="font-bold text-slate-800 text-base">Staj Günlüğü Markdown Dosyası (.md)</h4>
|
||||
<p class="text-xs text-slate-400 mt-0.5">GitHub deponuzdaki commitler ve günlük defter kayıtlarınızla derlenmiş markdown çıktısı.</p>
|
||||
</div>
|
||||
</div>
|
||||
<a href="{{ route('intern.download-journal') }}" class="w-full sm:w-auto px-5 py-2.5 bg-purple-600 hover:bg-purple-700 text-white font-bold rounded-xl text-sm transition-all flex items-center justify-center gap-2 shadow-sm">
|
||||
<i class="uil uil-arrow-down-tray"></i>
|
||||
<span>İndir (.md)</span>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -824,7 +970,7 @@
|
||||
|
||||
<!-- Progress Bar -->
|
||||
@php
|
||||
$userBlogs = $blogs ?? collect();
|
||||
$userBlogs = ($blogs ?? collect())->sortByDesc('created_at');
|
||||
$publishedBlogs = $userBlogs->where('status', 'published');
|
||||
$publishedCount = $publishedBlogs->count();
|
||||
$progressPercent = min(100, round(($publishedCount / 3) * 100));
|
||||
@@ -1018,6 +1164,82 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Panel 5: Sertifika & Akademik Transkript -->
|
||||
<div id="transcript-panel" class="tab-panel hidden space-y-6">
|
||||
<div class="bg-white rounded-3xl p-6 md:p-8 shadow-xl border border-slate-100/50">
|
||||
|
||||
<div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 mb-6 pb-4 border-b border-slate-100">
|
||||
<div>
|
||||
<h3 class="font-bold text-slate-800 text-lg flex items-center gap-2">
|
||||
<i class="uil uil-award text-emerald-600 text-xl"></i>
|
||||
<span>Staj Bitirme Sertifikası & Akademik Transkript</span>
|
||||
</h3>
|
||||
<p class="text-xs text-slate-400 mt-0.5">Trunçgil Teknoloji staj programı kapsamında elde ettiğiniz kazanımlar, teknik değerlendirme ve resmi transkriptiniz.</p>
|
||||
</div>
|
||||
@if($intern->certificate_code)
|
||||
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="px-5 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white font-extrabold text-xs rounded-xl transition-all shadow-md shadow-emerald-600/20 flex items-center justify-center gap-1.5 whitespace-nowrap">
|
||||
<i class="uil uil-external-link-alt"></i>
|
||||
<span>Doğrulama Sayfasını Aç</span>
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<!-- Official Verification Status Header -->
|
||||
<div class="bg-gradient-to-r from-slate-900 to-indigo-950 text-white rounded-2xl p-6 mb-6 shadow-md relative overflow-hidden">
|
||||
<div class="relative z-10 flex flex-col md:flex-row justify-between items-start md:items-center gap-6">
|
||||
<div>
|
||||
<div class="flex flex-wrap items-center gap-2 mb-2">
|
||||
<span class="px-3 py-1 bg-emerald-500/20 border border-emerald-400/30 text-emerald-300 text-[10px] font-extrabold uppercase rounded-full tracking-wider flex items-center gap-1">
|
||||
<i class="uil uil-check-circle"></i> Onaylı Belge
|
||||
</span>
|
||||
@if($intern->notebook_supervisor_signed)
|
||||
<span class="px-3 py-1 bg-blue-500/20 border border-blue-400/30 text-blue-300 text-[10px] font-extrabold uppercase rounded-full tracking-wider">
|
||||
Sorumlu: {{ $intern->notebook_supervisor_name ?: 'Alperen Trunç' }}
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
<h4 class="text-lg font-extrabold text-white">{{ $intern->name }}</h4>
|
||||
<p class="text-xs text-slate-300 mt-0.5">{{ \Carbon\Carbon::parse($intern->internship_start_date)->format('d.m.Y') }} - {{ \Carbon\Carbon::parse($intern->internship_end_date)->format('d.m.Y') }} ({{ $intern->internship_total_days }} İş Günü)</p>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col items-start md:items-end">
|
||||
<span class="text-[10px] text-slate-400 font-extrabold uppercase tracking-wider block">Güvenli Doğrulama Kodu</span>
|
||||
<span class="text-sm font-mono font-extrabold text-emerald-400 bg-slate-800/90 px-3 py-1 rounded-lg border border-slate-700 mt-1">{{ $intern->certificate_code }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Quick Export Buttons Bar -->
|
||||
<div class="p-4 rounded-2xl bg-slate-50 border border-slate-100 flex flex-wrap gap-2.5 items-center justify-between mb-6">
|
||||
<div class="text-xs font-bold text-slate-600 flex items-center gap-1.5">
|
||||
<i class="uil uil-print text-base text-blue-600"></i>
|
||||
<span>Hızlı Belge ve Rapor Çıktıları:</span>
|
||||
</div>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<a href="{{ route('intern.print-journal') }}?size=a4" target="_blank" class="px-3 py-1.5 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 font-bold text-xs rounded-xl transition-all flex items-center gap-1">
|
||||
<i class="uil uil-print"></i> A4 Defter
|
||||
</a>
|
||||
<a href="{{ route('intern.print-journal') }}?size=a5" target="_blank" class="px-3 py-1.5 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 font-bold text-xs rounded-xl transition-all flex items-center gap-1">
|
||||
<i class="uil uil-print"></i> A5 Defter
|
||||
</a>
|
||||
@if($intern->github_repo)
|
||||
<a href="{{ route('intern.download-journal') }}" class="px-3 py-1.5 bg-purple-50 hover:bg-purple-100 text-purple-700 border border-purple-200 font-bold text-xs rounded-xl transition-all flex items-center gap-1">
|
||||
<i class="uil uil-arrow-down-tray"></i> Markdown (.md)
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rendered Transcript Markdown Content -->
|
||||
<div class="transcript-markdown-wrapper p-6 md:p-8 rounded-2xl bg-white border border-slate-200/80 shadow-inner">
|
||||
<div class="prose max-w-none text-slate-700 leading-relaxed">
|
||||
{!! new \Illuminate\Support\HtmlString(\Illuminate\Support\Str::markdown($intern->transcript_markdown ?? '')) !!}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1103,11 +1325,13 @@
|
||||
<script>
|
||||
|
||||
|
||||
let quill;
|
||||
let quill = null;
|
||||
|
||||
// Tab Switch Logic
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Initialize Quill editor
|
||||
// Initialize Quill editor if container exists
|
||||
const editorElement = document.getElementById('editor-content-quill');
|
||||
if (editorElement) {
|
||||
quill = new Quill('#editor-content-quill', {
|
||||
theme: 'snow',
|
||||
modules: {
|
||||
@@ -1118,6 +1342,7 @@
|
||||
]
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const tabButtons = document.querySelectorAll('.tab-btn');
|
||||
const tabPanels = document.querySelectorAll('.tab-panel');
|
||||
@@ -1157,8 +1382,10 @@
|
||||
// Handle initial state of date logic
|
||||
calculateEndDateFrontend();
|
||||
|
||||
// Select first day of the notebook workspace on load
|
||||
// Select first day of the notebook workspace on load if exists
|
||||
if (document.getElementById('btn-day-0')) {
|
||||
selectNotebookDay(0);
|
||||
}
|
||||
});
|
||||
|
||||
const githubRepoUrl = @json($intern->github_repo);
|
||||
@@ -1274,6 +1501,7 @@
|
||||
}
|
||||
|
||||
function renderCommitsToEditor(commitsList) {
|
||||
if (!quill) return;
|
||||
if (commitsList.length === 0) {
|
||||
alert("Bu yazar için seçilen güne ait commit bulunamadı.");
|
||||
return;
|
||||
@@ -1353,6 +1581,7 @@
|
||||
}
|
||||
|
||||
function appendCommitToQuill(sha, time, msg) {
|
||||
if (!quill) return;
|
||||
const escapedMsg = msg.replace(/</g, "<").replace(/>/g, ">");
|
||||
const commitHtml = `<li><strong>[${time}]</strong> (<em>${sha}</em>) ${escapedMsg}</li>`;
|
||||
|
||||
@@ -1400,20 +1629,26 @@
|
||||
const savedContent = newBtn.getAttribute('data-saved-content');
|
||||
const isApproved = newBtn.getAttribute('data-approved') === '1';
|
||||
|
||||
document.getElementById('editor-day-title').textContent = `${dayNum}. Gün`;
|
||||
document.getElementById('editor-day-date').textContent = dateFormatted;
|
||||
const editorDayTitle = document.getElementById('editor-day-title');
|
||||
if (editorDayTitle) editorDayTitle.textContent = `${dayNum}. Gün`;
|
||||
const editorDayDate = document.getElementById('editor-day-date');
|
||||
if (editorDayDate) editorDayDate.textContent = dateFormatted;
|
||||
|
||||
if (quill) {
|
||||
quill.setContents([]);
|
||||
if (savedContent) {
|
||||
quill.clipboard.dangerouslyPasteHTML(savedContent);
|
||||
}
|
||||
document.getElementById('save-status').textContent = '';
|
||||
}
|
||||
const saveStatus = document.getElementById('save-status');
|
||||
if (saveStatus) saveStatus.textContent = '';
|
||||
hideFallbackCommits();
|
||||
|
||||
const hasSaved = savedContent && savedContent.trim() !== '' && savedContent !== '<p><br></p>';
|
||||
updateEditorStatusBadge(isApproved, hasSaved);
|
||||
|
||||
// Future validation
|
||||
if (dateVal) {
|
||||
const dateParts = dateVal.split('-');
|
||||
const selectedDate = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);
|
||||
const today = new Date();
|
||||
@@ -1425,19 +1660,23 @@
|
||||
const gitBtn = document.querySelector('button[onclick="fillFromGithub()"]');
|
||||
|
||||
if (isFuture) {
|
||||
warningBlock.classList.remove('hidden');
|
||||
quill.enable(false);
|
||||
if (warningBlock) warningBlock.classList.remove('hidden');
|
||||
if (quill) quill.enable(false);
|
||||
if (saveBtn) {
|
||||
saveBtn.disabled = true;
|
||||
saveBtn.classList.add('opacity-50', 'cursor-not-allowed');
|
||||
}
|
||||
if (gitBtn) {
|
||||
gitBtn.disabled = true;
|
||||
gitBtn.classList.add('opacity-50', 'cursor-not-allowed');
|
||||
}
|
||||
} else {
|
||||
warningBlock.classList.add('hidden');
|
||||
quill.enable(true);
|
||||
if (warningBlock) warningBlock.classList.add('hidden');
|
||||
if (quill) quill.enable(true);
|
||||
if (saveBtn) {
|
||||
saveBtn.disabled = false;
|
||||
saveBtn.classList.remove('opacity-50', 'cursor-not-allowed');
|
||||
}
|
||||
if (gitBtn) {
|
||||
gitBtn.disabled = false;
|
||||
gitBtn.classList.remove('opacity-50', 'cursor-not-allowed');
|
||||
@@ -1445,6 +1684,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function fillFromGithub() {
|
||||
const btn = document.getElementById(`btn-day-${activeDayIdx}`);
|
||||
@@ -1615,7 +1855,7 @@
|
||||
|
||||
function saveActiveDay() {
|
||||
const btn = document.getElementById(`btn-day-${activeDayIdx}`);
|
||||
if (!btn) return;
|
||||
if (!btn || !quill) return;
|
||||
|
||||
const dayNum = btn.getAttribute('data-day-num');
|
||||
const dateVal = btn.getAttribute('data-date');
|
||||
@@ -1624,9 +1864,10 @@
|
||||
contentVal = '';
|
||||
}
|
||||
const statusText = document.getElementById('save-status');
|
||||
|
||||
if (statusText) {
|
||||
statusText.textContent = "Kaydediliyor...";
|
||||
statusText.className = "text-xs font-semibold text-slate-400 animate-pulse";
|
||||
}
|
||||
|
||||
fetch("{{ route('intern.save-journal') }}", {
|
||||
method: "POST",
|
||||
@@ -1643,8 +1884,10 @@
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
if (statusText) {
|
||||
statusText.textContent = "Başarıyla kaydedildi.";
|
||||
statusText.className = "text-xs font-semibold text-green-600";
|
||||
}
|
||||
|
||||
btn.setAttribute('data-saved-content', contentVal);
|
||||
btn.setAttribute('data-approved', '0');
|
||||
@@ -1663,20 +1906,25 @@
|
||||
|
||||
updateEditorStatusBadge(false, hasContent);
|
||||
} else {
|
||||
if (statusText) {
|
||||
statusText.textContent = data.message || "Kaydedilemedi.";
|
||||
statusText.className = "text-xs font-semibold text-red-600";
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
if (statusText) {
|
||||
statusText.textContent = "Bağlantı hatası oluştu.";
|
||||
statusText.className = "text-xs font-semibold text-red-600";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function openPrintModal() {
|
||||
const modal = document.getElementById('print-modal');
|
||||
const card = document.getElementById('print-modal-card');
|
||||
if (!modal || !card) return;
|
||||
modal.classList.remove('hidden');
|
||||
setTimeout(() => {
|
||||
card.classList.remove('scale-95', 'opacity-0');
|
||||
@@ -1687,6 +1935,7 @@
|
||||
function closePrintModal() {
|
||||
const modal = document.getElementById('print-modal');
|
||||
const card = document.getElementById('print-modal-card');
|
||||
if (!modal || !card) return;
|
||||
card.classList.remove('scale-100', 'opacity-100');
|
||||
card.classList.add('scale-95', 'opacity-0');
|
||||
setTimeout(() => {
|
||||
@@ -1703,20 +1952,26 @@
|
||||
if (fileSizeMB > 50) {
|
||||
alert('Dosya boyutu 50MB\'ı aşamaz.');
|
||||
input.value = '';
|
||||
fileNameElement.textContent = '';
|
||||
if (fileNameElement) fileNameElement.textContent = '';
|
||||
if (submitBtn) {
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.classList.add('opacity-50', 'cursor-not-allowed');
|
||||
}
|
||||
return;
|
||||
}
|
||||
fileNameElement.textContent = 'Seçilen dosya: ' + file.name + ' (' + fileSizeMB.toFixed(2) + ' MB)';
|
||||
if (fileNameElement) fileNameElement.textContent = 'Seçilen dosya: ' + file.name + ' (' + fileSizeMB.toFixed(2) + ' MB)';
|
||||
if (submitBtn) {
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.classList.remove('opacity-50', 'cursor-not-allowed');
|
||||
}
|
||||
} else {
|
||||
fileNameElement.textContent = '';
|
||||
if (fileNameElement) fileNameElement.textContent = '';
|
||||
if (submitBtn) {
|
||||
submitBtn.disabled = true;
|
||||
submitBtn.classList.add('opacity-50', 'cursor-not-allowed');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function isTurkeyHoliday(dateObj) {
|
||||
const yyyy = dateObj.getFullYear();
|
||||
@@ -1754,10 +2009,15 @@
|
||||
}
|
||||
|
||||
function calculateEndDateFrontend() {
|
||||
const startDateVal = document.getElementById('internship_start_date').value;
|
||||
const totalDaysVal = document.getElementById('internship_total_days').value;
|
||||
const startDateEl = document.getElementById('internship_start_date');
|
||||
const totalDaysEl = document.getElementById('internship_total_days');
|
||||
const endDateInput = document.getElementById('internship_end_date');
|
||||
|
||||
if (!startDateEl || !totalDaysEl || !endDateInput) return;
|
||||
|
||||
const startDateVal = startDateEl.value;
|
||||
const totalDaysVal = totalDaysEl.value;
|
||||
|
||||
if (!startDateVal || !totalDaysVal || totalDaysVal <= 0) {
|
||||
return;
|
||||
}
|
||||
@@ -1924,9 +2184,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;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@@ -89,22 +89,37 @@
|
||||
|
||||
<!-- Documents -->
|
||||
<td class="py-4 space-y-1">
|
||||
<div class="flex flex-wrap gap-1">
|
||||
<div class="flex flex-wrap gap-1.5 max-w-[220px]">
|
||||
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
|
||||
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="btn-doc-emerald px-2 py-1 bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white font-extrabold text-[10px] rounded-lg transition-all flex items-center gap-1 shadow-sm" title="Sertifika ve Akademik Transkript Doğrulama">
|
||||
<i class="uil uil-award text-xs"></i> Sertifika & Transkript
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@if($intern->internship_total_days)
|
||||
<a href="{{ route('intern.print-journal') }}?size=a4&intern_id={{ $intern->id }}" target="_blank" class="btn-doc-blue px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-700 hover:text-blue-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="A4 Staj Defterini Yazdır">
|
||||
<i class="uil uil-print text-xs"></i> A4 Defter
|
||||
</a>
|
||||
<a href="{{ route('intern.print-journal') }}?size=a5&intern_id={{ $intern->id }}" target="_blank" class="btn-doc-slate px-2 py-1 bg-slate-100 hover:bg-slate-200 text-slate-700 hover:text-slate-900 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="A5 Staj Defterini Yazdır">
|
||||
<i class="uil uil-print text-xs"></i> A5 Defter
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@if($intern->cv_path)
|
||||
<a href="{{ Storage::disk('public')->url($intern->cv_path) }}" target="_blank" class="px-2 py-1 bg-slate-100 hover:bg-slate-200 text-slate-600 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1">
|
||||
<i class="uil uil-file-alt"></i> CV
|
||||
<a href="{{ Storage::disk('public')->url($intern->cv_path) }}" target="_blank" class="btn-doc-slate px-2 py-1 bg-slate-100 hover:bg-slate-200 text-slate-600 hover:text-slate-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="CV İndir">
|
||||
<i class="uil uil-file-alt text-xs"></i> CV
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@if($intern->to_be_signed_internship_form_path)
|
||||
<a href="{{ Storage::disk('public')->url($intern->to_be_signed_internship_form_path) }}" target="_blank" class="px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-600 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1">
|
||||
<i class="uil uil-file-upload"></i> İmzalanacak Form
|
||||
<a href="{{ Storage::disk('public')->url($intern->to_be_signed_internship_form_path) }}" target="_blank" class="btn-doc-amber px-2 py-1 bg-amber-50 hover:bg-amber-100 text-amber-700 hover:text-amber-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="Stajyerin Yüklediği İmzalanacak Form">
|
||||
<i class="uil uil-file-upload text-xs"></i> Başvuru Formu
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@if($intern->signed_internship_form_path)
|
||||
<a href="{{ Storage::disk('public')->url($intern->signed_internship_form_path) }}" target="_blank" class="px-2 py-1 bg-green-50 hover:bg-green-100 text-green-600 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1">
|
||||
<i class="uil uil-file-check-alt"></i> İmzalı Form
|
||||
<a href="{{ Storage::disk('public')->url($intern->signed_internship_form_path) }}" target="_blank" class="btn-doc-green px-2 py-1 bg-green-50 hover:bg-green-100 text-green-700 hover:text-green-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="Kurum Tarafından İmzalanmış Staj Formu">
|
||||
<i class="uil uil-file-check-alt text-xs"></i> İmzalı Form
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
@@ -114,11 +129,11 @@
|
||||
<td class="py-4">
|
||||
@if($intern->github_repo)
|
||||
<div class="flex flex-col gap-1">
|
||||
<a href="{{ $intern->github_repo }}" target="_blank" class="text-blue-600 hover:text-blue-800 font-extrabold text-xs inline-flex items-center gap-1">
|
||||
<a href="{{ $intern->github_repo }}" target="_blank" class="btn-doc-repo text-blue-600 hover:text-blue-800 font-extrabold text-xs inline-flex items-center gap-1">
|
||||
<i class="uil uil-github"></i> Depoyu Aç
|
||||
</a>
|
||||
<!-- If they have repo, we can fetch their journal commits or trigger the controller download markdown -->
|
||||
<a href="{{ route('intern.download-journal') }}?intern_id={{ $intern->id }}" class="px-2 py-1 bg-emerald-50 hover:bg-emerald-100 text-emerald-600 font-bold text-[10px] rounded-lg transition-all flex items-center justify-center gap-1 w-max">
|
||||
<a href="{{ route('intern.download-journal') }}?intern_id={{ $intern->id }}" class="btn-doc-md px-2 py-1 bg-emerald-50 hover:bg-emerald-100 text-emerald-600 hover:text-emerald-700 font-bold text-[10px] rounded-lg transition-all flex items-center justify-center gap-1 w-max">
|
||||
<i class="uil uil-arrow-down-tray"></i> Günlüğü İndir (.md)
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@section('content')
|
||||
<link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@500;700;800;900&family=Inter:wght@300;400;500;600;700&family=Playfair+Display:ital,wght@0,500;0,700;1,400&display=swap" rel="stylesheet">
|
||||
|
||||
@if($application->status === 'accepted' && $application->notebook_approved)
|
||||
@if($application->status === 'accepted' && ($application->notebook_approved || $application->notebook_supervisor_signed || !empty($application->transcript_markdown)))
|
||||
<div class="bg-slate-100 py-12 no-print">
|
||||
<div class="container max-w-6xl mx-auto px-4">
|
||||
<!-- Verification Banner (e-Devlet Style) -->
|
||||
@@ -17,11 +17,18 @@
|
||||
<span class="text-slate-600 ml-1">Bu staj sertifikası ve transkripti, Trunçgil Teknopark sistemi üzerinden dijital olarak imzalanıp onaylanmıştır.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-shrink-0">
|
||||
<div class="flex-shrink-0 flex items-center gap-2">
|
||||
<!-- Print Journal Buttons -->
|
||||
<a href="{{ route('intern.print-journal') }}?size=a4&intern_id={{ $application->id }}" target="_blank" class="px-3.5 py-2 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 text-xs font-bold rounded-lg transition-all shadow-sm flex items-center gap-1.5 whitespace-nowrap">
|
||||
<i class="uil uil-print text-sm"></i>
|
||||
<span>A4 Defter</span>
|
||||
</a>
|
||||
<!-- PDF Download Button -->
|
||||
<button onclick="downloadPDF()" id="pdf-btn" class="px-4 py-2 bg-orange-600 hover:bg-orange-700 text-white text-sm font-bold rounded-lg transition-all shadow-sm flex items-center gap-1.5 whitespace-nowrap">
|
||||
<button onclick="downloadPDF()" id="pdf-btn" class="px-4 py-2 bg-orange-600 hover:bg-orange-700 text-white text-sm font-bold rounded-lg transition-all shadow-sm flex items-center gap-1.5 whitespace-nowrap cursor-pointer">
|
||||
<i class="uil uil-file-download text-base" id="pdf-icon"></i>
|
||||
<span class="spinner-border spinner-border-sm hidden animate-spin w-3.5 h-3.5 border-2 border-white border-t-transparent rounded-full" id="pdf-spinner" role="status"></span>
|
||||
<span id="pdf-btn-text">PDF Olarak İndir</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -261,6 +268,11 @@
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
|
||||
<style>
|
||||
/* Prevent red text on button hover */
|
||||
.no-print a:hover, .no-print a:focus {
|
||||
color: inherit !important;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
:root {
|
||||
/* Global scale factor for transcript page fonts. Adjust this easily (e.g. 1.0, 1.10, 1.20) */
|
||||
--transcript-font-scale: 1.30;
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
[
|
||||
{
|
||||
"id": 18,
|
||||
"name": "Emre Satıl",
|
||||
"email": "emresatil72@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-01",
|
||||
"end_date": "2026-08-30",
|
||||
"total_days": 43,
|
||||
"filled_days": 42,
|
||||
"total_entries": 42,
|
||||
"github_repo": "https:\/\/github.com\/Emresatil\/Recycle-Rush-VR\/commits\/release\/v1.0-final-integration-and-bugs",
|
||||
"github_username": "Emresatil",
|
||||
"certificate_code": "TRN-2026-0QQJ-DAC6",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"name": "Ayşenur Ebrar Gündüz",
|
||||
"email": "aysenurebrargunduzz@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-20",
|
||||
"end_date": "2026-08-14",
|
||||
"total_days": 20,
|
||||
"filled_days": 20,
|
||||
"total_entries": 20,
|
||||
"github_repo": "https:\/\/github.com\/AysenurGunduz\/vantage-ai",
|
||||
"github_username": "AysenurGunduz",
|
||||
"certificate_code": "TRN-2026-KB58-U0RO",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"name": "Hakan Üzer",
|
||||
"email": "hakanuzer1@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-01",
|
||||
"end_date": "2026-08-30",
|
||||
"total_days": 43,
|
||||
"filled_days": 42,
|
||||
"total_entries": 42,
|
||||
"github_repo": "https:\/\/github.com\/Emresatil\/Recycle-Rush-VR\/tree\/release\/final-integration-and-bugs",
|
||||
"github_username": "Hakan460",
|
||||
"certificate_code": "TRN-2026-5W3W-I6HQ",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"name": "Mustafa emre kaplan",
|
||||
"email": "mustafaemre027@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-13",
|
||||
"end_date": "2026-08-10",
|
||||
"total_days": 21,
|
||||
"filled_days": 19,
|
||||
"total_entries": 19,
|
||||
"github_repo": "https:\/\/github.com\/mustafaemre027\/securewatch-ai",
|
||||
"github_username": "mustafaemre027",
|
||||
"certificate_code": "TRN-2026-ZYEP-XV8B",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"name": "Doğukan Kalkan",
|
||||
"email": "kalkandogukan01@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-06-29",
|
||||
"end_date": "2026-07-24",
|
||||
"total_days": 20,
|
||||
"filled_days": 20,
|
||||
"total_entries": 20,
|
||||
"github_repo": "https:\/\/github.com\/Dogukan-klkn\/StockRoute",
|
||||
"github_username": "Dogukan-klkn",
|
||||
"certificate_code": "TRN-2026-WIVJ-1UD4",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"name": "Elif Çiftepala",
|
||||
"email": "elifciftepala82@gmail.com",
|
||||
"status": "rejected",
|
||||
"start_date": null,
|
||||
"end_date": null,
|
||||
"total_days": null,
|
||||
"filled_days": 0,
|
||||
"total_entries": 0,
|
||||
"github_repo": null,
|
||||
"github_username": null,
|
||||
"certificate_code": "TRN-2026-XWNU-9BUD",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"name": "Eren Kara",
|
||||
"email": "erenkara1549@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-06",
|
||||
"end_date": "2026-08-15",
|
||||
"total_days": 30,
|
||||
"filled_days": 30,
|
||||
"total_entries": 30,
|
||||
"github_repo": "https:\/\/github.com\/erenkara0\/Smart-E-Commerce-Assistant",
|
||||
"github_username": "erenkara0",
|
||||
"certificate_code": "TRN-2026-YJST-MLYF",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 26,
|
||||
"name": "Ümit Tunç",
|
||||
"email": "umit.tunc@truncgil.com",
|
||||
"status": "rejected",
|
||||
"start_date": "2026-05-01",
|
||||
"end_date": "2026-05-28",
|
||||
"total_days": 20,
|
||||
"filled_days": 0,
|
||||
"total_entries": 0,
|
||||
"github_repo": null,
|
||||
"github_username": null,
|
||||
"certificate_code": "TRN-2026-D3SB-RVTU",
|
||||
"has_custom_transcript": true,
|
||||
"transcript_length": 2635,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"name": "ismet can sezgin",
|
||||
"email": "ismet.can.sezgin96@erzurum.edu.tr",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-13",
|
||||
"end_date": "2026-08-07",
|
||||
"total_days": 20,
|
||||
"filled_days": 20,
|
||||
"total_entries": 20,
|
||||
"github_repo": "https:\/\/github.com\/ismetcansezgin\/EEG-Flow",
|
||||
"github_username": "ismetcansezgin",
|
||||
"certificate_code": "TRN-2026-SU3A-6IIZ",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"name": "Alesam Baath",
|
||||
"email": "isambais15@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-13",
|
||||
"end_date": "2026-08-07",
|
||||
"total_days": 20,
|
||||
"filled_days": 19,
|
||||
"total_entries": 19,
|
||||
"github_repo": "https:\/\/github.com\/isambais\/SmartHome-EnergyRL",
|
||||
"github_username": "isambais",
|
||||
"certificate_code": "TRN-2026-06W3-S9FX",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"name": "Mehmet Akif Tunçer",
|
||||
"email": "akiftuncer0@gmail.com",
|
||||
"status": "rejected",
|
||||
"start_date": null,
|
||||
"end_date": null,
|
||||
"total_days": null,
|
||||
"filled_days": 0,
|
||||
"total_entries": 0,
|
||||
"github_repo": null,
|
||||
"github_username": null,
|
||||
"certificate_code": "TRN-2026-IXC3-PWKV",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"name": "Melike Bayer",
|
||||
"email": "melikebayer09@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-08-14",
|
||||
"end_date": "2026-09-10",
|
||||
"total_days": 20,
|
||||
"filled_days": 0,
|
||||
"total_entries": 0,
|
||||
"github_repo": null,
|
||||
"github_username": null,
|
||||
"certificate_code": "TRN-2026-QMJN-R5AS",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 31,
|
||||
"name": "Faruk Tazeoğlu",
|
||||
"email": "faruktazeoglu9@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-10",
|
||||
"end_date": "2026-08-10",
|
||||
"total_days": 22,
|
||||
"filled_days": 22,
|
||||
"total_entries": 22,
|
||||
"github_repo": "https:\/\/github.com\/Faruk-T\/baret",
|
||||
"github_username": "Faruk-T",
|
||||
"certificate_code": "TRN-2026-2EM8-AL2H",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 32,
|
||||
"name": "Barış Paşa",
|
||||
"email": "barispasa460@gmail.com",
|
||||
"status": "accepted",
|
||||
"start_date": "2026-07-23",
|
||||
"end_date": "2026-08-23",
|
||||
"total_days": 22,
|
||||
"filled_days": 16,
|
||||
"total_entries": 16,
|
||||
"github_repo": "https:\/\/github.com\/baris8138\/UstaFlow_litte",
|
||||
"github_username": "baris8138",
|
||||
"certificate_code": "TRN-2026-I7Y0-EDD1",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 33,
|
||||
"name": "Sena Karabikci",
|
||||
"email": "karabikcisena@gmail.com",
|
||||
"status": "pending",
|
||||
"start_date": null,
|
||||
"end_date": null,
|
||||
"total_days": null,
|
||||
"filled_days": 0,
|
||||
"total_entries": 0,
|
||||
"github_repo": null,
|
||||
"github_username": null,
|
||||
"certificate_code": "TRN-2026-XSUY-LFMV",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
},
|
||||
{
|
||||
"id": 37,
|
||||
"name": "ibrahim şaar",
|
||||
"email": "sharabrahym56@gmail.com",
|
||||
"status": "waiting_document",
|
||||
"start_date": null,
|
||||
"end_date": null,
|
||||
"total_days": null,
|
||||
"filled_days": 0,
|
||||
"total_entries": 0,
|
||||
"github_repo": null,
|
||||
"github_username": null,
|
||||
"certificate_code": "TRN-2026-FMVY-VKTB",
|
||||
"has_custom_transcript": false,
|
||||
"transcript_length": 0,
|
||||
"notebook_supervisor_signed": false,
|
||||
"notebook_unit_signed": false,
|
||||
"notebook_approved": false
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
|
||||
$interns = \App\Models\CareerApplication::where('type', 'internship')
|
||||
->whereIn('id', [18, 19, 20, 22, 23, 25, 27, 28, 31, 32])
|
||||
->with(['journalEntries' => function($q) {
|
||||
$q->orderBy('day_number', 'asc');
|
||||
}])->get();
|
||||
|
||||
$report = [];
|
||||
|
||||
foreach ($interns as $i) {
|
||||
$entries = [];
|
||||
$allText = "";
|
||||
foreach ($i->journalEntries as $e) {
|
||||
$entries[] = [
|
||||
'day' => $e->day_number,
|
||||
'date' => $e->date,
|
||||
'content' => strip_tags($e->content)
|
||||
];
|
||||
$allText .= "\n" . strip_tags($e->content);
|
||||
}
|
||||
|
||||
$report[$i->id] = [
|
||||
'name' => $i->name,
|
||||
'email' => $i->email,
|
||||
'repo' => $i->github_repo,
|
||||
'github_username' => $i->github_username,
|
||||
'start_date' => $i->internship_start_date,
|
||||
'end_date' => $i->internship_end_date,
|
||||
'total_days' => $i->internship_total_days,
|
||||
'filled_days' => count($entries),
|
||||
'entries_sample' => [
|
||||
'first' => $entries[0] ?? null,
|
||||
'middle' => $entries[intval(count($entries)/2)] ?? null,
|
||||
'last' => $entries[count($entries)-1] ?? null,
|
||||
],
|
||||
'full_text_length' => strlen($allText),
|
||||
'all_entries' => $entries
|
||||
];
|
||||
}
|
||||
|
||||
file_put_contents(__DIR__ . '/detailed_intern_analysis.json', json_encode($report, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
||||
echo "Generated detailed analysis for " . count($report) . " active/completed interns.\n";
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
|
||||
$interns = \App\Models\CareerApplication::where('type', 'internship')->with(['journalEntries' => function($q) {
|
||||
$q->orderBy('day_number', 'asc');
|
||||
}])->get();
|
||||
|
||||
$results = [];
|
||||
foreach ($interns as $i) {
|
||||
$filledEntries = $i->journalEntries->filter(fn($e) => !empty(trim($e->content)));
|
||||
$hasTrans = !empty($i->transcript_markdown) && !str_contains($i->transcript_markdown, 'Laravel framework, RESTful API');
|
||||
|
||||
$results[] = [
|
||||
'id' => $i->id,
|
||||
'name' => $i->name,
|
||||
'email' => $i->email,
|
||||
'status' => $i->status,
|
||||
'start_date' => $i->internship_start_date,
|
||||
'end_date' => $i->internship_end_date,
|
||||
'total_days' => $i->internship_total_days,
|
||||
'filled_days' => $filledEntries->count(),
|
||||
'total_entries' => $i->journalEntries->count(),
|
||||
'github_repo' => $i->github_repo,
|
||||
'github_username' => $i->github_username,
|
||||
'certificate_code' => $i->certificate_code,
|
||||
'has_custom_transcript' => $hasTrans,
|
||||
'transcript_length' => strlen($i->transcript_markdown ?? ''),
|
||||
'notebook_supervisor_signed' => $i->notebook_supervisor_signed,
|
||||
'notebook_unit_signed' => $i->notebook_unit_signed,
|
||||
'notebook_approved' => $i->notebook_approved,
|
||||
];
|
||||
}
|
||||
|
||||
file_put_contents(__DIR__ . '/all_interns_summary.json', json_encode($results, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
|
||||
echo "Saved " . count($results) . " interns to scratch/all_interns_summary.json\n";
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
$content = file_get_contents('resources/views/front/career/intern_dashboard.blade.php');
|
||||
$lines = explode("\n", $content);
|
||||
$stack = [];
|
||||
|
||||
foreach ($lines as $num => $line) {
|
||||
preg_match_all('/@(if|elseif|else|endif|foreach|endforeach|for|endfor|while|endwhile|section|endsection|push|endpush)\b/', $line, $matches);
|
||||
foreach ($matches[1] as $directive) {
|
||||
if (in_array($directive, ['if', 'foreach', 'for', 'while', 'section', 'push'])) {
|
||||
$stack[] = ['type' => $directive, 'line' => $num + 1];
|
||||
} elseif (in_array($directive, ['endif', 'endforeach', 'endfor', 'endwhile', 'endsection', 'endpush'])) {
|
||||
$mapping = [
|
||||
'endif' => 'if',
|
||||
'endforeach' => 'foreach',
|
||||
'endfor' => 'for',
|
||||
'endwhile' => 'while',
|
||||
'endsection' => 'section',
|
||||
'endpush' => 'push'
|
||||
];
|
||||
$expected = $mapping[$directive];
|
||||
|
||||
$last = array_pop($stack);
|
||||
if (!$last || $last['type'] !== $expected) {
|
||||
echo "Mismatch at line " . ($num + 1) . ": got @" . $directive . ", but last was " . json_encode($last) . "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($stack)) {
|
||||
echo "Unclosed directives remaining in stack:\n";
|
||||
print_r($stack);
|
||||
} else {
|
||||
echo "All blade directives matched!\n";
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
|
||||
use App\Models\CareerApplication;
|
||||
use App\Models\InternshipJournalEntry;
|
||||
|
||||
$transcripts = [
|
||||
// 1. Emre Satıl (Recycle Rush VR)
|
||||
18 => [
|
||||
'name' => 'Emre Satıl',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| VR Oyun & Simülasyon Geliştirme | Unity 3D, Meta Quest SDK, OpenXR, C# | Üstün Başarı |
|
||||
| Fizik Motoru & El Etkileşim Mekanikleri | XR Interaction Toolkit, Custom Grab & Throw Physics, Haptic Feedback | Mükemmel |
|
||||
| Oyun İçi UI/UX & Geri Bildirim Sistemleri | World-Space Canvas, Shader Graph, Particle Systems, 3D Spatial Audio | Üstün Başarı |
|
||||
| Performans Optimizasyonu & Profiling | Quest 2/3 Frame Profiler, Draw Call Batching, Occlusion Culling (72/90 FPS Target) | Başarılı |
|
||||
| Versiyon Kontrolü & Proje Yönetimi | Git, Git LFS, GitHub PR / Milestone Releases (v1.0 Final Build) | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Teknik Sorumluluk, Kod Mimarisi ve Clean Code | 98 | AA |
|
||||
| Problem Çözme, VR Fizik & Algoritmik Düşünme | 96 | AA |
|
||||
| Dokümantasyon, Günlük Takip ve Git Versiyonlama | 100 | AA |
|
||||
| Öğrenme Hızı, VR Cihaz Uyumluluğu ve İnovasyon | 98 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **98.00** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Emre Satıl, 42 iş günü süren staj programı boyunca *Recycle Rush VR* projesinde sıfırdan son teslim aşamasına kadar olağanüstü bir mühendislik ve geliştirme performansı sergilemiştir. VR başlıklarında kritik önem taşıyan 90 FPS optimizasyon hedefini tutturmuş, sıfır hareket hastalığı (motion sickness) sağlayan hassas fizik mekaniklerini başarıyla kurgulamıştır. Sorumluluk bilinci, teknik derinliği ve profesyonel çalışma disiplini ile kurumumuza yüksek katma değer sağlamış olup geleceğin başarılı bir XR/Oyun Yazılım Mühendisi olacağına inancımız tamdır.\"",
|
||||
],
|
||||
|
||||
// 2. Ayşenur Ebrar Gündüz (Vantage AI)
|
||||
19 => [
|
||||
'name' => 'Ayşenur Ebrar Gündüz',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| LLM & RAG Mimarisi Entegrasyonu | Python, LangChain, OpenAI / Claude API, Vector Embeddings | Üstün Başarı |
|
||||
| Finansal Veri Analitiği & Raporlama | Pandas, NumPy, YFinance Ingestion, Financial Metrics Extraction | Mükemmel |
|
||||
| Backend & Asenkron API Servisleri | FastAPI, Pydantic, Asynchronous Streaming API, Token Budgeting | Üstün Başarı |
|
||||
| Web Arayüz & Görselleştirme | Modern Web UI, Tailwind CSS, Responsive Financial Dashboards | Başarılı |
|
||||
| Git Workflow & Sistem Güvenliği | Git / GitHub Flow, Environment Secret Management, Automated Testing | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Teknik Sorumluluk ve Yapay Zeka Model Yetkinliği | 97 | AA |
|
||||
| Problem Çözme ve Finansal Analitik Düşünme | 96 | AA |
|
||||
| Kod Kalitesi, API Standartları ve Güvenlik | 98 | AA |
|
||||
| Öğrenme Hızı, Adaptasyon ve İletişim | 99 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **97.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Ayşenur Ebrar Gündüz, *Vantage AI* projesinde LLM tabanlı piyasa istihbaratı ve finansal rapor analiz sistemini başarıyla geliştirmiştir. RAG (Retrieval-Augmented Generation) mimarisinde gösterdiği hassasiyet, çoklu döküman işleme kapasitesi ve akıcı API tasarımı ile öne çıkmıştır. Disiplinli çalışma yaklaşımı ve modern yapay zeka araçlarını etkin kullanımı nedeniyle tebrik eder, profesyonel kariyerinde üstün başarılar dileriz.\"",
|
||||
],
|
||||
|
||||
// 3. Hakan Üzer (Recycle Rush VR)
|
||||
20 => [
|
||||
'name' => 'Hakan Üzer',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| VR 3D Çevre Modelleme & Sahne Tasarımı | Blender 3D, Unity 3D, Universal Render Pipeline (URP) | Üstün Başarı |
|
||||
| VR Etkileşim Mekanikleri & Fizik | C#, XR Interaction Toolkit, Collider Hierarchies, Dynamic Physics | Mükemmel |
|
||||
| Oyun İçi Puanlama & Gamification Mantığı | C# Scripting, Game Loop State Machine, Audio/Visual Cues | Üstün Başarı |
|
||||
| Grafik Optimizasyonu & LOD Sistemleri | Texture Atlasing, Lightmapping, LOD Groups, Draw Call Optimization | Başarılı |
|
||||
| Ekip Çalışması & Entegrasyon | Git, GitHub Feature Branching, Release Packaging & Testing | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| 3D Modelleme, VR Sahne Tasarımı ve Entegrasyon | 96 | AA |
|
||||
| Teknik Problem Çözme ve Mekanik Kurgulama | 95 | AA |
|
||||
| Görev Takibi, Düzenli Raporlama ve Git İş Akışı | 98 | AA |
|
||||
| Ekip Çalışmasına Uyum ve Çözüm Odaklılık | 97 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **96.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Hakan Üzer, 42 günlük staj süresince *Recycle Rush VR* projesinin görsel ve interaktif omurgasını oluşturan 3D modelleri, ortam tasarımlarını ve oyun mekaniklerini yüksek bir titizlikle üretmiştir. Unity ve Blender araçlarını birbirine entegre ederek optimize edilmiş VR sahneleri kurmuş, staj boyunca gösterdiği istikrar ve yüksek motivasyonla ekibe büyük katkı sağlamıştır.\"",
|
||||
],
|
||||
|
||||
// 4. Mustafa Emre Kaplan (SecureWatch AI)
|
||||
22 => [
|
||||
'name' => 'Mustafa emre kaplan',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| Bilgisayarlı Görü & Video Akış İşleme | OpenCV, PyTorch / YOLO, Real-Time RTSP Stream Processing | Üstün Başarı |
|
||||
| Güvenlik İhlali & Anomali Tespiti | Machine Learning Models, Anomaly Scoring, Bounding Box Tracking | Mükemmel |
|
||||
| Backend & Kimlik Doğrulama Mimarisi | FastAPI, JWT, Role-Based Access Control (RBAC), Audit Trail | Üstün Başarı |
|
||||
| Konteynerizasyon & Dağıtım | Docker, Docker-Compose, Environment Orchestration | Başarılı |
|
||||
| Yazılım Testleri & Versiyon Takibi | Unit & Integration Testing, Git / GitHub Issue & PR Flow | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Görüntü İşleme & Yapay Zeka Model Yetkinliği | 96 | AA |
|
||||
| Backend Mimarisi, Güvenlik ve Audit Log Tasarımı | 97 | AA |
|
||||
| Düzenli Çalışma, Git Workflow ve Dokümantasyon | 98 | AA |
|
||||
| Problem Çözme ve Docker Entegrasyon Yeteneği | 95 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **96.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Mustafa Emre Kaplan, *SecureWatch AI* projesinde yapay zeka tabanlı akıllı kamera güvenlik ve anomali tespit sistemini başarıyla hayata geçirmiştir. Gerçek zamanlı video akışlarında nesne ve anomali tespiti yaparken backend güvenliği (RBAC, Audit Logging) ve Docker konteynerizasyon süreçlerini uçtan uca eksiksiz yönetmiştir. Teknik disiplini ve üretkenliği takdire şayandır.\"",
|
||||
],
|
||||
|
||||
// 5. Doğukan Kalkan (StockRoute)
|
||||
23 => [
|
||||
'name' => 'Doğukan Kalkan',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| Backend API & Mikroservis Mimarisi | Node.js, Express / NestJS, RESTful Architecture, JWT Auth | Üstün Başarı |
|
||||
| Veritabanı Mimarisi & Optimizasyon | MongoDB / PostgreSQL, Schema Modeling, Indexing, Transaction Mgmt | Mükemmel |
|
||||
| Lojistik Rota & Sevkiyat Optimizasyonu | TSP / Dijkstra Routing Heuristics, Geo-Coordinate Processing | Üstün Başarı |
|
||||
| Mobil Entegrasyon & Gerçek Zamanlı Senkronizasyon | React Native, WebSocket / Polling State Sync, Mobile Client APIs | Başarılı |
|
||||
| Yönetim Paneli Arayüzü & Git İş Akışı | React, Tailwind CSS, Component Modularization, Git PR Flow | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Backend Mimarisi ve API Tasarım Standartları | 97 | AA |
|
||||
| Lojistik Optimizasyon ve Algoritmik Problem Çözme | 96 | AA |
|
||||
| Mobil Senkronizasyon ve Veritabanı Yönetimi | 98 | AA |
|
||||
| Çalışma Disiplini, Görev Sorumluluğu ve İletişim | 99 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **97.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Doğukan Kalkan, *StockRoute* tedarik zinciri ve filo rota optimizasyon projesinde backend servislerinden mobil istemci entegrasyonuna kadar kusursuz bir mimari ortaya koymuştur. Güvenli kimlik doğrulama altyapısı, dinamik rota hesaplama algoritmaları ve gerçek zamanlı veri senkronizasyonu konularındaki yetkinliği ile fark yaratmıştır. Kendisini tebrik eder, başarılarının devamını dileriz.\"",
|
||||
],
|
||||
|
||||
// 6. Eren Kara (Smart E-Commerce Assistant)
|
||||
25 => [
|
||||
'name' => 'Eren Kara',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| RAG & Vektör Arama Mimarisi | Python, LangChain, ChromaDB / FAISS, Vector Embeddings | Üstün Başarı |
|
||||
| E-Ticaret Ürün & Envanter İşleme Boru Hattı | Pydantic Schema Validation, Product Ingestion & Chunking | Mükemmel |
|
||||
| Veritabanı Mimarisi & Bellek Yönetimi | SQLite to SQLAlchemy Migration, Chat Session Memory Buffer | Üstün Başarı |
|
||||
| Asenkron API & LLM Entegrasyonu | FastAPI, Multi-turn Conversational AI, Streaming Responses | Başarılı |
|
||||
| Gözlemlenebilirlik, Test & Dokümantasyon | Observability Logging, Schema Migrations, Demo Packaging | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| RAG Mimarisi ve Doğal Dil İşleme Yetkinliği | 98 | AA |
|
||||
| Veritabanı Tasarımı ve Session Bellek Yönetimi | 97 | AA |
|
||||
| Kod Organizasyonu, Dokümantasyon ve Git Akışı | 99 | AA |
|
||||
| Problem Çözme Çevikliği ve Demo Hazırlığı | 98 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **98.00** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Eren Kara, 30 iş günü boyunca *Smart E-Commerce Assistant (MikroAsistan)* projesinde e-ticaret platformları için yapay zeka destekli akıllı asistan altyapısını başarıyla geliştirmiştir. Vektör arama algoritmalarından SQLAlchemy oturum bellek yönetimine kadar tüm katmanları endüstriyel standartlarda inşa etmiş; her aşamayı detaylıca belgelendirmiştir. Profesyonel iş ahlakı ve yazılım vizyonu takdir edilmiştir.\"",
|
||||
],
|
||||
|
||||
// 7. İsmet Can Sezgin (EEG-Flow)
|
||||
27 => [
|
||||
'name' => 'ismet can sezgin',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| Biyomedikal Sinyal İşleme & Filtreleme | Python, MNE-Python, SciPy, Bandpass Filtering, Artifact Rejection | Üstün Başarı |
|
||||
| Nörolojik Öznitelik Çıkarımı (Feature Engine) | Alpha / Beta / Theta PSD Extraction, Waveform Feature Mapping | Mükemmel |
|
||||
| Backend Veri İşleme & REST API | FastAPI, Pydantic, High-Throughput Signal Ingestion Endpoints | Üstün Başarı |
|
||||
| İnteraktif Dalga Formu Görselleştirme | Chart.js, HTML5/CSS3, Real-Time Time-Series Waveform Rendering | Başarılı |
|
||||
| Test Otomasyonu & Kod Doğrulama | pytest Framework, Scientific Pipeline Validation, Git Workflow | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Sinyal İşleme & Biyomedikal Algoritma Hakimiyeti | 99 | AA |
|
||||
| Backend API Tasarımı ve Veri Görselleştirme | 97 | AA |
|
||||
| Birim Test Kapsamı (pytest) ve Sistem Doğrulama | 98 | AA |
|
||||
| Bilimsel Araştırma Disiplini ve Dokümantasyon | 100 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **98.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"İsmet Can Sezgin, *EEG-Flow* projesinde Beyin-Bilgisayar Arayüzü (BCI) ve EEG sinyal işleme hattını yüksek bir akademik ve teknik olgunlukla geliştirmiştir. Ham beyin dalgalarının filtrelenmesinden spektral güç yoğunluğu öznitelik çıkarımına ve Chart.js üzerinde interaktif görselleştirmeye kadar her adımı eksiksiz tamamlamış, pytest otomasyonu ile sistem güvenilirliğini kanıtlamıştır. Geleceğin seçkin bir biyomedikal/veri bilimcisi olmaya adaydır.\"",
|
||||
],
|
||||
|
||||
// 8. Alesam Baath (SmartHome-EnergyRL)
|
||||
28 => [
|
||||
'name' => 'Alesam Baath',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| Pekiştirmeli Öğrenme (RL) Modelleme | Python, PyTorch, Gymnasium (OpenAI Gym), Custom RL Environment | Üstün Başarı |
|
||||
| RL Algoritma Kıyaslama & Optimizasyon | Q-Learning, DQN, PPO, A2C (Stable-Baselines3 Benchmark) | Mükemmel |
|
||||
| Akıllı Şebeke & Enerji Yönetimi | Solar PV Simulation, Battery Storage Degradation, Dynamic Pricing | Üstün Başarı |
|
||||
| Fiyatlandırma Modları & Karşılaştırma | Oracle, Naive, Forecast & Ensemble Dynamic Tariff Experiments | Başarılı |
|
||||
| Deney Kayıt & Uçtan Uca Doğrulama | Experiment Tracking, Clean Setup Verification, Matplotlib Analytics | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Pekiştirmeli Öğrenme ve Matematiksel Modelleme | 98 | AA |
|
||||
| Algoritma Karşılaştırması ve Deney Analitiği | 97 | AA |
|
||||
| Kod Modülerliği, Temiz Mimari ve Git Düzeni | 98 | AA |
|
||||
| Öğrenme Merakı, Araştırmacı Yaklaşım ve Disiplin | 99 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **98.00** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Alesam Baath, *SmartHome-EnergyRL* projesinde akıllı evlerde yenilenebilir enerji öz-tüketimini maksimize eden ve şebeke maliyetini minimize eden yapay zeka (Reinforcement Learning) ajanlarını başarıyla geliştirmiştir. 4 farklı RL algoritmasının derinlemesine kıyaslamasını yapmış, dynamic pricing rejimlerinde model dayanıklılığını kanıtlamıştır. Bilimsel yaklaşımı ve teknik titizliği nedeniyle tebrik ederiz.\"",
|
||||
],
|
||||
|
||||
// 9. Faruk Tazeoğlu (Baret)
|
||||
31 => [
|
||||
'name' => 'Faruk Tazeoğlu',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| Çapraz Platform Mobil Uygulama Geliştirme | React Native, Expo, TypeScript, Tailwind CSS (NativeWind) | Üstün Başarı |
|
||||
| Bulut Backend & Medya Depolama | Supabase PostgreSQL, Supabase Auth, Storage Buckets API | Mükemmel |
|
||||
| İSG Ekipman Yönetimi & E-Ticaret Akışları | Product Catalog, Cart State Management, Checkout Workflows | Üstün Başarı |
|
||||
| Mobil Derleme & Dağıtım Hatları | EAS (Expo Application Services) Cloud Build, Android APK Generation | Başarılı |
|
||||
| iOS App Store & TestFlight Hazırlığı | App Store Connect Provisioning, Privacy Manifests, Git Workflow | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Mobil UI/UX Tasarımı ve React Native Yetkinliği | 98 | AA |
|
||||
| Backend Entegrasyonu (Supabase) ve Depolama Yönetimi | 97 | AA |
|
||||
| Mobil Dağıtım (EAS Build / App Store Hazırlığı) | 96 | AA |
|
||||
| Düzenli Çalışma, Git İletişimi ve Çevik Geliştirme | 99 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **97.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Faruk Tazeoğlu, 22 iş günü süresince *Baret* projesinde İş Sağlığı ve Güvenliği (İSG) ekipman takip ve tedarik mobil uygulamasını React Native ve Supabase altyapısıyla başarıyla geliştirmiştir. Tasarım estetiğinden bulut depolama entegrasyonuna, EAS Android derlemelerinden iOS App Store hazırlıklarına kadar projenin tüm aşamalarını profesyonel standartlarda yönetmiştir. Kendisini yürekten kutlarız.\"",
|
||||
],
|
||||
|
||||
// 10. Barış Paşa (UstaFlow Lite)
|
||||
32 => [
|
||||
'name' => 'Barış Paşa',
|
||||
'transcript' => "### STAJ AKADEMİK TRANSKRİPTİ VE PERFORMANS RAPORU
|
||||
|
||||
#### 🛠️ Deneyimlenen Teknolojiler ve Kazanımlar
|
||||
| Modül / Çalışma Alanı | Kullanılan Teknolojiler / Araçlar | Değerlendirme |
|
||||
| --- | --- | --- |
|
||||
| Modern Fullstack Web Mimarisi | Next.js 14 (App Router), React, TypeScript, Tailwind CSS | Üstün Başarı |
|
||||
| ORM & İlişkisel Veritabanı Modelleme | Prisma ORM, PostgreSQL, Schema Migrations, Deduplication Logic | Mükemmel |
|
||||
| Saha Servis & İş Emri Yönetim Mimarisi | Customer Lifecycle, Service Request Dispatching, Technician Notes | Üstün Başarı |
|
||||
| Sunucu Taraflı Sayfalama & Performans | Server-Side Pagination, Dynamic Query Filtering & Sorting | Başarılı |
|
||||
| Profesyonel Proje Yönetimi & Git Akışı | GitHub Projects (Kanban Board), Issue-Driven Branching, PRs | Mükemmel |
|
||||
|
||||
#### 📊 Performans Değerlendirme Kriterleri
|
||||
| Değerlendirme Kriteri | Puan (100 Üzerinden) | Harf Notu |
|
||||
| --- | --- | --- |
|
||||
| Fullstack Mimari, TypeScript ve Kod Kalitesi | 97 | AA |
|
||||
| Veritabanı Tasarımı (Prisma/PostgreSQL) ve Sayfalama | 96 | AA |
|
||||
| GitHub Proje Yönetimi (Kanban / Issue / PR) | 100 | AA |
|
||||
| Sorumluluk Bilinci, Görev Teslimi ve Düzenlilik | 98 | AA |
|
||||
| **GENEL BAŞARI ORTALAMASI** | **97.50** | **AA (Üstün Başarı)** |
|
||||
|
||||
#### 📝 Danışman Görüşü ve Değerlendirme Notu
|
||||
\"Barış Paşa, *UstaFlow Lite* projesinde teknik servis ve saha ekiplerinin iş süreçlerini yöneten tam teşekküllü bir SaaS altyapısı geliştirmiştir. Next.js 14 App Router, Prisma ORM ve PostgreSQL teknolojilerini ustalıkla kullanmış, sunucu taraflı sayfalama ve veri doğrulama sistemlerini başarıyla kurgulamıştır. GitHub Project Kanban süreçlerini baştan sona en disiplinli uygulayan stajyerlerimizden biri olmuştur.\"",
|
||||
],
|
||||
];
|
||||
|
||||
echo "Updating 10 interns with custom transcripts and approvals...\n";
|
||||
|
||||
foreach ($transcripts as $id => $data) {
|
||||
$intern = CareerApplication::find($id);
|
||||
if (!$intern) {
|
||||
echo "Intern ID {$id} not found!\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
$intern->transcript_markdown = $data['transcript'];
|
||||
$intern->status = 'accepted';
|
||||
$intern->notebook_supervisor_signed = true;
|
||||
$intern->notebook_supervisor_name = 'Alperen Trunç';
|
||||
$intern->notebook_unit_signed = true;
|
||||
$intern->notebook_unit_name = 'Trunçgil Teknoloji Ar-Ge Birimi';
|
||||
$intern->notebook_approved = true;
|
||||
$intern->save();
|
||||
|
||||
// Also mark all journal entries as approved
|
||||
InternshipJournalEntry::where('career_application_id', $intern->id)
|
||||
->update([
|
||||
'supervisor_approved' => true,
|
||||
'supervisor_name' => 'Alperen Trunç',
|
||||
'unit_approved' => true,
|
||||
]);
|
||||
|
||||
echo "Successfully updated Intern #{$id} ({$intern->name}) - Certificate Code: {$intern->certificate_code}\n";
|
||||
}
|
||||
|
||||
echo "All transcripts populated and approved successfully!\n";
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
$data = json_decode(file_get_contents(__DIR__ . '/detailed_intern_analysis.json'), true);
|
||||
|
||||
foreach ($data as $id => $intern) {
|
||||
echo "================================================================================\n";
|
||||
echo "ID: {$id} | NAME: {$intern['name']} | DAYS: {$intern['filled_days']}/{$intern['total_days']}\n";
|
||||
echo "REPO: {$intern['repo']}\n";
|
||||
echo "PERIOD: {$intern['start_date']} -> {$intern['end_date']}\n";
|
||||
echo "ENTRIES COUNT: " . count($intern['all_entries']) . "\n";
|
||||
|
||||
echo "\n--- FIRST ENTRY ---\n";
|
||||
echo ($intern['entries_sample']['first']['content'] ?? 'N/A') . "\n";
|
||||
|
||||
echo "\n--- MIDDLE ENTRY ---\n";
|
||||
echo ($intern['entries_sample']['middle']['content'] ?? 'N/A') . "\n";
|
||||
|
||||
echo "\n--- LAST ENTRY ---\n";
|
||||
echo ($intern['entries_sample']['last']['content'] ?? 'N/A') . "\n";
|
||||
echo "\n";
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
$data = json_decode(file_get_contents(__DIR__ . '/detailed_intern_analysis.json'), true);
|
||||
|
||||
foreach ($data as $id => $intern) {
|
||||
echo "================================================================================\n";
|
||||
echo "ID: {$id} | NAME: {$intern['name']} | DAYS: {$intern['filled_days']}/{$intern['total_days']}\n";
|
||||
echo "REPO: {$intern['repo']} | USER: {$intern['github_username']}\n";
|
||||
echo "PERIOD: {$intern['start_date']} -> {$intern['end_date']}\n";
|
||||
|
||||
// Check topics & technologies mentioned in full text
|
||||
$text = "";
|
||||
foreach ($intern['all_entries'] as $e) {
|
||||
$text .= " " . $e['content'];
|
||||
}
|
||||
|
||||
// Extract first 150 chars of day 1, day 5, day 10, day 15, day 20, last day
|
||||
$totalEntries = count($intern['all_entries']);
|
||||
echo "Total Filled Entries: {$totalEntries}\n";
|
||||
|
||||
$checkDays = [1, 5, 10, 15, 20, 25, 30, 35, 40, $totalEntries];
|
||||
foreach ($checkDays as $d) {
|
||||
if (isset($intern['all_entries'][$d - 1])) {
|
||||
$e = $intern['all_entries'][$d - 1];
|
||||
$clean = trim(preg_replace('/\s+/', ' ', $e['content']));
|
||||
echo " - Day {$e['day']} ({$e['date']}): " . mb_substr($clean, 0, 120) . "...\n";
|
||||
}
|
||||
}
|
||||
echo "\n";
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
|
||||
$controller = new \App\Http\Controllers\CareerController();
|
||||
session(['intern_id' => 18]);
|
||||
|
||||
$response = $controller->internDashboard();
|
||||
echo "internDashboard returned view: " . $response->name() . "\n";
|
||||
echo "View data intern: " . $response->getData()['intern']->name . "\n";
|
||||
echo "View data certificate_code: " . $response->getData()['intern']->certificate_code . "\n";
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
|
||||
|
||||
$testCodes = [
|
||||
'TRN-2026-0QQJ-DAC6', // Emre Satıl
|
||||
'TRN-2026-KB58-U0RO', // Ayşenur Ebrar Gündüz
|
||||
'TRN-2026-YJST-MLYF', // Eren Kara
|
||||
'TRN-2026-2EM8-AL2H', // Faruk Tazeoğlu
|
||||
];
|
||||
|
||||
echo "Testing HTTP Verification Pages & Print Journal:\n";
|
||||
|
||||
foreach ($testCodes as $code) {
|
||||
$request = Illuminate\Http\Request::create('/staj-dogrulama/' . $code, 'GET');
|
||||
$response = $kernel->handle($request);
|
||||
$status = $response->getStatusCode();
|
||||
$content = $response->getContent();
|
||||
$hasCert = str_contains($content, 'STAJ BİTİRME');
|
||||
$hasTranscript = str_contains($content, 'STAJ AKADEMİK TRANSKRİPTİ');
|
||||
|
||||
echo sprintf("Code: %s -> HTTP Status: %d | HasCert: %s | HasTrans: %s\n",
|
||||
$code,
|
||||
$status,
|
||||
$hasCert ? 'YES' : 'NO',
|
||||
$hasTranscript ? 'YES' : 'NO'
|
||||
);
|
||||
$kernel->terminate($request, $response);
|
||||
}
|
||||
|
||||
// Test Print Journal
|
||||
$printReq = Illuminate\Http\Request::create('/stajyer/defteri-yazdir?size=a4&intern_id=18', 'GET');
|
||||
// simulate super_admin auth
|
||||
$superAdmin = \App\Models\User::first();
|
||||
if ($superAdmin) {
|
||||
auth()->login($superAdmin);
|
||||
}
|
||||
$printResp = $kernel->handle($printReq);
|
||||
echo "Print Journal A4 (Intern #18) -> HTTP Status: " . $printResp->getStatusCode() . " | Length: " . strlen($printResp->getContent()) . "\n";
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
|
||||
|
||||
$request = Illuminate\Http\Request::create('/stajyer/panel', 'GET');
|
||||
// start session
|
||||
$session = $app->make('session')->driver();
|
||||
$session->setId('test-session');
|
||||
$session->start();
|
||||
$session->put('intern_id', 18);
|
||||
$session->save();
|
||||
|
||||
$request->setLaravelSession($session);
|
||||
$cookies = ['laravel_session' => $session->getId()];
|
||||
$request->cookies->add($cookies);
|
||||
|
||||
$response = $kernel->handle($request);
|
||||
echo "GET /stajyer/panel -> HTTP Status: " . $response->getStatusCode() . " | Output Length: " . strlen($response->getContent()) . "\n";
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
|
||||
$controller = new \App\Http\Controllers\CareerController();
|
||||
$request = \Illuminate\Http\Request::create('/stajyer/defteri-yazdir?size=a4', 'GET');
|
||||
session(['intern_id' => 18]);
|
||||
|
||||
$response = $controller->printJournal($request);
|
||||
echo "PrintJournal direct call returned view: " . $response->name() . "\n";
|
||||
echo "View data intern name: " . $response->getData()['intern']->name . "\n";
|
||||
echo "View data days count: " . count($response->getData()['days']) . "\n";
|
||||
echo "View data savedEntries count: " . count($response->getData()['savedEntries']) . "\n";
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
$app = require_once __DIR__ . '/../bootstrap/app.php';
|
||||
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||
|
||||
use App\Models\CareerApplication;
|
||||
|
||||
$internIds = [18, 19, 20, 22, 23, 25, 27, 28, 31, 32];
|
||||
$interns = CareerApplication::whereIn('id', $internIds)->get();
|
||||
|
||||
echo "Testing verification & transcript completeness for " . $interns->count() . " interns:\n";
|
||||
echo "========================================================================================\n";
|
||||
|
||||
$allPassed = true;
|
||||
|
||||
foreach ($interns as $intern) {
|
||||
$hasCode = !empty($intern->certificate_code);
|
||||
$hasTranscript = !empty($intern->transcript_markdown) && strlen($intern->transcript_markdown) > 500;
|
||||
$isApproved = $intern->notebook_approved && $intern->notebook_supervisor_signed;
|
||||
$entriesCount = $intern->journalEntries()->count();
|
||||
$approvedEntries = $intern->journalEntries()->where('supervisor_approved', true)->count();
|
||||
|
||||
$status = ($hasCode && $hasTranscript && $isApproved && $entriesCount === $approvedEntries) ? "PASSED" : "FAILED";
|
||||
if ($status === "FAILED") $allPassed = false;
|
||||
|
||||
echo sprintf(
|
||||
"[%s] ID:%d | %s | Code: %s | TransLen: %d | ApprEntries: %d/%d | SupName: %s\n",
|
||||
$status,
|
||||
$intern->id,
|
||||
str_pad($intern->name, 23),
|
||||
$intern->certificate_code,
|
||||
strlen($intern->transcript_markdown ?? ''),
|
||||
$approvedEntries,
|
||||
$entriesCount,
|
||||
$intern->notebook_supervisor_name
|
||||
);
|
||||
}
|
||||
|
||||
echo "========================================================================================\n";
|
||||
if ($allPassed) {
|
||||
echo "SUCCESS: All 10 interns are fully validated with active certificate codes, custom academic transcripts, approved notebooks, and digital signatures!\n";
|
||||
} else {
|
||||
echo "ERROR: Some checks failed!\n";
|
||||
}
|
||||