readsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Alignment; use Illuminate\Support\Facades\Auth; class AkademikMahasiswaExport implements FromCollection, WithHeadings, WithMapping, WithStyles, WithColumnWidths { protected $isTemplate; protected $kampusId; protected $periode; protected $sumberInformasiId; protected $status; protected $kebutuhanKhususId; protected $tahunAkademikId; public function __construct( $isTemplate = true, $kampusId = null, $periode = null, $sumberInformasiId = null, $status = null, $kebutuhanKhususId = null, $tahunAkademikId = null ) { $this->isTemplate = $isTemplate; $this->kampusId = $kampusId; $this->periode = $periode; $this->sumberInformasiId = $sumberInformasiId; $this->status = $status; $this->kebutuhanKhususId = $kebutuhanKhususId; $this->tahunAkademikId = $tahunAkademikId; } public function collection() { if ($this->isTemplate) { return $this->getTemplateData(); } return $this->getRealData(); } protected function getTemplateData() { $user = Auth::user(); // Ambil data real untuk contoh $kampusQuery = Kampus::query(); if (!$user->role->is_global && $user->role->kampus_id) { $kampusQuery->where('id', $user->role->kampus_id); } $kampus = $kampusQuery->first(); $prodi = null; $tahunAkademik = null; $sumberInformasi = null; $kecamatan = null; if ($kampus) { $prodi = Prodi::where('kampus_id', $kampus->id)->first(); $tahunAkademik = TahunAkademik::where('kampus_id', $kampus->id) ->where('is_periode_aktif', 1) ->first(); $sumberInformasi = SumberInformasi::where('kampus_id', $kampus->id)->first(); } $kecamatan = Wilayah::kecamatan()->first(); // Jika tidak ada data, gunakan contoh if (!$kampus) { $kampus = (object) ['nama_kampus' => 'Kampus Contoh']; } if (!$prodi) { $prodi = (object) ['nama' => 'Program Studi Contoh']; } if (!$tahunAkademik) { $tahunAkademik = (object) ['kode' => '20251', 'nama' => 'Ganjil 2025/2026']; } if (!$sumberInformasi) { $sumberInformasi = (object) ['nama' => 'Website Kampus']; } if (!$kecamatan) { $kecamatan = (object) ['nama_wilayah' => 'Aifat Timur Jauh']; } return collect([ (object) [ // Data Utama (sesuai form create) 'nim' => '7842342123', 'nisn' => '8542349990', 'nama' => 'MHS TESTING', 'angkatan' => '2026', 'jenis_kelamin' => 'Laki-laki', 'tempat_lahir' => 'Jakarta', 'tanggal_lahir' => '2000-01-01', 'agama' => 'Islam', 'suku' => 'Jawa', 'berat_badan' => '60', 'tinggi_badan' => '170', 'golongan_darah' => 'O', 'transportasi' => '13', // ID untuk Sepeda motor // Kontak 'no_telepon' => '0211234567', 'no_hp' => '081234567890', 'email_pribadi' => 'MhsTest@gmail.com', 'email_kampus' => 'mhs@kampus.ac.id', // Alamat 'domisili' => 'Jl. Merdeka No. 1', 'kelurahan' => 'Cipayung', 'kecamatan' => $kecamatan->nama_wilayah, 'jenis_tinggal' => '3', // ID untuk Kost // Data Orang Tua 'nama_ibu' => 'IBU MHS TESTING', 'nama_ayah' => 'AYAH MHS TESTING', 'nik_ibu' => '1234567890123456', 'nik_ayah' => '1234567890123456', // KPS 'penerima_kps' => '0', 'nomor_kps' => '', // Kebutuhan Khusus 'kebutuhan_khusus' => '', 'kebutuhan_khusus_ibu' => '', 'kebutuhan_khusus_ayah' => '', // Data Administrasi 'nik' => '2342364742341112', 'no_kk' => '1234567890123456', 'kewarganegaraan' => 'ID', 'status_nikah' => 'Belum Menikah', 'ukuran_jas' => 'L', // Pekerjaan 'pekerjaan' => 'Pelajar/Mahasiswa', 'instansi_pekerjaan' => '', 'penghasilan' => '', // Bank 'no_rekening' => '1234567890', 'nama_rekening' => 'Mhs Testing', 'nama_bank' => 'Bank Contoh', // Data Akademik 'sistem_kuliah' => 'Reguler', 'tipe_pendaftaran' => 'Baru', 'jenis_pendaftaran' => '1', // ID untuk Peserta didik baru 'jenis_pembiayaan' => '1', // ID untuk Mandiri 'biaya_masuk' => '1000000000', 'jalur_pendaftaran' => '4', // ID untuk Prestasi 'tanggal_daftar_ulang' => '2025-01-15', 'tanggal_awal_masuk' => '2025-02-14', // Relasi 'prodi' => (object) ['nama' => $prodi->nama], 'kampus' => (object) ['nama_kampus' => $kampus->nama_kampus], 'tahunAkademik' => (object) ['kode' => $tahunAkademik->kode], 'kurikulum' => (object) ['nama_kurikulum' => 'Kurikulum 2026'], 'sumberInformasi' => (object) ['nama' => $sumberInformasi->nama], 'status' => 'Baru', ] ]); } protected function getRealData() { $user = Auth::user(); $query = Mahasiswa::with(['kampus', 'prodi', 'sumberInformasi', 'wilayah', 'kebutuhanKhusus', 'tahunAkademik', 'kurikulum']) ->where('is_validated', true); if ($this->kampusId && $this->kampusId !== 'all' && $this->kampusId !== '') { $query->where('kampus_id', $this->kampusId); } elseif (!$user->role->is_global && $user->role->kampus_id) { $query->where('kampus_id', $user->role->kampus_id); } if ($this->periode) { $query->where('periode_masuk', $this->periode); } if ($this->sumberInformasiId && $this->sumberInformasiId !== '') { $query->where('sumber_informasi_id', $this->sumberInformasiId); } if ($this->tahunAkademikId && $this->tahunAkademikId !== '') { $query->where('tahun_akademik_id', $this->tahunAkademikId); } if ($this->status && $this->status !== 'all') { $query->where('status', $this->status); } if ($this->kebutuhanKhususId && $this->kebutuhanKhususId !== 'all') { $query->where('id_kebutuhan_khusus', $this->kebutuhanKhususId); } return $query->orderBy('kampus_id')->orderBy('nim')->get(); } public function map($mahasiswa): array { // Jika template, data sudah dalam format object biasa if ($this->isTemplate && !($mahasiswa instanceof Mahasiswa)) { return [ $mahasiswa->nim, $mahasiswa->nisn, $mahasiswa->nama, $mahasiswa->angkatan, $mahasiswa->jenis_kelamin, $mahasiswa->tempat_lahir, $mahasiswa->tanggal_lahir, $mahasiswa->agama, $mahasiswa->suku, $mahasiswa->berat_badan, $mahasiswa->tinggi_badan, $mahasiswa->golongan_darah, $mahasiswa->transportasi, $mahasiswa->no_telepon, $mahasiswa->no_hp, $mahasiswa->email_pribadi, $mahasiswa->email_kampus, $mahasiswa->domisili, $mahasiswa->kelurahan, $mahasiswa->kecamatan, $mahasiswa->jenis_tinggal, $mahasiswa->nama_ibu, $mahasiswa->nama_ayah, $mahasiswa->nik_ibu, $mahasiswa->nik_ayah, $mahasiswa->penerima_kps == '1' ? 'Ya' : 'Tidak', $mahasiswa->nomor_kps, $this->formatKebutuhanKhusus($mahasiswa->kebutuhan_khusus ?? ''), $this->formatKebutuhanKhusus($mahasiswa->kebutuhan_khusus_ibu ?? ''), $this->formatKebutuhanKhusus($mahasiswa->kebutuhan_khusus_ayah ?? ''), $mahasiswa->nik, $mahasiswa->no_kk, $mahasiswa->kewarganegaraan, $mahasiswa->status_nikah, $mahasiswa->ukuran_jas, $mahasiswa->pekerjaan, $mahasiswa->instansi_pekerjaan, $mahasiswa->penghasilan, $mahasiswa->no_rekening, $mahasiswa->nama_rekening, $mahasiswa->nama_bank, $mahasiswa->sistem_kuliah, $mahasiswa->tipe_pendaftaran, $this->getJenisPendaftaranNama($mahasiswa->jenis_pendaftaran), $this->getJenisPembiayaanNama($mahasiswa->jenis_pembiayaan), $mahasiswa->biaya_masuk ? 'Rp ' . number_format($mahasiswa->biaya_masuk, 0, ',', '.') : '', $this->getJalurPendaftaranNama($mahasiswa->jalur_pendaftaran), $mahasiswa->tanggal_daftar_ulang, $mahasiswa->tanggal_awal_masuk, $mahasiswa->prodi->nama ?? '', $mahasiswa->kampus->nama_kampus ?? '', $mahasiswa->tahunAkademik->kode ?? '', $mahasiswa->kurikulum->nama_kurikulum ?? '', $mahasiswa->sumberInformasi->nama ?? '', $mahasiswa->status ?? '', ]; } // Untuk data real dari database return [ $mahasiswa->nim, $mahasiswa->nisn, $mahasiswa->nama, $mahasiswa->angkatan, $mahasiswa->jenis_kelamin, $mahasiswa->tempat_lahir, $mahasiswa->tanggal_lahir ? date('Y-m-d', strtotime($mahasiswa->tanggal_lahir)) : '', $this->getAgamaNama($mahasiswa->agama), $mahasiswa->suku, $mahasiswa->berat_badan, $mahasiswa->tinggi_badan, $mahasiswa->golongan_darah, $this->getTransportasiNama($mahasiswa->transportasi), $mahasiswa->no_telepon, $mahasiswa->no_hp, $mahasiswa->email_pribadi, $mahasiswa->email_kampus, $mahasiswa->domisili, $mahasiswa->kelurahan, $mahasiswa->wilayah->nama_wilayah ?? '', $this->getJenisTinggalNama($mahasiswa->id_jenis_tinggal), $mahasiswa->nama_ibu, $mahasiswa->nama_ayah, $mahasiswa->nik_ibu, $mahasiswa->nik_ayah, $mahasiswa->penerima_kps ? 'Ya' : 'Tidak', $mahasiswa->nomor_kps, $mahasiswa->nama_kebutuhan_khusus ?? '', $mahasiswa->nama_kebutuhan_khusus_ibu ?? '', $mahasiswa->nama_kebutuhan_khusus_ayah ?? '', $mahasiswa->nik, $mahasiswa->no_kk, $mahasiswa->kewarganegaraan, $mahasiswa->status_nikah, $mahasiswa->ukuran_jas, $mahasiswa->pekerjaan, $mahasiswa->instansi_pekerjaan, $mahasiswa->penghasilan, $mahasiswa->no_rekening, $mahasiswa->nama_rekening, $mahasiswa->nama_bank, $mahasiswa->sistem_kuliah, $mahasiswa->tipe_pendaftaran, $this->getJenisPendaftaranNama($mahasiswa->jenis_pendaftaran), $this->getJenisPembiayaanNama($mahasiswa->jenis_pembiayaan), $mahasiswa->biaya_masuk ? 'Rp ' . number_format($mahasiswa->biaya_masuk, 0, ',', '.') : '', $this->getJalurPendaftaranNama($mahasiswa->jalur_pendaftaran), $mahasiswa->tanggal_daftar_ulang ? date('Y-m-d', strtotime($mahasiswa->tanggal_daftar_ulang)) : '', $mahasiswa->tanggal_awal_masuk ? date('Y-m-d', strtotime($mahasiswa->tanggal_awal_masuk)) : '', $mahasiswa->prodi->nama ?? '', $mahasiswa->kampus->nama_kampus ?? '', $mahasiswa->tahunAkademik->kode ?? '', $mahasiswa->sumberInformasi->nama ?? '', $mahasiswa->status ?? '', ]; } public function headings(): array { return [ // Data Utama 'NIM', 'NISN', 'NAMA', 'ANGKATAN', 'JENIS_KELAMIN', 'TEMPAT_LAHIR', 'TANGGAL_LAHIR', 'AGAMA', 'SUKU', 'BERAT_BADAN', 'TINGGI_BADAN', 'GOLONGAN_DARAH', 'TRANSPORTASI', // Kontak 'NO_TELEPON', 'NO_HP', 'EMAIL_PRIBADI', 'EMAIL_KAMPUS', // Alamat 'DOMISILI', 'KELURAHAN', 'KECAMATAN', 'JENIS_TINGGAL', // Data Orang Tua 'NAMA_IBU', 'NAMA_AYAH', 'NIK_IBU', 'NIK_AYAH', // KPS 'PENERIMA_KPS', 'NOMOR_KPS', // Kebutuhan Khusus 'KEBUTUHAN_KHUSUS', 'KEBUTUHAN_KHUSUS_IBU', 'KEBUTUHAN_KHUSUS_AYAH', // Data Administrasi 'NIK', 'NO_KK', 'KEWARGANEGARAAN', 'STATUS_NIKAH', 'UKURAN_JAS', // Pekerjaan 'PEKERJAAN', 'INSTANSI_PEKERJAAN', 'PENGHASILAN', // Bank 'NO_REKENING', 'NAMA_REKENING', 'NAMA_BANK', // Data Akademik 'SISTEM_KULIAH', 'TIPE_PENDAFTARAN', 'JENIS_PENDAFTARAN', 'JENIS_PEMBIAYAAN', 'BIAYA_MASUK', 'JALUR_PENDAFTARAN', 'TANGGAL_DAFTAR_ULANG', 'TANGGAL_AWAL_MASUK', // Relasi 'PRODI_NAMA', 'KAMPUS_NAMA', 'TAHUN_AKADEMIK', 'KURIKULUM', 'SUMBER_INFORMASI', 'STATUS', ]; } public function styles(Worksheet $sheet) { $lastColumn = 'BC'; // 55 kolom (A sampai BC) $highestRow = $sheet->getHighestRow(); // Style untuk header $sheet->getStyle('A1:' . $lastColumn . '1')->applyFromArray([ 'font' => [ 'bold' => true, 'color' => ['rgb' => 'FFFFFF'], 'size' => 11, ], 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => '4F46E5'], // Warna Indigo ], 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => '000000'], ], ], 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, 'wrapText' => true, ], ]); // Style untuk data if ($highestRow > 1) { $sheet->getStyle('A2:' . $lastColumn . $highestRow)->applyFromArray([ 'borders' => [ 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => ['rgb' => 'DDDDDD'], ], ], 'alignment' => [ 'vertical' => Alignment::VERTICAL_CENTER, ], ]); } // Set auto filter $sheet->setAutoFilter('A1:' . $lastColumn . '1'); // Freeze pane baris pertama $sheet->freezePane('A2'); return [ 1 => ['font' => ['bold' => true]], ]; } public function columnWidths(): array { return [ // Data Utama 'A' => 15, // NIM 'B' => 15, // NISN 'C' => 25, // NAMA 'D' => 10, // ANGKATAN 'E' => 15, // JENIS_KELAMIN 'F' => 15, // TEMPAT_LAHIR 'G' => 15, // TANGGAL_LAHIR 'H' => 12, // AGAMA 'I' => 12, // SUKU 'J' => 12, // BERAT_BADAN 'K' => 12, // TINGGI_BADAN 'L' => 15, // GOLONGAN_DARAH 'M' => 15, // TRANSPORTASI // Kontak 'N' => 15, // NO_TELEPON 'O' => 15, // NO_HP 'P' => 25, // EMAIL_PRIBADI 'Q' => 25, // EMAIL_KAMPUS // Alamat 'R' => 30, // DOMISILI 'S' => 20, // KELURAHAN 'T' => 20, // KECAMATAN 'U' => 15, // JENIS_TINGGAL // Data Orang Tua 'V' => 20, // NAMA_IBU 'W' => 20, // NAMA_AYAH 'X' => 18, // NIK_IBU 'Y' => 18, // NIK_AYAH // KPS 'Z' => 15, // PENERIMA_KPS 'AA' => 15, // NOMOR_KPS // Kebutuhan Khusus 'AB' => 20, // KEBUTUHAN_KHUSUS 'AC' => 20, // KEBUTUHAN_KHUSUS_IBU 'AD' => 20, // KEBUTUHAN_KHUSUS_AYAH // Data Administrasi 'AE' => 18, // NIK 'AF' => 18, // NO_KK 'AG' => 15, // KEWARGANEGARAAN 'AH' => 15, // STATUS_NIKAH 'AI' => 10, // UKURAN_JAS // Pekerjaan 'AJ' => 20, // PEKERJAAN 'AK' => 25, // INSTANSI_PEKERJAAN 'AL' => 15, // PENGHASILAN // Bank 'AM' => 15, // NO_REKENING 'AN' => 20, // NAMA_REKENING 'AO' => 15, // NAMA_BANK // Data Akademik 'AP' => 15, // SISTEM_KULIAH 'AQ' => 15, // TIPE_PENDAFTARAN 'AR' => 20, // JENIS_PENDAFTARAN 'AS' => 20, // JENIS_PEMBIAYAAN 'AT' => 20, // BIAYA_MASUK 'AU' => 20, // JALUR_PENDAFTARAN 'AV' => 15, // TANGGAL_DAFTAR_ULANG 'AW' => 15, // TANGGAL_AWAL_MASUK // Relasi 'AX' => 25, // PRODI_NAMA 'AY' => 25, // KAMPUS_NAMA 'AZ' => 15, // TAHUN_AKADEMIK 'BA' => 20, // KURIKULUM 'BB' => 20, // SUMBER_INFORMASI 'BC' => 10, // STATUS ]; } // Helper methods untuk konversi ID ke nama private function getAgamaNama($id) { $map = [ '1' => 'Islam', '2' => 'Kristen', '3' => 'Katolik', '4' => 'Hindu', '5' => 'Buddha', '6' => 'Khonghucu', '7' => 'Penghayat Kepercayaan', '99' => 'Lainnya', ]; return $map[$id] ?? $id; } private function getTransportasiNama($id) { $map = [ '1' => 'Jalan kaki', '3' => 'Angkutan umum', '4' => 'Mobil/bus antar jemput', '5' => 'Kereta api', '6' => 'Ojek', '7' => 'Andong/becak', '8' => 'Perahu', '11' => 'Kuda', '12' => 'Sepeda', '13' => 'Sepeda motor', '14' => 'Mobil pribadi', '99' => 'Lainnya', ]; return $map[$id] ?? $id; } private function getJenisTinggalNama($id) { $map = [ '1' => 'Bersama orang tua', '2' => 'Wali', '3' => 'Kost', '4' => 'Asrama', '5' => 'Panti asuhan', '10' => 'Rumah sendiri', '99' => 'Lainnya', ]; return $map[$id] ?? $id; } private function getJenisPendaftaranNama($id) { $map = [ '1' => 'Peserta didik baru', ]; return $map[$id] ?? $id; } private function getJenisPembiayaanNama($id) { $map = [ '1' => 'Mandiri', '2' => 'Beasiswa Tidak Penuh', '3' => 'Beasiswa Penuh', ]; return $map[$id] ?? $id; } private function getJalurPendaftaranNama($id) { $map = [ '3' => 'PMDK', '4' => 'Prestasi', '9' => 'Program Internasional', '11' => 'Kerjasama', '12' => 'Seleksi Mandiri', '13' => 'Ujian Masuk Bersama', '14' => 'SNBT', '15' => 'SNBP', ]; return $map[$id] ?? $id; } private function formatKebutuhanKhusus($value) { if (empty($value) || $value == 0) return 'Tidak ada'; // Jika berupa angka (bitwise), coba cari di tabel kebutuhan_khusus if (is_numeric($value)) { $kebutuhan = \App\Models\KebutuhanKhusus::find($value); return $kebutuhan ? $kebutuhan->nama_kebutuhan_khusus : $value; } return $value; } }