diff --git a/app/Exports/SlikExport.php b/app/Exports/SlikExport.php new file mode 100644 index 0000000..fe5627a --- /dev/null +++ b/app/Exports/SlikExport.php @@ -0,0 +1,185 @@ +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 + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/SlikController.php b/app/Http/Controllers/SlikController.php index 99af83d..529490b 100644 --- a/app/Http/Controllers/SlikController.php +++ b/app/Http/Controllers/SlikController.php @@ -7,6 +7,7 @@ use Exception; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use Maatwebsite\Excel\Facades\Excel; +use Modules\Lpj\Exports\SlikExport; use Modules\Lpj\Imports\SlikImport; use Modules\Lpj\Models\Slik; use Illuminate\Support\Facades\Auth; @@ -439,35 +440,109 @@ class SlikController extends Controller } /** - * Hapus semua data slik - * - * @return \Illuminate\Http\RedirectResponse + * Export data SLIK ke Excel + * + * 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() { - DB::beginTransaction(); try { - Log::info('SlikController: Menghapus semua data Slik', [ - 'user_id' => Auth::id() + DB::beginTransaction(); + + Log::info('SLIK Truncate: Memulai proses truncate data SLIK', [ + 'user_id' => Auth::id(), + 'timestamp' => now() ]); - + + // Truncate tabel SLIK Slik::truncate(); - + 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.'); - - } catch (Exception $e) { + + return response()->json([ + 'success' => true, + 'message' => 'Semua data SLIK berhasil dihapus' + ]); + + } catch (\Exception $e) { DB::rollback(); - Log::error('SlikController: Gagal menghapus data Slik', [ + + Log::error('SLIK Truncate: Gagal menghapus data SLIK', [ '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); } } }