fix: update hasil laporan export dan controller

This commit is contained in:
majid
2025-05-23 14:57:15 +07:00
parent f81cdbb50d
commit ec22e5f632
5 changed files with 783 additions and 586 deletions

View File

@@ -30,10 +30,20 @@ class LaporanHasilPenilaianJaminanInternalExternalExport implements FromCollecti
// Apply date range filter if provided // Apply date range filter if provided
if ($this->request->has('start_date') || $this->request->has('end_date')) { if ($this->request->has('start_date') || $this->request->has('end_date')) {
$query->whereBetween('tanggal_permohonan', [ $startDate = $this->request->start_date ?? '1900-01-01';
$this->request->start_date ?? '1900-01-01', $endDate = $this->request->end_date ?? now()->toDateString();
$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 // Apply branch filter if provided

View File

@@ -2,7 +2,8 @@
namespace Modules\Lpj\Exports; namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping; use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\ShouldAutoSize; use Maatwebsite\Excel\Concerns\ShouldAutoSize;
@@ -12,166 +13,296 @@ use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Helpers\Lpj; 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->request = $request;
$this->tanggalAkhir = $tanggalAkhir;
$this->status = $status;
$this->selectedIds = $selectedIds;
} }
public function query() public function collection()
{ {
$query = Permohonan::query() $query = Permohonan::query();
->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'inspeksi']); $query = $query->where('status', 'done');
// Filter by date range if provided // Apply date range filter if provided
if ($this->tanggalAwal && $this->tanggalAkhir) { if ($this->request->has('start_date') || $this->request->has('end_date')) {
$query->whereBetween('tanggal_permohonan', [$this->tanggalAwal, $this->tanggalAkhir]); $startDate = $this->request->start_date ?? '1900-01-01';
} $endDate = $this->request->end_date ?? now()->toDateString();
$query->where('status', 'done'); $query->where(function ($q) use ($startDate, $endDate) {
// Filter by status if provided
if ($this->status) { $q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) {
$types = is_array($this->status) ? $this->status : [$this->status]; $q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]);
$types = array_map('strtolower', $types); });
$query->whereHas('penilai', function (Builder $query) use ($types) {
$query->whereIn('type_penilai', $types); // 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 // Filter by selected IDs if provided
if ($this->selectedIds) { if ($this->request->has('selected_ids') && !empty($this->request->selected_ids)) {
$selectedIds = is_array($this->selectedIds) ? $this->selectedIds : explode(',', $this->selectedIds); $selectedIds = is_array($this->request->selected_ids) ? $this->request->selected_ids : explode(',', $this->request->selected_ids);
$query->whereIn('id', $selectedIds); $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');
public function map($row): array 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;
// ambil data alamat dari inspeksi if (isset($permohonan->penilai->lpj)) {
$alamat_inspeksi = null; $lpj = json_decode($permohonan->penilai->lpj, true);
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
if ($row->inspeksi) { $luas_tanah = $lpj['luas_tanah'] ?? 0;
$alamat_inspeksi = json_decode($row->inspeksi->data_form, true) ?? null; $luas_bangunan = $lpj['luas_bangunan'] ?? 0;
$alamat_inspeksi = $alamat_inspeksi['asset']['alamat']['sesuai'] ?? $alamat_inspeksi['asset']['alamat']['tidak sesuai'] ?? []; $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 [ return [
$row->id, $this->rowNumber,
$row->nomor_registrasi, $permohonan->nomor_registrasi,
$row->user->name, $permohonan->tanggal_permohonan ?? '',
$row->branch->name, $permohonan->debiture->branch->name ?? '',
$row->tujuanPenilaian->name, $permohonan->user->name ?? $permohonan->mig_nama_ao ?? '',
$row->debiture->name, $permohonan->debiture->cif ?? '',
$row->penilai->type_penilai ?? '-', $permohonan->debiture->name ?? '',
$alamat_inspeksi ?? '-', $permohonan->tujuanPenilaian->name,
$luasTanah, $permohonan->jenisPenilaian->name ?? '',
$luasBangunan, $permohonan->jenisFasilitasKredit->name,
$nilaiTanah1, $permohonan->documents->pluck('jenisJaminan.name')->unique()->implode(', '),
$nilaiBangunan1, $permohonan->documents->map(function ($document) {
$totalNilaiPasar, return formatAlamat($document);
$likuidasi, })->unique()->implode(', '),
$row->laporan->created_at ?? '-', $permohonan->documents->flatMap(function ($document) {
$user_penilai_name, return $document->detail->map(function ($detail) {
$nik_penilai, return (!empty($detail->dokumen_nomor) && is_array($detail->dokumen_nomor))
$row->created_at, ? ($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 public function headings(): array
{ {
return [ return [
'ID', 'No',
'Nomor Registrasi', 'Nomor Registrasi',
'User Pemohon', 'Tanggal Permohonan',
'Cabang', 'Cabang',
'Pemohon',
'CIF',
'Nama Debitur',
'Jenis Penilaian',
'Tujuan Penilaian', 'Tujuan Penilaian',
'Debitur', 'Jenis Fasilitas Kredit',
'Jenis Laporan', 'Jenis Agunan',
'Lokasi Jaminan', 'Alamat Agunan',
'Bukti Kepemilikan',
'Nama Pemilik',
'Luas Tanah', 'Luas Tanah',
'Nilai Tanah',
'Luas Bangunan', 'Luas Bangunan',
'Harga Tanah', 'Nilai Bangunan',
'Harga Bangunan', 'Nilai NJOP',
'Nilai Pasar Wajar', '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 Laporan',
'Tanggal Review',
'Nama Penilai', 'Nama Penilai',
'Nik Penilai', 'Nama Team Leader',
'Created At', '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 [ return [
'A' => NumberFormat::FORMAT_NUMBER, AfterSheet::class => function (AfterSheet $event) {
'C' => NumberFormat::FORMAT_DATE_DATETIME, // Get the sheet
'K' => NumberFormat::FORMAT_DATE_DATETIME, $sheet = $event->sheet->getDelegate();
'N' => NumberFormat::FORMAT_DATE_DATETIME
// 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);
},
]; ];
} }
} }

View File

@@ -1,21 +1,21 @@
<?php <?php
namespace Modules\Lpj\Exports; namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping; use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithTitle; use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\WithCustomStartCell; use Maatwebsite\Excel\Concerns\WithCustomStartCell;
use Maatwebsite\Excel\Concerns\WithEvents; use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet; use Maatwebsite\Excel\Events\AfterSheet;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Branch; use Modules\Lpj\Models\Branch;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Carbon\Carbon; use Carbon\Carbon;
class LaporanPenilaianJaminanExport implements FromCollection, WithHeadings, WithMapping, WithTitle, WithCustomStartCell, WithEvents class LaporanPenilaianJaminanExport implements FromCollection, WithHeadings, WithMapping, WithTitle, WithCustomStartCell, WithEvents
{ {
protected $request; protected $request;
public function __construct($request) public function __construct($request)
@@ -30,10 +30,22 @@
// Apply date range filter if provided // Apply date range filter if provided
if ($this->request->has('start_date') || $this->request->has('end_date')) { if ($this->request->has('start_date') || $this->request->has('end_date')) {
$query->whereBetween('tanggal_permohonan', [
$this->request->start_date ?? '1900-01-01', $startDate = $this->request->start_date ?? '1900-01-01';
$this->request->end_date ?? now()->toDateString() $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 // Apply branch filter if provided
@@ -43,7 +55,7 @@
if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) { if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) {
$request = $this->request; // Store in a local variable $request = $this->request; // Store in a local variable
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($request) { $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($request) {
$q->where('user_id', $request->penilai_id); $q->where('user_id', $request->penilai_id);
}); });
} }
@@ -66,6 +78,8 @@
// Default ordering // Default ordering
$query->orderBy('nomor_registrasi', 'asc'); $query->orderBy('nomor_registrasi', 'asc');
dd($query->toSql(), $query->getBindings());
return $query->with(['debiture.branch'])->get(); return $query->with(['debiture.branch'])->get();
} }
@@ -164,7 +178,7 @@
public function registerEvents(): array public function registerEvents(): array
{ {
return [ return [
AfterSheet::class => function(AfterSheet $event) { AfterSheet::class => function (AfterSheet $event) {
// Get the sheet // Get the sheet
$sheet = $event->sheet->getDelegate(); $sheet = $event->sheet->getDelegate();
@@ -226,7 +240,7 @@
->getStartColor()->setARGB('FFCCCCCC'); ->getStartColor()->setARGB('FFCCCCCC');
// Auto-size columns // Auto-size columns
foreach(range('A', $sheet->getHighestColumn()) as $column) { foreach (range('A', $sheet->getHighestColumn()) as $column) {
$sheet->getColumnDimension($column)->setAutoSize(true); $sheet->getColumnDimension($column)->setAutoSize(true);
} }
@@ -242,4 +256,4 @@
}, },
]; ];
} }
} }

View File

@@ -9,6 +9,7 @@ use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Exports\LaporanPenilaiJaminanExport; use Modules\Lpj\Exports\LaporanPenilaiJaminanExport;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Models\Branch;
class LaporanPenilaiJaminanController extends Controller class LaporanPenilaiJaminanController extends Controller
{ {
@@ -22,21 +23,6 @@ class LaporanPenilaiJaminanController extends Controller
return view('lpj::laporan-penilai-jaminan.index', compact('status_permohonan')); 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. * Show the specified resource.
@@ -46,29 +32,6 @@ class LaporanPenilaiJaminanController extends Controller
return view('lpj::laporan-penilai-jaminan.show'); 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) public function dataForDatatables(Request $request)
{ {
@@ -93,34 +56,63 @@ class LaporanPenilaiJaminanController extends Controller
// dd($startDate); // dd($startDate);
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query(); $query = Permohonan::query();
$query = $query->orderBy('nomor_registrasi', 'desc'); $query = $query->where('status', 'done')->orderBy('tanggal_permohonan', 'desc');
// Apply search filter if provided // Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = json_decode($request->get('search'));
$paramsSearch = json_decode($search);
$query->where(function ($q) use ($search) { if (!empty($search->start_date) || !empty($search->end_date)) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%') $startDate = $search->start_date ?? '1900-01-01';
->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%') $endDate = $search->end_date ?? now()->toDateString();
->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%')
->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%') $query->where(function ($q) use ($startDate, $endDate) {
->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%') $q->whereExists(function ($subQuery) use ($startDate, $endDate) {
->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); $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 (!empty($paramsSearch->tanggal_awal) && !empty($paramsSearch->tanggal_akhir)) {
$q->whereBetween('tanggal_permohonan', [$paramsSearch->tanggal_awal, $paramsSearch->tanggal_akhir]);
} }
$statusKeywords = explode(',', $search); if (isset($search->branch_id) && !empty($search->branch_id)) {
foreach ($statusKeywords as $keyword) { $query->where('branch_id', $search->branch_id);
$q->orWhereRelation('penilai', 'type_penilai', 'LIKE', '%' . trim($keyword) . '%');
} }
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 . '%');
}); });
} }
$query->where('status', 'done'); }
// 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 . '%');
});
}
}
// Apply sorting if provided // Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
@@ -132,10 +124,6 @@ class LaporanPenilaiJaminanController extends Controller
// Get the total count of records // Get the total count of records
$totalRecords = $query->count(); $totalRecords = $query->count();
$size = $request->get('size', 10);
if ($size == 0) {
$size = 10;
}
// Apply pagination if provided // Apply pagination if provided
if ($request->has('page') && $request->has('size')) { if ($request->has('page') && $request->has('size')) {
@@ -151,7 +139,7 @@ class LaporanPenilaiJaminanController extends Controller
// Get data with necessary relationships // 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 // Calculate the page count
$pageCount = ceil($totalRecords / $size); $pageCount = ceil($totalRecords / $size);
@@ -173,15 +161,53 @@ class LaporanPenilaiJaminanController extends Controller
public function export(Request $request) public function export(Request $request)
{ {
$tanggalAwal = $request->input('tanggal_awal'); $startDate = $request->input('start_date');
$tanggalAkhir = $request->input('tanggal_akhir'); $endDate = $request->input('end_date');
$status = $request->input('status');
$selectedIds = $request->input('selected_ids'); // 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( return Excel::download(
new LaporanPenilaiJaminanExport($tanggalAwal, $tanggalAkhir, $status, $selectedIds), new LaporanPenilaiJaminanExport($request),
$filename $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;
}
} }

View File

@@ -1,15 +1,17 @@
<?php <?php
namespace Modules\Lpj\Http\Controllers; namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Modules\Lpj\Exports\LaporanPenilaianJaminanExport; use Modules\Lpj\Exports\LaporanPenilaianJaminanExport;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\PenawaranTender;
use Maatwebsite\Excel\Facades\Excel;
class LaporanPenilaianJaminanController extends Controller class LaporanPenilaianJaminanController extends Controller
{ {
public $user; public $user;
/** /**
@@ -34,11 +36,19 @@
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = json_decode($request->get('search')); $search = json_decode($request->get('search'));
if (isset($search->start_date) || isset($search->end_date)) {
$query->whereBetween('tanggal_permohonan', [ if (!empty($search->start_date) || !empty($search->end_date)) {
$search->start_date ?? '1900-01-01', $startDate = $search->start_date ?? '1900-01-01';
$search->end_date ?? now()->toDateString() $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 // Filter by branch if provided
@@ -47,7 +57,7 @@
} }
if (isset($search->penilai_id) && !empty($search->penilai_id)) { if (isset($search->penilai_id) && !empty($search->penilai_id)) {
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($search) { $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($search) {
$q->where('user_id', $search->penilai_id); $q->where('user_id', $search->penilai_id);
}); });
} }
@@ -125,13 +135,13 @@
return formatAlamat($document); return formatAlamat($document);
})->unique()->implode(', '), })->unique()->implode(', '),
'luas_tanah' => $luas_tanah . ' m²', 'luas_tanah' => $luas_tanah . ' m²',
'nilai_tanah' => formatRupiah($nilai_tanah,2), 'nilai_tanah' => formatRupiah($nilai_tanah, 2),
'luas_bangunan' => $luas_bangunan . ' m²', 'luas_bangunan' => $luas_bangunan . ' m²',
'nilai_bangunan' => formatRupiah($nilai_bangunan,2), 'nilai_bangunan' => formatRupiah($nilai_bangunan, 2),
'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '', 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '', 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
'nilai_pasar_wajar' => formatRupiah($npw,2), 'nilai_pasar_wajar' => formatRupiah($npw, 2),
'nilai_likuidasi' => formatRupiah($nilai_liquidasi,2), 'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2),
'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name, 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
]; ];
}); });
@@ -156,6 +166,12 @@
public function export(Request $request) public function export(Request $request)
{ {
return Excel::download(new LaporanPenilaianJaminanExport($request), 'laporan_penilaian_jaminan.xlsx'); $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);
} }
}