diff --git a/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php b/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php index 0926097..895bb1a 100644 --- a/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php +++ b/app/Exports/LaporanHasilPenilaianJaminanInternalExternalExport.php @@ -30,10 +30,20 @@ class LaporanHasilPenilaianJaminanInternalExternalExport implements FromCollecti // 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() - ]); + $startDate = $this->request->start_date ?? '1900-01-01'; + $endDate = $this->request->end_date ?? now()->toDateString(); + + $query->where(function ($q) use ($startDate, $endDate) { + + $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) { + $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]); + }); + + // OR check if has penawaran with date in range + $q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) { + $q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); + }); } // Apply branch filter if provided diff --git a/app/Exports/LaporanPenilaiJaminanExport.php b/app/Exports/LaporanPenilaiJaminanExport.php index d2330ab..6da8afa 100644 --- a/app/Exports/LaporanPenilaiJaminanExport.php +++ b/app/Exports/LaporanPenilaiJaminanExport.php @@ -2,7 +2,8 @@ namespace Modules\Lpj\Exports; -use Maatwebsite\Excel\Concerns\FromQuery; + +use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithMapping; use Maatwebsite\Excel\Concerns\ShouldAutoSize; @@ -12,166 +13,296 @@ use Modules\Lpj\Models\Debiture; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Helpers\Lpj; -class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMapping, ShouldAutoSize +class LaporanPenilaiJaminanExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize { - protected $tanggalAwal; - protected $tanggalAkhir; - protected $status; - protected $selectedIds; - public function __construct($tanggalAwal = null, $tanggalAkhir = null, $status = null, $selectedIds = null) + protected $request; + + public function __construct($request) { - $this->tanggalAwal = $tanggalAwal; - $this->tanggalAkhir = $tanggalAkhir; - $this->status = $status; - $this->selectedIds = $selectedIds; + $this->request = $request; } - public function query() + public function collection() { - $query = Permohonan::query() - ->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'inspeksi']); + $query = Permohonan::query(); + $query = $query->where('status', 'done'); - // Filter by date range if provided - if ($this->tanggalAwal && $this->tanggalAkhir) { - $query->whereBetween('tanggal_permohonan', [$this->tanggalAwal, $this->tanggalAkhir]); - } + // Apply date range filter if provided + if ($this->request->has('start_date') || $this->request->has('end_date')) { + $startDate = $this->request->start_date ?? '1900-01-01'; + $endDate = $this->request->end_date ?? now()->toDateString(); - $query->where('status', 'done'); - // Filter by status if provided - if ($this->status) { - $types = is_array($this->status) ? $this->status : [$this->status]; - $types = array_map('strtolower', $types); - $query->whereHas('penilai', function (Builder $query) use ($types) { - $query->whereIn('type_penilai', $types); + $query->where(function ($q) use ($startDate, $endDate) { + + $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) { + $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]); + }); + + // OR check if has penawaran with date in range + $q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) { + $q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); }); } + // Filter by laporan type if provided + if ($this->request->has('laporan') && is_array($this->request->laporan) && !empty($this->request->laporan)) { + foreach ($this->request->laporan as $type) { + $query->whereHas('penilai', function ($q) use ($type) { + $q->where('type_penilai', 'LIKE', '%' . $type . '%'); + }); + } + } + + // Apply branch filter if provided + if ($this->request->has('branch_id') && !empty($this->request->branch_id)) { + $query->where('branch_id', $this->request->branch_id); + } // Filter by selected IDs if provided - if ($this->selectedIds) { - $selectedIds = is_array($this->selectedIds) ? $this->selectedIds : explode(',', $this->selectedIds); + if ($this->request->has('selected_ids') && !empty($this->request->selected_ids)) { + $selectedIds = is_array($this->request->selected_ids) ? $this->request->selected_ids : explode(',', $this->request->selected_ids); $query->whereIn('id', $selectedIds); } - return $query; + // 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(); } - - public function map($row): array + 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; - // ambil data alamat dari inspeksi - $alamat_inspeksi = null; + if (isset($permohonan->penilai->lpj)) { + $lpj = json_decode($permohonan->penilai->lpj, true); + $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0); - if ($row->inspeksi) { - $alamat_inspeksi = json_decode($row->inspeksi->data_form, true) ?? null; - $alamat_inspeksi = $alamat_inspeksi['asset']['alamat']['sesuai'] ?? $alamat_inspeksi['asset']['alamat']['tidak sesuai'] ?? []; + $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); } - $alamat_inspeksi = $alamat_inspeksi['address'] ?? '-'; - - - // ambil data dari table penilai - $fieldPenilai = ['lpj', 'resume', 'memo', 'rap', 'call-report']; - $penilaiCek = null; - - // Cari field yang tersedia - foreach ($fieldPenilai as $value) { - if (!empty($row->penilai->$value)) { - $penilaiCek = $row->penilai->$value; - break; - } - } - - $decodePenilai = json_decode($penilaiCek, true) ?? []; - // Ambil nilai utama - $luasTanah = $decodePenilai['luas_tanah'] ?? 0; - $nilaiTanah1 = $decodePenilai['nilai_tanah_1'] ?? 0; - $luasBangunan = $decodePenilai['luas_bangunan'] ?? 0; - $nilaiBangunan1 = $decodePenilai['nilai_bangunan_1'] ?? 0; - $totalNilaiPasar = $decodePenilai['total_nilai_pasar_wajar'] ?? 0; - $likuidasi = $decodePenilai['likuidasi'] ?? 0; - - // Ambil data npw_tambahan jika ada - $npwTambahan = $decodePenilai['npw_tambahan'] ?? []; - $tambahanDetails = []; - foreach ($npwTambahan as $tambahan) { - $tambahanDetails[] = sprintf( - '%s: Luas: %s, Nilai 1: %s, Nilai 2: %s', - $tambahan['name'] ?? '-', - $tambahan['luas'] ?? 0, - $tambahan['nilai_1'] ?? 0, - $tambahan['nilai_2'] ?? 0 - ); - } - $tambahanSummary = implode("; ", $tambahanDetails); - - // Ambil data penilaian dari table penilaian - $user_penilai = $row->penilaian->userPenilai ?? null; - $user_penilai_name = null; - foreach ($user_penilai as $value) { - if ($value->role == 'penilai') { - $user_penilai_name = $value->user->name; - $nik_penilai = $value->user->nik ?? '-'; - break; - } - } - return [ - $row->id, - $row->nomor_registrasi, - $row->user->name, - $row->branch->name, - $row->tujuanPenilaian->name, - $row->debiture->name, - $row->penilai->type_penilai ?? '-', - $alamat_inspeksi ?? '-', - $luasTanah, - $luasBangunan, - $nilaiTanah1, - $nilaiBangunan1, - $totalNilaiPasar, - $likuidasi, - $row->laporan->created_at ?? '-', - $user_penilai_name, - $nik_penilai, - $row->created_at, + $this->rowNumber, + $permohonan->nomor_registrasi, + $permohonan->tanggal_permohonan ?? '', + $permohonan->debiture->branch->name ?? '', + $permohonan->user->name ?? $permohonan->mig_nama_ao ?? '', + $permohonan->debiture->cif ?? '', + $permohonan->debiture->name ?? '', + $permohonan->tujuanPenilaian->name, + $permohonan->jenisPenilaian->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->approveSo->name ?? '', + $permohonan->penilai->type_penilai?? '', ]; } + public function headings(): array { return [ - 'ID', + 'No', 'Nomor Registrasi', - 'User Pemohon', + 'Tanggal Permohonan', 'Cabang', + 'Pemohon', + 'CIF', + 'Nama Debitur', + 'Jenis Penilaian', 'Tujuan Penilaian', - 'Debitur', - 'Jenis Laporan', - 'Lokasi Jaminan', + 'Jenis Fasilitas Kredit', + 'Jenis Agunan', + 'Alamat Agunan', + 'Bukti Kepemilikan', + 'Nama Pemilik', 'Luas Tanah', + 'Nilai Tanah', 'Luas Bangunan', - 'Harga Tanah', - 'Harga Bangunan', + 'Nilai Bangunan', + 'Nilai NJOP', 'Nilai Pasar Wajar', - 'Likuidasi', + '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', - 'Nik Penilai', - 'Created At', + 'Nama Team Leader', + 'Laporan', + ]; } - public function columnFormats(): array + + /** + * @return string + */ + public function title(): string + { + return 'Laporan Hasil Penilaian Jaminan Internal & External'; + } + + /** + * @return string + */ + public function startCell(): string + { + return 'A7'; + } + + public function registerEvents(): array { return [ - 'A' => NumberFormat::FORMAT_NUMBER, - 'C' => NumberFormat::FORMAT_DATE_DATETIME, - 'K' => NumberFormat::FORMAT_DATE_DATETIME, - 'N' => NumberFormat::FORMAT_DATE_DATETIME + 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); + }, ]; } } diff --git a/app/Exports/LaporanPenilaianJaminanExport.php b/app/Exports/LaporanPenilaianJaminanExport.php index 1e063fa..6e6a968 100644 --- a/app/Exports/LaporanPenilaianJaminanExport.php +++ b/app/Exports/LaporanPenilaianJaminanExport.php @@ -1,245 +1,259 @@ 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->with(['debiture.branch'])->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->debiture->name, - $permohonan->creator->name, - $permohonan->tujuanPenilaian->name, - $permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), - $permohonan->documents->map(function ($document) { - return formatAlamat($document); - })->unique()->implode(', '), - $luas_tanah . ' m²', - formatRupiah($nilai_tanah, 2), - $luas_bangunan . ' m²', - formatRupiah($nilai_bangunan, 2), - ($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) : '', - formatRupiah($npw, 2), - formatRupiah($nilai_liquidasi, 2), - $permohonan->penilaian->_user_penilai->userPenilaiTeam->name, - ]; - } - - public function headings(): array - { - return [ - 'No', - 'Nomor Registrasi', - 'Tanggal Permohonan', - 'Cabang', - 'Nama Debitur', - 'Pemohon', - 'Tujuan Penilaian', - 'Jenis Agunan', - 'Alamat Agunan', - 'Luas Tanah', - 'Nilai Tanah', - 'Luas Bangunan', - 'Nilai Bangunan', - 'Tanggal Laporan', - 'Tanggal Review', - 'Nilai Pasar Wajar', - 'Nilai Likuidasi', - 'Nama Penilai', - ]; - } - - /** - * @return string - */ - public function title(): string - { - return 'Laporan Penilaian Jaminan'; - } - - /** - * @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:R1'); - $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:R2'); - $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 . ':R' . $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 - foreach(range('A', $sheet->getHighestColumn()) as $column) { - $sheet->getColumnDimension($column)->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')) { + + $startDate = $this->request->start_date ?? '1900-01-01'; + $endDate = $this->request->end_date ?? now()->toDateString(); + + $query->where(function ($q) use ($startDate, $endDate) { + + $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) { + $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]); + }); + + // OR check if has penawaran with date in range + $q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) { + $q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); + }); + + } + + // 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'); + + dd($query->toSql(), $query->getBindings()); + + return $query->with(['debiture.branch'])->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->debiture->name, + $permohonan->creator->name, + $permohonan->tujuanPenilaian->name, + $permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '), + $permohonan->documents->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + $luas_tanah . ' m²', + formatRupiah($nilai_tanah, 2), + $luas_bangunan . ' m²', + formatRupiah($nilai_bangunan, 2), + ($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) : '', + formatRupiah($npw, 2), + formatRupiah($nilai_liquidasi, 2), + $permohonan->penilaian->_user_penilai->userPenilaiTeam->name, + ]; + } + + public function headings(): array + { + return [ + 'No', + 'Nomor Registrasi', + 'Tanggal Permohonan', + 'Cabang', + 'Nama Debitur', + 'Pemohon', + 'Tujuan Penilaian', + 'Jenis Agunan', + 'Alamat Agunan', + 'Luas Tanah', + 'Nilai Tanah', + 'Luas Bangunan', + 'Nilai Bangunan', + 'Tanggal Laporan', + 'Tanggal Review', + 'Nilai Pasar Wajar', + 'Nilai Likuidasi', + 'Nama Penilai', + ]; + } + + /** + * @return string + */ + public function title(): string + { + return 'Laporan Penilaian Jaminan'; + } + + /** + * @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:R1'); + $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:R2'); + $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 . ':R' . $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 + foreach (range('A', $sheet->getHighestColumn()) as $column) { + $sheet->getColumnDimension($column)->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); + }, + ]; + } +} diff --git a/app/Http/Controllers/LaporanPenilaiJaminanController.php b/app/Http/Controllers/LaporanPenilaiJaminanController.php index 6af0f1e..3390ba0 100644 --- a/app/Http/Controllers/LaporanPenilaiJaminanController.php +++ b/app/Http/Controllers/LaporanPenilaiJaminanController.php @@ -9,6 +9,7 @@ use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Exports\LaporanPenilaiJaminanExport; use Maatwebsite\Excel\Facades\Excel; +use Modules\Lpj\Models\Branch; class LaporanPenilaiJaminanController extends Controller { @@ -22,21 +23,6 @@ class LaporanPenilaiJaminanController extends Controller return view('lpj::laporan-penilai-jaminan.index', compact('status_permohonan')); } - /** - * Show the form for creating a new resource. - */ - public function create() - { - return view('lpj::create'); - } - - /** - * Store a newly created resource in storage. - */ - public function store(Request $request) - { - // - } /** * Show the specified resource. @@ -46,29 +32,6 @@ class LaporanPenilaiJaminanController extends Controller return view('lpj::laporan-penilai-jaminan.show'); } - /** - * Show the form for editing the specified resource. - */ - public function edit($id) - { - return view('lpj::edit'); - } - - /** - * Update the specified resource in storage. - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. - */ - public function destroy($id) - { - // - } public function dataForDatatables(Request $request) { @@ -93,34 +56,63 @@ class LaporanPenilaiJaminanController extends Controller // dd($startDate); // Retrieve data from the database $query = Permohonan::query(); - $query = $query->orderBy('nomor_registrasi', 'desc'); + $query = $query->where('status', 'done')->orderBy('tanggal_permohonan', 'desc'); // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('search'); - $paramsSearch = json_decode($search); + $search = json_decode($request->get('search')); - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%') - ->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%') - ->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%') - ->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%') - ->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%') - ->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + if (!empty($search->start_date) || !empty($search->end_date)) { + $startDate = $search->start_date ?? '1900-01-01'; + $endDate = $search->end_date ?? now()->toDateString(); - if (!empty($paramsSearch->tanggal_awal) && !empty($paramsSearch->tanggal_akhir)) { - $q->whereBetween('tanggal_permohonan', [$paramsSearch->tanggal_awal, $paramsSearch->tanggal_akhir]); - } - - - $statusKeywords = explode(',', $search); - foreach ($statusKeywords as $keyword) { - $q->orWhereRelation('penilai', 'type_penilai', 'LIKE', '%' . trim($keyword) . '%'); - } + $query->where(function ($q) use ($startDate, $endDate) { + $q->whereExists(function ($subQuery) use ($startDate, $endDate) { + $subQuery->select(DB::raw(1)) + ->from('penilaian') + ->whereColumn('penilaian.nomor_registrasi', 'permohonan.nomor_registrasi') + ->whereBetween('penilaian.tanggal_kunjungan', [$startDate, $endDate]); + }) + ->orWhereExists(function ($subQuery) use ($startDate, $endDate) { + $subQuery->select(DB::raw(1)) + ->from('penawaran') + ->whereColumn('penawaran.nomor_registrasi', 'permohonan.nomor_registrasi') + ->whereBetween('penawaran.tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); }); + + } + + + if (isset($search->branch_id) && !empty($search->branch_id)) { + $query->where('branch_id', $search->branch_id); + } + + if (isset($search->laporan) && is_array($search->laporan) && !empty($search->laporan)) { + foreach ($search->laporan as $type) { + $query->whereHas('penilai', function ($q) use ($type) { + $q->where('type_penilai', 'LIKE', '%' . $type . '%'); + }); + } + } + + + // dd($search->search); + + if (isset($search->search)) { + + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search->search . '%'); + }); + } + } - $query->where('status', 'done'); - - // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { @@ -132,10 +124,6 @@ class LaporanPenilaiJaminanController extends Controller // Get the total count of records $totalRecords = $query->count(); - $size = $request->get('size', 10); - if ($size == 0) { - $size = 10; - } // Apply pagination if provided if ($request->has('page') && $request->has('size')) { @@ -151,7 +139,7 @@ class LaporanPenilaiJaminanController extends Controller // Get data with necessary relationships - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai'])->get(); + $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'dokumenjaminan.inspeksi'])->get(); // Calculate the page count $pageCount = ceil($totalRecords / $size); @@ -173,15 +161,53 @@ class LaporanPenilaiJaminanController extends Controller public function export(Request $request) { - $tanggalAwal = $request->input('tanggal_awal'); - $tanggalAkhir = $request->input('tanggal_akhir'); - $status = $request->input('status'); - $selectedIds = $request->input('selected_ids'); + $startDate = $request->input('start_date'); + $endDate = $request->input('end_date'); + + // Validate the date format + if (isset($startDate) && isset($endDate)) { + $startDate = date('Y-m-d', strtotime($startDate)); + $endDate = date('Y-m-d', strtotime($endDate)); + + if ($startDate > $endDate) { + return redirect()->back()->with('error', 'Tanggal awal tidak boleh lebih kecil dari tanggal akhir'); + } + } + // name the file + $filename = $this->createNameLaporan($request); - $filename = 'laporan_penilai_jaminan_' . date('YmdHis') . '.xlsx'; return Excel::download( - new LaporanPenilaiJaminanExport($tanggalAwal, $tanggalAkhir, $status, $selectedIds), + new LaporanPenilaiJaminanExport($request), $filename ); } + + + public function createNameLaporan($request) + { + $startDate = $request->start_date ?? null; + $endDate = $request->end_date ?? null; + $branchId = $request->branch_id ?? null; + $laporan = $request->laporan ?? null; + + // Initialize filename parts + $parts = ['Laporan Penilai Jaminan']; + if ($startDate && $endDate) { + $parts[] = "{$startDate}_{$endDate}"; + } + if ($laporan) { + $parts[] = $laporan; + } + if ($branchId) { + $parts[] = $this->getBranchId($branchId); + } + // Return concatenated filename with extension + return implode('_', $parts) . '.xlsx'; + } + + public function getBranchId($branchId) + { + $branchesName = Branch::find($branchId)->name ?? null; + return $branchesName; + } } diff --git a/app/Http/Controllers/LaporanPenilaianJaminanController.php b/app/Http/Controllers/LaporanPenilaianJaminanController.php index 9596161..856e3e7 100644 --- a/app/Http/Controllers/LaporanPenilaianJaminanController.php +++ b/app/Http/Controllers/LaporanPenilaianJaminanController.php @@ -1,161 +1,177 @@ user) || !$this->user->can('laporan-admin-kredit.view')) { - //abort(403, 'Sorry! You are not allowed to view laporan admin kredit.'); - } - - // Retrieve data from the database - $query = Permohonan::query(); - $query = $query->where('status', 'done'); - - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = json_decode($request->get('search')); - - if (isset($search->start_date) || isset($search->end_date)) { - $query->whereBetween('tanggal_permohonan', [ - $search->start_date ?? '1900-01-01', - $search->end_date ?? now()->toDateString() - ]); - } - - // Filter by branch if provided - if (isset($search->branch_id) && !empty($search->branch_id)) { - $query->where('branch_id', $search->branch_id); - } - - if (isset($search->penilai_id) && !empty($search->penilai_id)) { - $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($search) { - $q->where('user_id', $search->penilai_id); - }); - } - - if (isset($search->search)) { - - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%'); - $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%'); - $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%'); - $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%'); - $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); - $q->orWhere('status', 'LIKE', '%' . $search->search . '%'); - }); - } - } - - // Apply sorting if provided - if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); - $column = $request->get('sortField'); - $query->orderBy($column, $order); - } - - // Get the total count of records - $totalRecords = $query->count(); - - // Apply pagination if provided - if ($request->has('page') && $request->has('size')) { - $page = $request->get('page'); - $size = $request->get('size'); - $offset = ($page - 1) * $size; // Calculate the offset - - $query->skip($offset)->take($size); - } - - // Get the filtered count of records - $filteredRecords = $query->count(); - - // Get the data for the current page - $data = $query->with(['debiture.branch'])->get(); - - $data = $data->map(function ($permohonan) { - $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; - // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_' - $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 [ - 'id' => $permohonan->id, - 'nomor_registrasi' => $permohonan->nomor_registrasi, - 'tanggal_permohonan' => $permohonan->tanggal_permohonan, - 'branch' => $permohonan->debiture?->branch?->name, - 'name' => $permohonan->debiture?->name, - 'pemohon' => $permohonan->creator?->name, - 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name, - 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '), - 'alamat_agunan' => $permohonan->documents?->map(function ($document) { - return formatAlamat($document); - })->unique()->implode(', '), - 'luas_tanah' => $luas_tanah . ' m²', - 'nilai_tanah' => formatRupiah($nilai_tanah,2), - 'luas_bangunan' => $luas_bangunan . ' m²', - 'nilai_bangunan' => formatRupiah($nilai_bangunan,2), - 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '', - 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '', - 'nilai_pasar_wajar' => formatRupiah($npw,2), - 'nilai_likuidasi' => formatRupiah($nilai_liquidasi,2), - 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name, - ]; - }); - - // Calculate the page count - $pageCount = ceil($totalRecords / $request->get('size')); - - // Calculate the current page number - $currentPage = $request->get('page', 1); - - // Return the response data as a JSON object - return response()->json([ - 'draw' => $request->get('draw'), - 'recordsTotal' => $totalRecords, - 'recordsFiltered' => $filteredRecords, - 'pageCount' => $pageCount, - 'page' => $currentPage, - 'totalCount' => $totalRecords, - 'data' => $data, - ]); - } - - public function export(Request $request) - { - return Excel::download(new LaporanPenilaianJaminanExport($request), 'laporan_penilaian_jaminan.xlsx'); - } + return view('lpj::laporan_penilaian_jaminan.index'); } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('laporan-admin-kredit.view')) { + //abort(403, 'Sorry! You are not allowed to view laporan admin kredit.'); + } + + // Retrieve data from the database + $query = Permohonan::query(); + $query = $query->where('status', 'done'); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = json_decode($request->get('search')); + + + if (!empty($search->start_date) || !empty($search->end_date)) { + $startDate = $search->start_date ?? '1900-01-01'; + $endDate = $search->end_date ?? now()->toDateString(); + + $query->where(function ($q) use ($startDate, $endDate) { + $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) { + $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]); + }) + ->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) { + $q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]); + }); + }); + } + + // Filter by branch if provided + if (isset($search->branch_id) && !empty($search->branch_id)) { + $query->where('branch_id', $search->branch_id); + } + + if (isset($search->penilai_id) && !empty($search->penilai_id)) { + $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($search) { + $q->where('user_id', $search->penilai_id); + }); + } + + if (isset($search->search)) { + + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%'); + $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search->search . '%'); + }); + } + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } + + // Get the total count of records + $totalRecords = $query->count(); + + // Apply pagination if provided + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->with(['debiture.branch'])->get(); + + $data = $data->map(function ($permohonan) { + $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; + // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_' + $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 [ + 'id' => $permohonan->id, + 'nomor_registrasi' => $permohonan->nomor_registrasi, + 'tanggal_permohonan' => $permohonan->tanggal_permohonan, + 'branch' => $permohonan->debiture?->branch?->name, + 'name' => $permohonan->debiture?->name, + 'pemohon' => $permohonan->creator?->name, + 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name, + 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '), + 'alamat_agunan' => $permohonan->documents?->map(function ($document) { + return formatAlamat($document); + })->unique()->implode(', '), + 'luas_tanah' => $luas_tanah . ' m²', + 'nilai_tanah' => formatRupiah($nilai_tanah, 2), + 'luas_bangunan' => $luas_bangunan . ' m²', + 'nilai_bangunan' => formatRupiah($nilai_bangunan, 2), + 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '', + 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '', + 'nilai_pasar_wajar' => formatRupiah($npw, 2), + 'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2), + 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name, + ]; + }); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = $request->get('page', 1); + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $data, + ]); + } + + public function export(Request $request) + { + $startDate = $request->start_date; + $endDate =$request->end_date; + // name of the file + $fileName = 'laporan_penilaian_jaminan_' . $startDate . '_' . $endDate . '.xlsx'; + return Excel::download(new LaporanPenilaianJaminanExport($request), $fileName); + } + + +}