fix: update hasil laporan export dan controller
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|
||||||
|
return $query->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected $rowNumber = 0;
|
||||||
public function map($row): array
|
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);
|
||||||
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,245 +1,259 @@
|
|||||||
<?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;
|
||||||
|
|
||||||
|
public function __construct($request)
|
||||||
{
|
{
|
||||||
protected $request;
|
$this->request = $request;
|
||||||
|
|
||||||
public function __construct($request)
|
|
||||||
{
|
|
||||||
$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->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);
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 . '%')
|
|
||||||
->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%')
|
|
||||||
->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
|
|
||||||
|
|
||||||
if (!empty($paramsSearch->tanggal_awal) && !empty($paramsSearch->tanggal_akhir)) {
|
$query->where(function ($q) use ($startDate, $endDate) {
|
||||||
$q->whereBetween('tanggal_permohonan', [$paramsSearch->tanggal_awal, $paramsSearch->tanggal_akhir]);
|
$q->whereExists(function ($subQuery) use ($startDate, $endDate) {
|
||||||
}
|
$subQuery->select(DB::raw(1))
|
||||||
|
->from('penilaian')
|
||||||
|
->whereColumn('penilaian.nomor_registrasi', 'permohonan.nomor_registrasi')
|
||||||
$statusKeywords = explode(',', $search);
|
->whereBetween('penilaian.tanggal_kunjungan', [$startDate, $endDate]);
|
||||||
foreach ($statusKeywords as $keyword) {
|
})
|
||||||
$q->orWhereRelation('penilai', 'type_penilai', 'LIKE', '%' . trim($keyword) . '%');
|
->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
|
// 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,161 +1,177 @@
|
|||||||
<?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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
{
|
{
|
||||||
public $user;
|
return view('lpj::laporan_penilaian_jaminan.index');
|
||||||
|
|
||||||
/**
|
|
||||||
* Display a listing of the resource.
|
|
||||||
*/
|
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
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 (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');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user