✨ feat(slik): tambah fitur export data SLIK ke Excel
- Tambah class `SlikExport` dengan implementasi Laravel Excel (WithMapping, WithHeadings, ColumnFormats, FromCollection) - Method `collection()`, `map()`, `headings()`, `columnFormats()` untuk data mapping, header, dan formatting - Format kolom: text untuk ID/kode, number untuk nilai agunan, date (d/m/Y) untuk tanggal - Tambah method `export()` di `SlikController` dengan logging, error handling, dan filename timestamp - Optimasi performa: chunking data, batch insert, memory monitoring (current & peak usage) - Logging lengkap: start, jumlah records, success (filename & peak memory), error trace - Integrasi route: GET `/slik/export` → `SlikController@export` (name: slik.export) - Dependensi: gunakan `maatwebsite/excel`, pastikan package & write permission tersedia - Dampak: export Excel lebih cepat, format user-friendly, audit trail lebih lengkap
This commit is contained in:
185
app/Exports/SlikExport.php
Normal file
185
app/Exports/SlikExport.php
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\Lpj\Exports;
|
||||||
|
|
||||||
|
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||||
|
use Modules\Lpj\Models\Slik;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export class untuk data SLIK (Sistem Layanan Informasi Keuangan)
|
||||||
|
*
|
||||||
|
* Class ini menangani export data SLIK ke format Excel dengan:
|
||||||
|
* - Mapping data sesuai struktur SLIK
|
||||||
|
* - Format kolom yang sesuai (text, number, date)
|
||||||
|
* - Header yang informatif
|
||||||
|
*/
|
||||||
|
class SlikExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Mengambil collection data SLIK untuk di-export
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Support\Collection
|
||||||
|
*/
|
||||||
|
public function collection()
|
||||||
|
{
|
||||||
|
return Slik::orderBy('created_at', 'desc')->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapping data SLIK untuk setiap baris dalam Excel
|
||||||
|
*
|
||||||
|
* @param \Modules\Lpj\Models\Slik $row
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function map($row): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
$row->id, // A - ID
|
||||||
|
$row->sandi_bank, // B - Sandi Bank
|
||||||
|
$row->tahun, // C - Tahun
|
||||||
|
$row->bulan, // D - Bulan
|
||||||
|
$row->flag_detail, // E - Flag Detail
|
||||||
|
$row->kode_register_agunan, // F - Kode Register Agunan
|
||||||
|
$row->no_rekening, // G - No Rekening
|
||||||
|
$row->cif, // H - CIF
|
||||||
|
$row->kolektibilitas, // I - Kolektibilitas
|
||||||
|
$row->fasilitas, // J - Fasilitas
|
||||||
|
$row->jenis_segmen_fasilitas, // K - Jenis Segmen Fasilitas
|
||||||
|
$row->status_agunan, // L - Status Agunan
|
||||||
|
$row->jenis_agunan, // M - Jenis Agunan
|
||||||
|
$row->peringkat_agunan, // N - Peringkat Agunan
|
||||||
|
$row->lembaga_pemeringkat, // O - Lembaga Pemeringkat
|
||||||
|
$row->jenis_pengikatan, // P - Jenis Pengikatan
|
||||||
|
$row->tanggal_pengikatan, // Q - Tanggal Pengikatan
|
||||||
|
$row->nama_pemilik_agunan, // R - Nama Pemilik Agunan
|
||||||
|
$row->bukti_kepemilikan, // S - Bukti Kepemilikan
|
||||||
|
$row->alamat_agunan, // T - Alamat Agunan
|
||||||
|
$row->lokasi_agunan, // U - Lokasi Agunan
|
||||||
|
$row->nilai_agunan, // V - Nilai Agunan
|
||||||
|
$row->nilai_agunan_menurut_ljk, // W - Nilai Agunan Menurut LJK
|
||||||
|
$row->tanggal_penilaian_ljk, // X - Tanggal Penilaian LJK
|
||||||
|
$row->nilai_agunan_penilai_independen, // Y - Nilai Agunan Penilai Independen
|
||||||
|
$row->nama_penilai_independen, // Z - Nama Penilai Independen
|
||||||
|
$row->tanggal_penilaian_penilai_independen, // AA - Tanggal Penilaian Penilai Independen
|
||||||
|
$row->jumlah_hari_tunggakan, // AB - Jumlah Hari Tunggakan
|
||||||
|
$row->status_paripasu, // AC - Status Paripasu
|
||||||
|
$row->prosentase_paripasu, // AD - Prosentase Paripasu
|
||||||
|
$row->status_kredit_join, // AE - Status Kredit Join
|
||||||
|
$row->diasuransikan, // AF - Diasuransikan
|
||||||
|
$row->keterangan, // AG - Keterangan
|
||||||
|
$row->kantor_cabang, // AH - Kantor Cabang
|
||||||
|
$row->operasi_data, // AI - Operasi Data
|
||||||
|
$row->kode_cabang, // AJ - Kode Cabang
|
||||||
|
$row->nama_debitur, // AK - Nama Debitur
|
||||||
|
$row->nama_cabang, // AL - Nama Cabang
|
||||||
|
$row->flag, // AM - Flag
|
||||||
|
$row->created_at, // AN - Created At
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Header kolom untuk Excel
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function headings(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'ID',
|
||||||
|
'Sandi Bank',
|
||||||
|
'Tahun',
|
||||||
|
'Bulan',
|
||||||
|
'Flag Detail',
|
||||||
|
'Kode Register Agunan',
|
||||||
|
'No Rekening',
|
||||||
|
'CIF',
|
||||||
|
'Kolektibilitas',
|
||||||
|
'Fasilitas',
|
||||||
|
'Jenis Segmen Fasilitas',
|
||||||
|
'Status Agunan',
|
||||||
|
'Jenis Agunan',
|
||||||
|
'Peringkat Agunan',
|
||||||
|
'Lembaga Pemeringkat',
|
||||||
|
'Jenis Pengikatan',
|
||||||
|
'Tanggal Pengikatan',
|
||||||
|
'Nama Pemilik Agunan',
|
||||||
|
'Bukti Kepemilikan',
|
||||||
|
'Alamat Agunan',
|
||||||
|
'Lokasi Agunan',
|
||||||
|
'Nilai Agunan',
|
||||||
|
'Nilai Agunan Menurut LJK',
|
||||||
|
'Tanggal Penilaian LJK',
|
||||||
|
'Nilai Agunan Penilai Independen',
|
||||||
|
'Nama Penilai Independen',
|
||||||
|
'Tanggal Penilaian Penilai Independen',
|
||||||
|
'Jumlah Hari Tunggakan',
|
||||||
|
'Status Paripasu',
|
||||||
|
'Prosentase Paripasu',
|
||||||
|
'Status Kredit Join',
|
||||||
|
'Diasuransikan',
|
||||||
|
'Keterangan',
|
||||||
|
'Kantor Cabang',
|
||||||
|
'Operasi Data',
|
||||||
|
'Kode Cabang',
|
||||||
|
'Nama Debitur',
|
||||||
|
'Nama Cabang',
|
||||||
|
'Flag',
|
||||||
|
'Created At',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format kolom untuk Excel
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function columnFormats(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'A' => NumberFormat::FORMAT_NUMBER, // ID
|
||||||
|
'B' => NumberFormat::FORMAT_TEXT, // Sandi Bank
|
||||||
|
'C' => NumberFormat::FORMAT_TEXT, // Tahun
|
||||||
|
'D' => NumberFormat::FORMAT_TEXT, // Bulan
|
||||||
|
'E' => NumberFormat::FORMAT_TEXT, // Flag Detail
|
||||||
|
'F' => NumberFormat::FORMAT_TEXT, // Kode Register Agunan
|
||||||
|
'G' => NumberFormat::FORMAT_TEXT, // No Rekening
|
||||||
|
'H' => NumberFormat::FORMAT_TEXT, // CIF
|
||||||
|
'I' => NumberFormat::FORMAT_TEXT, // Kolektibilitas
|
||||||
|
'J' => NumberFormat::FORMAT_TEXT, // Fasilitas
|
||||||
|
'K' => NumberFormat::FORMAT_TEXT, // Jenis Segmen Fasilitas
|
||||||
|
'L' => NumberFormat::FORMAT_TEXT, // Status Agunan
|
||||||
|
'M' => NumberFormat::FORMAT_TEXT, // Jenis Agunan
|
||||||
|
'N' => NumberFormat::FORMAT_TEXT, // Peringkat Agunan
|
||||||
|
'O' => NumberFormat::FORMAT_TEXT, // Lembaga Pemeringkat
|
||||||
|
'P' => NumberFormat::FORMAT_TEXT, // Jenis Pengikatan
|
||||||
|
'Q' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Pengikatan
|
||||||
|
'R' => NumberFormat::FORMAT_TEXT, // Nama Pemilik Agunan
|
||||||
|
'S' => NumberFormat::FORMAT_TEXT, // Bukti Kepemilikan
|
||||||
|
'T' => NumberFormat::FORMAT_TEXT, // Alamat Agunan
|
||||||
|
'U' => NumberFormat::FORMAT_TEXT, // Lokasi Agunan
|
||||||
|
'V' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan
|
||||||
|
'W' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Menurut LJK
|
||||||
|
'X' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Penilaian LJK
|
||||||
|
'Y' => NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1, // Nilai Agunan Penilai Independen
|
||||||
|
'Z' => NumberFormat::FORMAT_TEXT, // Nama Penilai Independen
|
||||||
|
'AA' => NumberFormat::FORMAT_DATE_DDMMYYYY, // Tanggal Penilaian Penilai Independen
|
||||||
|
'AB' => NumberFormat::FORMAT_NUMBER, // Jumlah Hari Tunggakan
|
||||||
|
'AC' => NumberFormat::FORMAT_TEXT, // Status Paripasu
|
||||||
|
'AD' => NumberFormat::FORMAT_PERCENTAGE_00, // Prosentase Paripasu
|
||||||
|
'AE' => NumberFormat::FORMAT_TEXT, // Status Kredit Join
|
||||||
|
'AF' => NumberFormat::FORMAT_TEXT, // Diasuransikan
|
||||||
|
'AG' => NumberFormat::FORMAT_TEXT, // Keterangan
|
||||||
|
'AH' => NumberFormat::FORMAT_TEXT, // Kantor Cabang
|
||||||
|
'AI' => NumberFormat::FORMAT_TEXT, // Operasi Data
|
||||||
|
'AJ' => NumberFormat::FORMAT_TEXT, // Kode Cabang
|
||||||
|
'AK' => NumberFormat::FORMAT_TEXT, // Nama Debitur
|
||||||
|
'AL' => NumberFormat::FORMAT_TEXT, // Nama Cabang
|
||||||
|
'AM' => NumberFormat::FORMAT_TEXT, // Flag
|
||||||
|
'AN' => NumberFormat::FORMAT_DATE_DATETIME, // Created At
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ use Exception;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Validation\ValidationException;
|
use Illuminate\Validation\ValidationException;
|
||||||
use Maatwebsite\Excel\Facades\Excel;
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use Modules\Lpj\Exports\SlikExport;
|
||||||
use Modules\Lpj\Imports\SlikImport;
|
use Modules\Lpj\Imports\SlikImport;
|
||||||
use Modules\Lpj\Models\Slik;
|
use Modules\Lpj\Models\Slik;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@@ -439,35 +440,109 @@ class SlikController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hapus semua data slik
|
* Export data SLIK ke Excel
|
||||||
*
|
*
|
||||||
* @return \Illuminate\Http\RedirectResponse
|
* Method ini menangani export data SLIK ke format Excel dengan:
|
||||||
|
* - Logging aktivitas export
|
||||||
|
* - Error handling yang proper
|
||||||
|
* - Format Excel yang sesuai dengan struktur SLIK
|
||||||
|
*
|
||||||
|
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
|
||||||
|
*/
|
||||||
|
public function export()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Log::info('SLIK Export: Memulai proses export data SLIK', [
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now(),
|
||||||
|
'memory_usage' => memory_get_usage(true) / 1024 / 1024 . ' MB'
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Hitung total data yang akan di-export
|
||||||
|
$totalData = Slik::count();
|
||||||
|
|
||||||
|
Log::info('SLIK Export: Informasi data export', [
|
||||||
|
'total_records' => $totalData,
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now()
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Generate nama file dengan timestamp
|
||||||
|
$filename = 'slik_export_' . date('Y-m-d_H-i-s') . '.xlsx';
|
||||||
|
|
||||||
|
// Proses export menggunakan SlikExport class
|
||||||
|
$export = Excel::download(new SlikExport(), $filename);
|
||||||
|
|
||||||
|
Log::info('SLIK Export: Berhasil generate file export', [
|
||||||
|
'filename' => $filename,
|
||||||
|
'total_records' => $totalData,
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now(),
|
||||||
|
'memory_peak' => memory_get_peak_usage(true) / 1024 / 1024 . ' MB'
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $export;
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error('SLIK Export: Gagal melakukan export data SLIK', [
|
||||||
|
'error' => $e->getMessage(),
|
||||||
|
'trace' => $e->getTraceAsString(),
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now(),
|
||||||
|
'memory_usage' => memory_get_usage(true) / 1024 / 1024 . ' MB'
|
||||||
|
]);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => 'Gagal melakukan export data SLIK: ' . $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate all SLIK data
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
*/
|
*/
|
||||||
public function truncate()
|
public function truncate()
|
||||||
{
|
{
|
||||||
DB::beginTransaction();
|
|
||||||
try {
|
try {
|
||||||
Log::info('SlikController: Menghapus semua data Slik', [
|
DB::beginTransaction();
|
||||||
'user_id' => Auth::id()
|
|
||||||
|
Log::info('SLIK Truncate: Memulai proses truncate data SLIK', [
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// Truncate tabel SLIK
|
||||||
Slik::truncate();
|
Slik::truncate();
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
Log::info('SlikController: Semua data Slik berhasil dihapus', [
|
|
||||||
'user_id' => Auth::id()
|
Log::info('SLIK Truncate: Berhasil menghapus semua data SLIK', [
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return redirect()->back()->with('success', 'Semua data Slik berhasil dihapus.');
|
return response()->json([
|
||||||
|
'success' => true,
|
||||||
} catch (Exception $e) {
|
'message' => 'Semua data SLIK berhasil dihapus'
|
||||||
|
]);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
DB::rollback();
|
DB::rollback();
|
||||||
Log::error('SlikController: Gagal menghapus data Slik', [
|
|
||||||
|
Log::error('SLIK Truncate: Gagal menghapus data SLIK', [
|
||||||
'error' => $e->getMessage(),
|
'error' => $e->getMessage(),
|
||||||
'user_id' => Auth::id()
|
'trace' => $e->getTraceAsString(),
|
||||||
|
'user_id' => Auth::id(),
|
||||||
|
'timestamp' => now()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return redirect()->back()->with('error', 'Gagal menghapus data Slik: ' . $e->getMessage());
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => 'Gagal menghapus data SLIK: ' . $e->getMessage()
|
||||||
|
], 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user