144 lines
5.7 KiB
PHP
144 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\PengajuanUkt;
|
|
use App\Models\Form;
|
|
use App\Models\RankingFile;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class MahasiswaController extends Controller
|
|
{
|
|
public function dashboard()
|
|
{
|
|
try {
|
|
$user = Auth::user();
|
|
$today = now();
|
|
|
|
// Get latest forms
|
|
$formPenurunan = Form::where('jenis_form', 'penurunan')
|
|
->orderByDesc('tahun')
|
|
->orderByDesc('semester')
|
|
->first();
|
|
|
|
$formPengangsuran = Form::where('jenis_form', 'pengangsuran')
|
|
->orderByDesc('tahun')
|
|
->orderByDesc('semester')
|
|
->first();
|
|
|
|
// Get all pengajuan for this user
|
|
$pengajuan = PengajuanUkt::with(['form', 'details' => function($query) {
|
|
$query->whereNotNull('rejection_reason');
|
|
}])
|
|
->where('mahasiswa_id', $user->id)
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
// Get latest ranking file
|
|
$rankingFile = RankingFile::whereNotNull('path')->latest()->first();
|
|
|
|
// Penurunan setup
|
|
$penurunanSubmission = null;
|
|
$submissionStatusPenurunan = null;
|
|
$canSubmitPenurunan = true;
|
|
$showAnnouncementPenurunan = false;
|
|
$tanggal_pengumuman_penurunan = null;
|
|
|
|
if ($formPenurunan) {
|
|
$tanggal_pengumuman_penurunan = $formPenurunan->tanggal_pengumuman;
|
|
$showAnnouncementPenurunan = $tanggal_pengumuman_penurunan && $today >= $tanggal_pengumuman_penurunan;
|
|
|
|
$penurunanSubmission = $pengajuan->first(function($item) use ($formPenurunan) {
|
|
return $item->form &&
|
|
$item->form->jenis_form === 'penurunan' &&
|
|
$item->form->semester === $formPenurunan->semester &&
|
|
$item->form->tahun === $formPenurunan->tahun;
|
|
});
|
|
|
|
if ($penurunanSubmission) {
|
|
$submissionStatusPenurunan = $penurunanSubmission->status_validasi;
|
|
$canSubmitPenurunan = $submissionStatusPenurunan === 'tidak valid';
|
|
}
|
|
}
|
|
|
|
// Pengangsuran setup
|
|
$pengangsuranSubmission = null;
|
|
$submissionStatusPengangsuran = null;
|
|
$canSubmitPengangsuran = true;
|
|
$showAnnouncementPengangsuran = false;
|
|
$tanggal_pengumuman_pengangsuran = null;
|
|
|
|
if ($formPengangsuran) {
|
|
$tanggal_pengumuman_pengangsuran = $formPengangsuran->tanggal_pengumuman;
|
|
$showAnnouncementPengangsuran = $tanggal_pengumuman_pengangsuran && $today >= $tanggal_pengumuman_pengangsuran;
|
|
|
|
$pengangsuranSubmission = $pengajuan->first(function($item) use ($formPengangsuran) {
|
|
return $item->form &&
|
|
$item->form->jenis_form === 'pengangsuran' &&
|
|
$item->form->semester === $formPengangsuran->semester &&
|
|
$item->form->tahun === $formPengangsuran->tahun;
|
|
});
|
|
|
|
if ($pengangsuranSubmission) {
|
|
$submissionStatusPengangsuran = $pengangsuranSubmission->status_validasi;
|
|
$canSubmitPengangsuran = $submissionStatusPengangsuran === 'tidak valid';
|
|
}
|
|
}
|
|
|
|
return view('mahasiswa.dashboard', [
|
|
'user' => $user,
|
|
'today' => $today,
|
|
'pengajuan' => $pengajuan,
|
|
'formPenurunan' => $formPenurunan,
|
|
'formPengangsuran' => $formPengangsuran,
|
|
'rankingFile' => $rankingFile,
|
|
|
|
'submissionStatusPenurunan' => $submissionStatusPenurunan,
|
|
'canSubmitPenurunan' => $canSubmitPenurunan,
|
|
'showAnnouncementPenurunan' => $showAnnouncementPenurunan,
|
|
|
|
'submissionStatusPengangsuran' => $submissionStatusPengangsuran,
|
|
'canSubmitPengangsuran' => $canSubmitPengangsuran,
|
|
'showAnnouncementPengangsuran' => $showAnnouncementPengangsuran,
|
|
|
|
'tanggal_pengumuman' => max(
|
|
$tanggal_pengumuman_penurunan ?? now()->subCentury(),
|
|
$tanggal_pengumuman_pengangsuran ?? now()->subCentury()
|
|
),
|
|
'showAnnouncement' => ($showAnnouncementPenurunan || $showAnnouncementPengangsuran),
|
|
]);
|
|
} catch (\Exception $e) {
|
|
\Log::error("Dashboard error: ".$e->getMessage());
|
|
return response()->view('errors.simple', [
|
|
'message' => 'Terjadi kesalahan saat memuat dashboard'
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
public function downloadRanking($id)
|
|
{
|
|
try {
|
|
$rankingFile = RankingFile::findOrFail($id);
|
|
$filePath = storage_path('app/public/' . $rankingFile->path);
|
|
|
|
if (!file_exists($filePath)) {
|
|
throw new \Exception("File laporan tidak ditemukan");
|
|
}
|
|
|
|
$filename = 'Laporan-UKT-' . $rankingFile->created_at->format('Y-m-d') . '.pdf';
|
|
|
|
return response()->download($filePath, $filename, [
|
|
'Content-Type' => 'application/pdf',
|
|
'Content-Disposition' => 'attachment; filename="' . $filename . '"'
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
\Log::error("Download error - User: " . Auth::id() . " - Error: " . $e->getMessage());
|
|
return redirect()->route('mahasiswa.dashboard')
|
|
->with('error', 'Gagal mengunduh laporan: ' . $e->getMessage());
|
|
}
|
|
}
|
|
}
|