From d1ce5f2d5554371b0b956f2347001a6811d4f65c Mon Sep 17 00:00:00 2001 From: majid Date: Mon, 5 May 2025 15:47:09 +0700 Subject: [PATCH] fix: handle error tanggal penilaian --- ...PenilaianJaminanInternalExternalExport.php | 568 +++++++++--------- 1 file changed, 286 insertions(+), 282 deletions(-) diff --git a/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php b/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php index 12f5008..0784786 100644 --- a/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php +++ b/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php @@ -1,288 +1,292 @@ request = $request; - } - - public function collection() - { - $query = Permohonan::query(); - $query = $query->where('status', 'done'); - - // Apply date range filter if provided - if ($this->request->has('start_date') || $this->request->has('end_date')) { - $query->whereBetween('tanggal_permohonan', [ - $this->request->start_date ?? '1900-01-01', - $this->request->end_date ?? now()->toDateString() - ]); - } - - // Apply branch filter if provided - if ($this->request->has('branch_id') && !empty($this->request->branch_id)) { - $query->where('branch_id', $this->request->branch_id); - } - - if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) { - $request = $this->request; // Store in a local variable - $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($request) { - $q->where('user_id', $request->penilai_id); - }); - } - - // Apply search filter if provided - if ($this->request->has('search') && !empty($this->request->search)) { - $search = $this->request->search; - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); - $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhere('status', 'LIKE', '%' . $search . '%'); - }); - } - - // Default ordering - $query->orderBy('nomor_registrasi', 'asc'); - - return $query->get(); - } - - protected $rowNumber = 0; - - public function map($permohonan): array - { - $this->rowNumber++; - $luas_tanah = 0; - $luas_bangunan = 0; - $nilai_tanah = 0; - $nilai_bangunan = 0; - $npw = 0; - $nilai_liquidasi = 0; - - if (isset($permohonan->penilai->lpj)) { - $lpj = json_decode($permohonan->penilai->lpj, true); - $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0); - - $luas_tanah = $lpj['luas_tanah'] ?? 0; - $luas_bangunan = $lpj['luas_bangunan'] ?? 0; - $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0); - $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0); - $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0); - } - - return [ - $this->rowNumber, - $permohonan->nomor_registrasi, - $permohonan->tanggal_permohonan ?? '', - $permohonan->debiture->branch->name ?? '', - $permohonan->creator->name ?? '', - $permohonan->debiture->cif ?? '', - $permohonan->debiture->name ?? '', - $permohonan->jenisPenilaian->name ?? '', - $permohonan->tujuanPenilaian->name, - $permohonan->jenisFasilitasKredit->name, - $permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), - $permohonan->documents->map(function ($document) { - return formatAlamat($document); - })->unique()->implode(', '), - $permohonan->documents->flatMap(function ($document) { - return $document->detail->map(function ($detail) { - return (!empty($detail->dokumen_nomor) && is_array($detail->dokumen_nomor)) - ? ($detail->jenisLegalitasJaminan->name ?? '') . "\n" . implode(', ', $detail->dokumen_nomor) - : null; - }); - })->filter()->unique()->implode(', '), - $permohonan->documents->pluck('pemilik.name')->unique()->implode(', '), - $luas_tanah . ' m²', - formatRupiah($nilai_tanah, 2), - $luas_bangunan . ' m²', - formatRupiah($nilai_bangunan, 2), - formatRupiah($permohonan->nilai_njop ?? 0, 2), - formatRupiah($npw, 2), - formatRupiah($nilai_liquidasi, 2), - $permohonan->documents->map(function ($document) { - return formatTanggalIndonesia($document->created_at); - })->first(), - '', // tanggal_spk - '', // nomor_spk - '', // tanggal_rencana_kunjungan - $permohonan->penilaian->tanggal_kunjungan ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '', - '', // tanggal_delivered - '', // jangka_waktu_sla - ($permohonan->approval_dd_at || $permohonan->approval_eo_at) ? - formatTanggalIndonesia($permohonan->approval_dd_at ?? $permohonan->approval_eo_at) : '', - $permohonan->penilaian->tanggal_kunjungan ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '', - $permohonan->penilaian->_user_penilai->userPenilaiTeam->name ?? '', - $permohonan->penilaian->teams ?? '', - '', // saran - '' // catatan - ]; - } - - public function headings(): array - { - return [ - 'No', - 'Nomor Registrasi', - 'Tanggal Permohonan', - 'Cabang', - 'Pemohon', - 'CIF', - 'Nama Debitur', - 'Jenis Penilaian', - 'Tujuan Penilaian', - 'Jenis Fasilitas Kredit', - 'Jenis Agunan', - 'Alamat Agunan', - 'Bukti Kepemilikan', - 'Nama Pemilik', - 'Luas Tanah', - 'Nilai Tanah', - 'Luas Bangunan', - 'Nilai Bangunan', - 'Nilai NJOP', - 'Nilai Pasar Wajar', - 'Nilai Likuidasi', - 'Tanggal Dokumen Diterima', - 'Tanggal SPK', - 'Nomor SPK', - 'Tanggal Rencana Kunjungan', - 'Tanggal Kunjungan', - 'Tanggal Delivered', - 'Jangka Waktu SLA', - 'Tanggal Laporan', - 'Tanggal Review', - 'Nama Penilai', - 'Nama Team Leader', - 'Saran', - 'Catatan' - ]; - } - - /** - * @return string - */ - public function title(): string - { - return 'Laporan Hasil Penilaian Jaminan Internal & External'; - } - - /** - * @return string - */ - public function startCell(): string - { - return 'A7'; - } - - /** - * @return array - */ - public function registerEvents(): array - { - return [ - AfterSheet::class => function(AfterSheet $event) { - // Get the sheet - $sheet = $event->sheet->getDelegate(); - - // Set the title - $sheet->setCellValue('A1', 'LAPORAN PENILAIAN JAMINAN'); - $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); - - // Merge cells for title - $sheet->mergeCells('A1:AH1'); - $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); - - // Set the branch information if filtered - $branchInfo = ''; - if ($this->request->has('branch_id') && !empty($this->request->branch_id)) { - $branch = Branch::find($this->request->branch_id); - if ($branch) { - $branchInfo = 'Cabang: ' . $branch->name; - $sheet->setCellValue('A2', $branchInfo); - $sheet->mergeCells('A2:AH2'); - $sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); - $sheet->getStyle('A2')->getFont()->setBold(true); - } - } - - // Set the period - $startDate = $this->request->start_date ?? ''; - $endDate = $this->request->end_date ?? ''; - - $rowIndex = $branchInfo ? 3 : 2; - - if ($startDate && $endDate) { - $startDateFormatted = Carbon::parse($startDate)->format('d F Y'); - $endDateFormatted = Carbon::parse($endDate)->format('d F Y'); - $sheet->setCellValue('A' . $rowIndex, 'Periode: ' . $startDateFormatted . ' - ' . $endDateFormatted); - } else { - $sheet->setCellValue('A' . $rowIndex, 'Periode: Semua Data'); - } - $sheet->mergeCells('A' . $rowIndex . ':AH' . $rowIndex); - $sheet->getStyle('A' . $rowIndex)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); - - // Set the date of export - $rowIndex++; - $sheet->setCellValue('A' . $rowIndex, 'Tanggal Export: ' . Carbon::now()->format('d F Y H:i:s')); - - // Set the user who exported - $rowIndex++; - $userName = Auth::user() ? Auth::user()->name : 'System'; - $sheet->setCellValue('A' . $rowIndex, 'Diexport oleh: ' . $userName); - - // Add a blank line - $rowIndex++; - $sheet->setCellValue('A' . $rowIndex, ''); - - // Style the header row - $headerRange = 'A7:' . $sheet->getHighestColumn() . '7'; - $sheet->getStyle($headerRange)->getFont()->setBold(true); - $sheet->getStyle($headerRange)->getFill() - ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) - ->getStartColor()->setARGB('FFCCCCCC'); - - // Auto-size columns - fixed to handle columns beyond Z - $highestColumn = $sheet->getHighestColumn(); - $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); - - for ($i = 1; $i <= $highestColumnIndex; $i++) { - $currentColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i); - $sheet->getColumnDimension($currentColumn)->setAutoSize(true); - } - - // Add borders to all cells with data - $dataRange = 'A7:' . $sheet->getHighestColumn() . $sheet->getHighestRow(); - $sheet->getStyle($dataRange)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); - - // Center align the header row - $sheet->getStyle($headerRange)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); - - // Set text wrap for header cells - $sheet->getStyle($headerRange)->getAlignment()->setWrapText(true); - }, - ]; - } + $this->request = $request; } + + public function collection() + { + $query = Permohonan::query(); + $query = $query->where('status', 'done'); + + // Apply date range filter if provided + if ($this->request->has('start_date') || $this->request->has('end_date')) { + $query->whereBetween('tanggal_permohonan', [ + $this->request->start_date ?? '1900-01-01', + $this->request->end_date ?? now()->toDateString() + ]); + } + + // Apply branch filter if provided + if ($this->request->has('branch_id') && !empty($this->request->branch_id)) { + $query->where('branch_id', $this->request->branch_id); + } + + if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) { + $request = $this->request; // Store in a local variable + $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($request) { + $q->where('user_id', $request->penilai_id); + }); + } + + // Apply search filter if provided + if ($this->request->has('search') && !empty($this->request->search)) { + $search = $this->request->search; + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search . '%'); + }); + } + + // Default ordering + $query->orderBy('nomor_registrasi', 'asc'); + + return $query->get(); + } + + protected $rowNumber = 0; + + public function map($permohonan): array + { + $this->rowNumber++; + $luas_tanah = 0; + $luas_bangunan = 0; + $nilai_tanah = 0; + $nilai_bangunan = 0; + $npw = 0; + $nilai_liquidasi = 0; + + if (isset($permohonan->penilai->lpj)) { + $lpj = json_decode($permohonan->penilai->lpj, true); + $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0); + + $luas_tanah = $lpj['luas_tanah'] ?? 0; + $luas_bangunan = $lpj['luas_bangunan'] ?? 0; + $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0); + $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0); + $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0); + } + + return [ + $this->rowNumber, + $permohonan->nomor_registrasi, + $permohonan->tanggal_permohonan ?? '', + $permohonan->debiture->branch->name ?? '', + $permohonan->creator->name ?? '', + $permohonan->debiture->cif ?? '', + $permohonan->debiture->name ?? '', + $permohonan->jenisPenilaian->name ?? '', + $permohonan->tujuanPenilaian->name, + $permohonan->jenisFasilitasKredit->name, + $permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), + $permohonan->documents->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + $permohonan->documents->flatMap(function ($document) { + return $document->detail->map(function ($detail) { + return (!empty($detail->dokumen_nomor) && is_array($detail->dokumen_nomor)) + ? ($detail->jenisLegalitasJaminan->name ?? '') . "\n" . implode(', ', $detail->dokumen_nomor) + : null; + }); + })->filter()->unique()->implode(', '), + $permohonan->documents->pluck('pemilik.name')->unique()->implode(', '), + $luas_tanah . ' m²', + formatRupiah($nilai_tanah, 2), + $luas_bangunan . ' m²', + formatRupiah($nilai_bangunan, 2), + formatRupiah($permohonan->nilai_njop ?? 0, 2), + formatRupiah($npw, 2), + formatRupiah($nilai_liquidasi, 2), + $permohonan->documents->map(function ($document) { + return formatTanggalIndonesia($document->created_at); + })->first(), + '', // tanggal_spk + '', // nomor_spk + '', // tanggal_rencana_kunjungan + $permohonan->penilaian && $permohonan->penilaian->tanggal_kunjungan + ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) + : '', + '', // tanggal_delivered + '', // jangka_waktu_sla + ($permohonan->approval_dd_at || $permohonan->approval_eo_at) ? + formatTanggalIndonesia($permohonan->approval_dd_at ?? $permohonan->approval_eo_at) : '', + $permohonan->penilaian && $permohonan->penilaian->tanggal_kunjungan + ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) + : '', + $permohonan->penilaian->_user_penilai->userPenilaiTeam->name ?? '', + $permohonan->penilaian->teams ?? '', + '', // saran + '' // catatan + ]; + } + + public function headings(): array + { + return [ + 'No', + 'Nomor Registrasi', + 'Tanggal Permohonan', + 'Cabang', + 'Pemohon', + 'CIF', + 'Nama Debitur', + 'Jenis Penilaian', + 'Tujuan Penilaian', + 'Jenis Fasilitas Kredit', + 'Jenis Agunan', + 'Alamat Agunan', + 'Bukti Kepemilikan', + 'Nama Pemilik', + 'Luas Tanah', + 'Nilai Tanah', + 'Luas Bangunan', + 'Nilai Bangunan', + 'Nilai NJOP', + 'Nilai Pasar Wajar', + 'Nilai Likuidasi', + 'Tanggal Dokumen Diterima', + 'Tanggal SPK', + 'Nomor SPK', + 'Tanggal Rencana Kunjungan', + 'Tanggal Kunjungan', + 'Tanggal Delivered', + 'Jangka Waktu SLA', + 'Tanggal Laporan', + 'Tanggal Review', + 'Nama Penilai', + 'Nama Team Leader', + 'Saran', + 'Catatan' + ]; + } + + /** + * @return string + */ + public function title(): string + { + return 'Laporan Hasil Penilaian Jaminan Internal & External'; + } + + /** + * @return string + */ + public function startCell(): string + { + return 'A7'; + } + + /** + * @return array + */ + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + // Get the sheet + $sheet = $event->sheet->getDelegate(); + + // Set the title + $sheet->setCellValue('A1', 'LAPORAN PENILAIAN JAMINAN'); + $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); + + // Merge cells for title + $sheet->mergeCells('A1:AH1'); + $sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); + + // Set the branch information if filtered + $branchInfo = ''; + if ($this->request->has('branch_id') && !empty($this->request->branch_id)) { + $branch = Branch::find($this->request->branch_id); + if ($branch) { + $branchInfo = 'Cabang: ' . $branch->name; + $sheet->setCellValue('A2', $branchInfo); + $sheet->mergeCells('A2:AH2'); + $sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); + $sheet->getStyle('A2')->getFont()->setBold(true); + } + } + + // Set the period + $startDate = $this->request->start_date ?? ''; + $endDate = $this->request->end_date ?? ''; + + $rowIndex = $branchInfo ? 3 : 2; + + if ($startDate && $endDate) { + $startDateFormatted = Carbon::parse($startDate)->format('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->format('d F Y'); + $sheet->setCellValue('A' . $rowIndex, 'Periode: ' . $startDateFormatted . ' - ' . $endDateFormatted); + } else { + $sheet->setCellValue('A' . $rowIndex, 'Periode: Semua Data'); + } + $sheet->mergeCells('A' . $rowIndex . ':AH' . $rowIndex); + $sheet->getStyle('A' . $rowIndex)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); + + // Set the date of export + $rowIndex++; + $sheet->setCellValue('A' . $rowIndex, 'Tanggal Export: ' . Carbon::now()->format('d F Y H:i:s')); + + // Set the user who exported + $rowIndex++; + $userName = Auth::user() ? Auth::user()->name : 'System'; + $sheet->setCellValue('A' . $rowIndex, 'Diexport oleh: ' . $userName); + + // Add a blank line + $rowIndex++; + $sheet->setCellValue('A' . $rowIndex, ''); + + // Style the header row + $headerRange = 'A7:' . $sheet->getHighestColumn() . '7'; + $sheet->getStyle($headerRange)->getFont()->setBold(true); + $sheet->getStyle($headerRange)->getFill() + ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + ->getStartColor()->setARGB('FFCCCCCC'); + + // Auto-size columns - fixed to handle columns beyond Z + $highestColumn = $sheet->getHighestColumn(); + $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); + + for ($i = 1; $i <= $highestColumnIndex; $i++) { + $currentColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($currentColumn)->setAutoSize(true); + } + + // Add borders to all cells with data + $dataRange = 'A7:' . $sheet->getHighestColumn() . $sheet->getHighestRow(); + $sheet->getStyle($dataRange)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + + // Center align the header row + $sheet->getStyle($headerRange)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER); + + // Set text wrap for header cells + $sheet->getStyle($headerRange)->getAlignment()->setWrapText(true); + }, + ]; + } +}