Compare commits
4 Commits
41262e0317
...
6d137ad51c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d137ad51c | ||
|
|
6c004812a9 | ||
|
|
d932559849 | ||
|
|
c3c40fdc27 |
117
app/Exports/LaporanSlikExport.php
Normal file
117
app/Exports/LaporanSlikExport.php
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\Lpj\Exports;
|
||||||
|
|
||||||
|
use Maatwebsite\Excel\Concerns\FromQuery;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||||
|
use Maatwebsite\Excel\Concerns\WithStyles;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||||
|
|
||||||
|
class LaporanSlikExport implements FromQuery, WithHeadings, WithMapping, WithStyles
|
||||||
|
{
|
||||||
|
protected $query;
|
||||||
|
|
||||||
|
public function __construct($query)
|
||||||
|
{
|
||||||
|
$this->query = $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function query()
|
||||||
|
{
|
||||||
|
return $this->query;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function headings(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'Sandi Bank',
|
||||||
|
'Kode Kantor',
|
||||||
|
'Kode Cabang',
|
||||||
|
'Tahun',
|
||||||
|
'Bulan',
|
||||||
|
'No Rekening',
|
||||||
|
'CIF',
|
||||||
|
'Nama Debitur',
|
||||||
|
'NPWP',
|
||||||
|
'No KTP',
|
||||||
|
'No Telp',
|
||||||
|
'Alamat',
|
||||||
|
'Kode Pos',
|
||||||
|
'Kode Kab/Kota',
|
||||||
|
'Kode Negara Domisili',
|
||||||
|
'Kode Jenis',
|
||||||
|
'Kode Sifat',
|
||||||
|
'Kode Valuta',
|
||||||
|
'Baki Debet',
|
||||||
|
'Kolektibilitas',
|
||||||
|
'Tanggal Mulai',
|
||||||
|
'Tanggal Jatuh Tempo',
|
||||||
|
'Tanggal Selesai',
|
||||||
|
'Tanggal Restrukturisasi',
|
||||||
|
'Kode Sebab Macet',
|
||||||
|
'Tanggal Macet',
|
||||||
|
'Kode Kondisi',
|
||||||
|
'Tanggal Kondisi',
|
||||||
|
'Nilai Agunan',
|
||||||
|
'Jenis Agunan',
|
||||||
|
'Kode Agunan',
|
||||||
|
'Peringkat Agunan',
|
||||||
|
'Fasilitas',
|
||||||
|
'Status Agunan',
|
||||||
|
'Tanggal Lapor',
|
||||||
|
'Status',
|
||||||
|
'Tanggal Dibuat',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function map($laporanSlik): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
$laporanSlik->sandi_bank,
|
||||||
|
$laporanSlik->kode_kantor,
|
||||||
|
$laporanSlik->kode_cabang,
|
||||||
|
$laporanSlik->tahun,
|
||||||
|
$laporanSlik->bulan,
|
||||||
|
$laporanSlik->no_rekening,
|
||||||
|
$laporanSlik->cif,
|
||||||
|
$laporanSlik->nama_debitur,
|
||||||
|
$laporanSlik->npwp,
|
||||||
|
$laporanSlik->no_ktp,
|
||||||
|
$laporanSlik->no_telp,
|
||||||
|
$laporanSlik->alamat,
|
||||||
|
$laporanSlik->kode_pos,
|
||||||
|
$laporanSlik->kode_kab_kota,
|
||||||
|
$laporanSlik->kode_negara_domisili,
|
||||||
|
$laporanSlik->kode_jenis,
|
||||||
|
$laporanSlik->kode_sifat,
|
||||||
|
$laporanSlik->kode_valuta,
|
||||||
|
$laporanSlik->baki_debet,
|
||||||
|
$laporanSlik->kolektibilitas,
|
||||||
|
$laporanSlik->tanggal_mulai,
|
||||||
|
$laporanSlik->tanggal_jatuh_tempo,
|
||||||
|
$laporanSlik->tanggal_selesai,
|
||||||
|
$laporanSlik->tanggal_restrukturisasi,
|
||||||
|
$laporanSlik->kode_sebab_macet,
|
||||||
|
$laporanSlik->tanggal_macet,
|
||||||
|
$laporanSlik->kode_kondisi,
|
||||||
|
$laporanSlik->tanggal_kondisi,
|
||||||
|
$laporanSlik->nilai_agunan,
|
||||||
|
$laporanSlik->jenis_agunan,
|
||||||
|
$laporanSlik->kode_agunan,
|
||||||
|
$laporanSlik->peringkat_agunan,
|
||||||
|
$laporanSlik->fasilitas,
|
||||||
|
$laporanSlik->status_agunan,
|
||||||
|
$laporanSlik->tanggal_lapor,
|
||||||
|
$laporanSlik->status,
|
||||||
|
$laporanSlik->created_at->format('d/m/Y H:i'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function styles(Worksheet $sheet)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
1 => ['font' => ['bold' => true]],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
304
app/Http/Controllers/LaporanSlikController.php
Normal file
304
app/Http/Controllers/LaporanSlikController.php
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\Lpj\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
|
use Modules\Lpj\Models\LaporanSlik;
|
||||||
|
use Modules\Lpj\Models\Slik;
|
||||||
|
use Modules\Lpj\Exports\LaporanSlikExport;
|
||||||
|
|
||||||
|
class LaporanSlikController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('lpj::laporan-slik.index');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$request->validate([
|
||||||
|
'slik_id' => 'required|exists:sliks,id'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$slik = Slik::findOrFail($request->slik_id);
|
||||||
|
|
||||||
|
// Cek apakah data sudah ada di laporan_slik
|
||||||
|
$existing = LaporanSlik::where('slik_id', $slik->id)->first();
|
||||||
|
if ($existing) {
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => 'Data sudah ada di laporan SLIK'
|
||||||
|
], 422);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy data dari tabel slik ke laporan_slik
|
||||||
|
$laporanSlik = LaporanSlik::create([
|
||||||
|
'slik_id' => $slik->id,
|
||||||
|
'sandi_bank' => $slik->sandi_bank,
|
||||||
|
'kode_kantor' => $slik->kode_kantor,
|
||||||
|
'kode_cabang' => $slik->kode_cabang,
|
||||||
|
'tahun' => $slik->tahun,
|
||||||
|
'bulan' => $slik->bulan,
|
||||||
|
'no_rekening' => $slik->no_rekening,
|
||||||
|
'cif' => $slik->cif,
|
||||||
|
'kode_jenis' => $slik->kode_jenis,
|
||||||
|
'kode_jenis_ket' => $slik->kode_jenis_ket,
|
||||||
|
'kode_sifat' => $slik->kode_sifat,
|
||||||
|
'kode_sifat_ket' => $slik->kode_sifat_ket,
|
||||||
|
'kode_valuta' => $slik->kode_valuta,
|
||||||
|
'kode_valuta_ket' => $slik->kode_valuta_ket,
|
||||||
|
'baki_debet' => $slik->baki_debet,
|
||||||
|
'kolektibilitas' => $slik->kolektibilitas,
|
||||||
|
'kolektibilitas_ket' => $slik->kolektibilitas_ket,
|
||||||
|
'tanggal_mulai' => $slik->tanggal_mulai,
|
||||||
|
'tanggal_jatuh_tempo' => $slik->tanggal_jatuh_tempo,
|
||||||
|
'tanggal_selesai' => $slik->tanggal_selesai,
|
||||||
|
'tanggal_restrukturisasi' => $slik->tanggal_restrukturisasi,
|
||||||
|
'kode_sebab_macet' => $slik->kode_sebab_macet,
|
||||||
|
'kode_sebab_macet_ket' => $slik->kode_sebab_macet_ket,
|
||||||
|
'tanggal_macet' => $slik->tanggal_macet,
|
||||||
|
'kode_kondisi' => $slik->kode_kondisi,
|
||||||
|
'kode_kondisi_ket' => $slik->kode_kondisi_ket,
|
||||||
|
'tanggal_kondisi' => $slik->tanggal_kondisi,
|
||||||
|
'nilai_agunan' => $slik->nilai_agunan,
|
||||||
|
'nilai_agunan_ket' => $slik->nilai_agunan_ket,
|
||||||
|
'jenis_agunan' => $slik->jenis_agunan,
|
||||||
|
'kode_agunan' => $slik->kode_agunan,
|
||||||
|
'kode_agunan_ket' => $slik->kode_agunan_ket,
|
||||||
|
'peringkat_agunan' => $slik->peringkat_agunan,
|
||||||
|
'peringkat_agunan_ket' => $slik->peringkat_agunan_ket,
|
||||||
|
'nama_debitur' => $slik->nama_debitur,
|
||||||
|
'npwp' => $slik->npwp,
|
||||||
|
'no_ktp' => $slik->no_ktp,
|
||||||
|
'no_telp' => $slik->no_telp,
|
||||||
|
'kode_kab_kota' => $slik->kode_kab_kota,
|
||||||
|
'kode_kab_kota_ket' => $slik->kode_kab_kota_ket,
|
||||||
|
'kode_negara_domisili' => $slik->kode_negara_domisili,
|
||||||
|
'kode_negara_domisili_ket' => $slik->kode_negara_domisili_ket,
|
||||||
|
'kode_pos' => $slik->kode_pos,
|
||||||
|
'alamat' => $slik->alamat,
|
||||||
|
'fasilitas' => $slik->fasilitas,
|
||||||
|
'status_agunan' => $slik->status_agunan,
|
||||||
|
'tanggal_lapor' => $slik->tanggal_lapor,
|
||||||
|
'status' => 'active',
|
||||||
|
'created_by' => auth()->id(),
|
||||||
|
'updated_by' => auth()->id(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Hapus data dari tabel slik setelah berhasil dipindahkan
|
||||||
|
$slik->delete();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'Data berhasil dipindahkan ke laporan SLIK',
|
||||||
|
'data' => $laporanSlik
|
||||||
|
]);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error('Error moving SLIK to laporan: ' . $e->getMessage());
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => 'Terjadi kesalahan saat memindahkan data'
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data untuk datatables dengan server-side processing
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @return \Illuminate\Http\JsonResponse
|
||||||
|
*/
|
||||||
|
public function dataForDatatables(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Retrieve data from the database
|
||||||
|
$query = LaporanSlik::query();
|
||||||
|
|
||||||
|
// Apply search filter if provided
|
||||||
|
if ($request->has('search') && !empty($request->get('search'))) {
|
||||||
|
$search = $request->get('search');
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where('sandi_bank', 'LIKE', "%$search%")
|
||||||
|
->orWhere('no_rekening', 'LIKE', "%$search%")
|
||||||
|
->orWhere('cif', 'LIKE', "%$search%")
|
||||||
|
->orWhere('nama_debitur', 'LIKE', "%$search%")
|
||||||
|
->orWhere('fasilitas', 'LIKE', "%$search%")
|
||||||
|
->orWhere('status_agunan', 'LIKE', "%$search%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply year filter
|
||||||
|
if ($request->has('year') && !empty($request->get('year'))) {
|
||||||
|
$query->where('tahun', $request->get('year'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply month filter
|
||||||
|
if ($request->has('month') && !empty($request->get('month'))) {
|
||||||
|
$query->where('bulan', $request->get('month'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply sandi bank filter
|
||||||
|
if ($request->has('sandi_bank') && !empty($request->get('sandi_bank'))) {
|
||||||
|
$query->where('sandi_bank', $request->get('sandi_bank'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply kolektibilitas filter
|
||||||
|
if ($request->has('kolektibilitas') && !empty($request->get('kolektibilitas'))) {
|
||||||
|
$query->where('kolektibilitas', $request->get('kolektibilitas'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply status filter
|
||||||
|
if ($request->has('status') && !empty($request->get('status'))) {
|
||||||
|
$query->where('status', $request->get('status'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply sorting if provided
|
||||||
|
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
|
||||||
|
$order = $request->get('sortOrder');
|
||||||
|
$column = $request->get('sortField', 'created_at');
|
||||||
|
$query->orderBy($column, $order);
|
||||||
|
} else {
|
||||||
|
$query->orderBy('created_at', 'desc');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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->get();
|
||||||
|
|
||||||
|
// Transform data untuk datatables
|
||||||
|
$transformedData = $data->map(function ($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->id,
|
||||||
|
'sandi_bank' => $item->sandi_bank,
|
||||||
|
'tahun' => $item->tahun,
|
||||||
|
'bulan' => $item->bulan,
|
||||||
|
'no_rekening' => $item->no_rekening,
|
||||||
|
'cif' => $item->cif,
|
||||||
|
'nama_debitur' => $item->nama_debitur,
|
||||||
|
'kolektibilitas' => $item->kolektibilitas,
|
||||||
|
'kolektibilitas_badge' => $item->kolektibilitas_badge ?? '',
|
||||||
|
'fasilitas' => $item->fasilitas,
|
||||||
|
'nilai_agunan' => $item->nilai_agunan_formatted ?? '',
|
||||||
|
'status_agunan' => $item->status_agunan,
|
||||||
|
'status_badge' => $item->status_badge ?? '',
|
||||||
|
'created_by' => $item->creator?->name ?? '-',
|
||||||
|
'created_at' => dateFormat($item->created_at, true) ?? $item->created_at->format('d/m/Y H:i')
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
// Calculate the page count
|
||||||
|
$pageCount = ceil($totalRecords / ($request->get('size', 10)));
|
||||||
|
|
||||||
|
// 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' => $transformedData,
|
||||||
|
]);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error('Error in laporan slik datatables: ' . $e->getMessage());
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'draw' => $request->get('draw'),
|
||||||
|
'recordsTotal' => 0,
|
||||||
|
'recordsFiltered' => 0,
|
||||||
|
'pageCount' => 0,
|
||||||
|
'page' => 1,
|
||||||
|
'totalCount' => 0,
|
||||||
|
'data' => [],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function show($id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$laporanSlik = LaporanSlik::findOrFail($id);
|
||||||
|
return view('lpj::laporan-slik.show', compact('laporanSlik'));
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error('Error showing laporan slik: ' . $e->getMessage());
|
||||||
|
return back()->with('error', 'Data tidak ditemukan');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export laporan SLIK to Excel
|
||||||
|
*/
|
||||||
|
public function export(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$query = LaporanSlik::query();
|
||||||
|
|
||||||
|
// Apply filters
|
||||||
|
if ($request->has('search') && $request->search) {
|
||||||
|
$search = $request->search;
|
||||||
|
$query->where(function($q) use ($search) {
|
||||||
|
$q->where('nama_debitur', 'like', "%{$search}%")
|
||||||
|
->orWhere('no_rekening', 'like', "%{$search}%")
|
||||||
|
->orWhere('cif', 'like', "%{$search}%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->has('year') && $request->year) {
|
||||||
|
$query->where('tahun', $request->year);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->has('month') && $request->month) {
|
||||||
|
$query->where('bulan', $request->month);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->has('status') && $request->status) {
|
||||||
|
$query->where('status', $request->status);
|
||||||
|
}
|
||||||
|
|
||||||
|
$filename = 'laporan-slik-' . now()->format('Y-m-d-His') . '.xlsx';
|
||||||
|
|
||||||
|
return Excel::download(new LaporanSlikExport($query), $filename);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error('Error exporting laporan slik: ' . $e->getMessage());
|
||||||
|
return back()->with('error', 'Gagal export data: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
114
app/Models/LaporanSlik.php
Normal file
114
app/Models/LaporanSlik.php
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\Lpj\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Modules\Usermanagement\Models\User;
|
||||||
|
|
||||||
|
class LaporanSlik extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $table = 'laporan_slik';
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'slik_id',
|
||||||
|
'sandi_bank',
|
||||||
|
'kode_kantor',
|
||||||
|
'kode_cabang',
|
||||||
|
'tahun',
|
||||||
|
'bulan',
|
||||||
|
'no_rekening',
|
||||||
|
'cif',
|
||||||
|
'kode_jenis',
|
||||||
|
'kode_jenis_ket',
|
||||||
|
'kode_sifat',
|
||||||
|
'kode_sifat_ket',
|
||||||
|
'kode_valuta',
|
||||||
|
'kode_valuta_ket',
|
||||||
|
'baki_debet',
|
||||||
|
'kolektibilitas',
|
||||||
|
'kolektibilitas_ket',
|
||||||
|
'tanggal_mulai',
|
||||||
|
'tanggal_jatuh_tempo',
|
||||||
|
'tanggal_selesai',
|
||||||
|
'tanggal_restrukturisasi',
|
||||||
|
'kode_sebab_macet',
|
||||||
|
'kode_sebab_macet_ket',
|
||||||
|
'tanggal_macet',
|
||||||
|
'kode_kondisi',
|
||||||
|
'kode_kondisi_ket',
|
||||||
|
'tanggal_kondisi',
|
||||||
|
'nilai_agunan',
|
||||||
|
'nilai_agunan_ket',
|
||||||
|
'jenis_agunan',
|
||||||
|
'kode_agunan',
|
||||||
|
'kode_agunan_ket',
|
||||||
|
'peringkat_agunan',
|
||||||
|
'peringkat_agunan_ket',
|
||||||
|
'nama_debitur',
|
||||||
|
'npwp',
|
||||||
|
'no_ktp',
|
||||||
|
'no_telp',
|
||||||
|
'kode_kab_kota',
|
||||||
|
'kode_kab_kota_ket',
|
||||||
|
'kode_negara_domisili',
|
||||||
|
'kode_negara_domisili_ket',
|
||||||
|
'kode_pos',
|
||||||
|
'alamat',
|
||||||
|
'fasilitas',
|
||||||
|
'status_agunan',
|
||||||
|
'tanggal_lapor',
|
||||||
|
'status',
|
||||||
|
'created_by',
|
||||||
|
'updated_by',
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'created_at' => 'datetime',
|
||||||
|
'updated_at' => 'datetime',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function slik()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Slik::class, 'slik_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function creator()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class, 'created_by');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updater()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class, 'updated_by');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope untuk filter berdasarkan status
|
||||||
|
*/
|
||||||
|
public function scopeActive($query)
|
||||||
|
{
|
||||||
|
return $query->where('status', 'aktif');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessor untuk nilai agunan yang diformat
|
||||||
|
*/
|
||||||
|
public function getNilaiAgunanFormattedAttribute()
|
||||||
|
{
|
||||||
|
return number_format($this->nilai_agunan ?? 0, 0, ',', '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessor untuk status badge
|
||||||
|
*/
|
||||||
|
public function getStatusBadgeAttribute()
|
||||||
|
{
|
||||||
|
$status = $this->status ?? 'aktif';
|
||||||
|
$class = $status == 'aktif' ? 'success' : 'danger';
|
||||||
|
|
||||||
|
return '<span class="badge badge-light-' . $class . '">' . ucfirst($status) . '</span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('laporan_slik', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedBigInteger('slik_id')->nullable();
|
||||||
|
$table->string('sandi_bank', 10)->nullable();
|
||||||
|
$table->string('kode_kantor', 10)->nullable();
|
||||||
|
$table->string('kode_cabang', 10)->nullable();
|
||||||
|
$table->string('tahun', 4)->nullable();
|
||||||
|
$table->string('bulan', 2)->nullable();
|
||||||
|
$table->string('no_rekening', 50)->nullable();
|
||||||
|
$table->string('cif', 50)->nullable();
|
||||||
|
$table->string('kode_jenis', 10)->nullable();
|
||||||
|
$table->string('kode_jenis_ket', 100)->nullable();
|
||||||
|
$table->string('kode_sifat', 10)->nullable();
|
||||||
|
$table->string('kode_sifat_ket', 100)->nullable();
|
||||||
|
$table->string('kode_valuta', 5)->nullable();
|
||||||
|
$table->string('kode_valuta_ket', 50)->nullable();
|
||||||
|
$table->string('baki_debet', 20)->nullable();
|
||||||
|
$table->string('kolektibilitas', 5)->nullable();
|
||||||
|
$table->string('kolektibilitas_ket', 50)->nullable();
|
||||||
|
$table->string('tanggal_mulai', 10)->nullable();
|
||||||
|
$table->string('tanggal_jatuh_tempo', 10)->nullable();
|
||||||
|
$table->string('tanggal_selesai', 10)->nullable();
|
||||||
|
$table->string('tanggal_restrukturisasi', 10)->nullable();
|
||||||
|
$table->string('kode_sebab_macet', 10)->nullable();
|
||||||
|
$table->string('kode_sebab_macet_ket', 100)->nullable();
|
||||||
|
$table->string('tanggal_macet', 10)->nullable();
|
||||||
|
$table->string('kode_kondisi', 10)->nullable();
|
||||||
|
$table->string('kode_kondisi_ket', 100)->nullable();
|
||||||
|
$table->string('tanggal_kondisi', 10)->nullable();
|
||||||
|
$table->string('nilai_agunan', 20)->nullable();
|
||||||
|
$table->string('nilai_agunan_ket', 100)->nullable();
|
||||||
|
$table->string('jenis_agunan', 50)->nullable();
|
||||||
|
$table->string('kode_agunan', 10)->nullable();
|
||||||
|
$table->string('kode_agunan_ket', 100)->nullable();
|
||||||
|
$table->string('peringkat_agunan', 10)->nullable();
|
||||||
|
$table->string('peringkat_agunan_ket', 100)->nullable();
|
||||||
|
$table->string('nama_debitur', 100)->nullable();
|
||||||
|
$table->string('npwp', 50)->nullable();
|
||||||
|
$table->string('no_ktp', 50)->nullable();
|
||||||
|
$table->string('no_telp', 50)->nullable();
|
||||||
|
$table->string('kode_kab_kota', 10)->nullable();
|
||||||
|
$table->string('kode_kab_kota_ket', 100)->nullable();
|
||||||
|
$table->string('kode_negara_domisili', 10)->nullable();
|
||||||
|
$table->string('kode_negara_domisili_ket', 100)->nullable();
|
||||||
|
$table->string('kode_pos', 10)->nullable();
|
||||||
|
$table->string('alamat', 200)->nullable();
|
||||||
|
$table->string('fasilitas', 100)->nullable();
|
||||||
|
$table->string('status_agunan', 20)->nullable();
|
||||||
|
$table->string('tanggal_lapor', 10)->nullable();
|
||||||
|
$table->string('status', 20)->default('aktif');
|
||||||
|
$table->unsignedBigInteger('created_by')->nullable();
|
||||||
|
$table->unsignedBigInteger('updated_by')->nullable();
|
||||||
|
$table->timestamps();
|
||||||
|
|
||||||
|
$table->index('slik_id');
|
||||||
|
$table->index('no_rekening');
|
||||||
|
$table->index('cif');
|
||||||
|
$table->index('nama_debitur');
|
||||||
|
$table->index(['tahun', 'bulan']);
|
||||||
|
$table->index('created_at');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('laporan_slik');
|
||||||
|
}
|
||||||
|
};
|
||||||
15
module.json
15
module.json
@@ -418,7 +418,7 @@
|
|||||||
"roles": [
|
"roles": [
|
||||||
"administrator",
|
"administrator",
|
||||||
"admin",
|
"admin",
|
||||||
"noc"
|
"adk"
|
||||||
],
|
],
|
||||||
"sub": [{
|
"sub": [{
|
||||||
"title": "SLIK",
|
"title": "SLIK",
|
||||||
@@ -445,6 +445,19 @@
|
|||||||
"administrator",
|
"administrator",
|
||||||
"admin"
|
"admin"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Laporan SLIK",
|
||||||
|
"path": "admin-kredit.laporan-slik",
|
||||||
|
"icon": "ki-filled ki-filter-tablet text-lg text-primary",
|
||||||
|
"classes": "",
|
||||||
|
"attributes": [],
|
||||||
|
"permission": "",
|
||||||
|
"roles": [
|
||||||
|
"adk",
|
||||||
|
"administrator",
|
||||||
|
"admin"
|
||||||
|
]
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
220
resources/views/laporan-slik/index.blade.php
Normal file
220
resources/views/laporan-slik/index.blade.php
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
@extends('layouts.main')
|
||||||
|
|
||||||
|
@section('breadcrumbs')
|
||||||
|
{{ Breadcrumbs::render('admin-kredit.laporan-slik') }}
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="grid">
|
||||||
|
<div class="min-w-full border card border-agi-100 card-grid" data-datatable="false" data-datatable-page-size="10"
|
||||||
|
data-datatable-state-save="false" id="laporan-slik-table"
|
||||||
|
data-api-url="{{ route('admin-kredit.laporan-slik.datatables') }}">
|
||||||
|
<div class="flex-wrap py-5 card-header bg-agi-50">
|
||||||
|
<h3 class="card-title">
|
||||||
|
Laporan SLIK
|
||||||
|
</h3>
|
||||||
|
<div class="flex flex-wrap gap-2 lg:gap-5">
|
||||||
|
<div class="flex">
|
||||||
|
<label class="input input-sm">
|
||||||
|
<i class="ki-filled ki-magnifier"></i>
|
||||||
|
<input placeholder="Search Laporan SLIK" id="search" type="text" value="">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-wrap gap-2.5">
|
||||||
|
<div class="h-[24px] border border-r-gray-200"></div>
|
||||||
|
<a class="btn btn-sm btn-light" href="#" id="export-excel">
|
||||||
|
<i class="ki-filled ki-file-down"></i> Export Excel
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="scrollable-x-auto">
|
||||||
|
<table
|
||||||
|
class="table text-sm font-medium text-gray-700 align-middle table-auto table-border min-w-[1200px]"
|
||||||
|
data-datatable-table="true">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="w-14">
|
||||||
|
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox" />
|
||||||
|
</th>
|
||||||
|
<th class="min-w-[100px]" data-datatable-column="sandi_bank">
|
||||||
|
<span class="sort">
|
||||||
|
<span class="sort-label">Sandi Bank</span>
|
||||||
|
<span class="sort-icon"></span>
|
||||||
|
</span>
|
||||||
|
</th>
|
||||||
|
<th class="min-w-[120px]" data-datatable-column="no_rekening">
|
||||||
|
<span class="sort">
|
||||||
|
<span class="sort-label">No Rekening</span>
|
||||||
|
<span class="sort-icon"></span>
|
||||||
|
</span>
|
||||||
|
</th>
|
||||||
|
<th class="min-w-[120px]" data-datatable-column="baki_debet">
|
||||||
|
<span class="sort">
|
||||||
|
<span class="sort-label">Baki Debet</span>
|
||||||
|
<span class="sort-icon"></span>
|
||||||
|
</span>
|
||||||
|
</th>
|
||||||
|
<th class="min-w-[100px]" data-datatable-column="status">
|
||||||
|
<span class="sort">
|
||||||
|
<span class="sort-label">Status</span>
|
||||||
|
<span class="sort-icon"></span>
|
||||||
|
</span>
|
||||||
|
</th>
|
||||||
|
<th class="min-w-[50px] text-center" data-datatable-column="actions">Aksi</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="flex-col gap-3 justify-center font-medium text-gray-600 card-footer md:justify-between md:flex-row text-2sm">
|
||||||
|
<div class="flex gap-2 items-center">
|
||||||
|
Show
|
||||||
|
<select class="w-16 select select-sm" data-datatable-size="true" name="perpage"> </select> per page
|
||||||
|
</div>
|
||||||
|
<div class="flex gap-4 items-center">
|
||||||
|
<span data-datatable-info="true"> </span>
|
||||||
|
<div class="pagination" data-datatable-pagination="true">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('styles')
|
||||||
|
<style>
|
||||||
|
/* Responsive adjustments for table */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.table-responsive {
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
max-width: 95% !important;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-cols-1.md\:grid-cols-2 {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure table is scrollable on small screens */
|
||||||
|
.scrollable-x-auto {
|
||||||
|
overflow-x: auto;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent text wrapping in table cells */
|
||||||
|
.table th,
|
||||||
|
.table td {
|
||||||
|
white-space: nowrap;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allow wrapping for long text in detail modal */
|
||||||
|
.modal-body .text-gray-900 {
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
let dataTable;
|
||||||
|
</script>
|
||||||
|
<script type="module">
|
||||||
|
/**
|
||||||
|
* Inisialisasi DataTable untuk Laporan SLIK menggunakan KTDataTable
|
||||||
|
*/
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
const element = document.querySelector('#laporan-slik-table');
|
||||||
|
const searchInput = document.getElementById('search');
|
||||||
|
|
||||||
|
const apiUrl = element.getAttribute('data-api-url');
|
||||||
|
|
||||||
|
// Konfigurasi DataTable menggunakan KTDataTable
|
||||||
|
const dataTableOptions = {
|
||||||
|
apiEndpoint: apiUrl,
|
||||||
|
pageSize: 10,
|
||||||
|
columns: {
|
||||||
|
select: {
|
||||||
|
render: (item, data, context) => {
|
||||||
|
const checkbox = document.createElement('input');
|
||||||
|
checkbox.className = 'checkbox checkbox-sm';
|
||||||
|
checkbox.type = 'checkbox';
|
||||||
|
checkbox.value = data.id.toString();
|
||||||
|
checkbox.setAttribute('data-datatable-row-check', 'true');
|
||||||
|
return checkbox.outerHTML.trim();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
sandi_bank: {
|
||||||
|
title: 'Sandi Bank',
|
||||||
|
},
|
||||||
|
no_rekening: {
|
||||||
|
title: 'No Rekening',
|
||||||
|
},
|
||||||
|
baki_debet_formatted: {
|
||||||
|
title: 'Baki Debet',
|
||||||
|
render: (item, data) => {
|
||||||
|
return data.baki_debet_formatted || '-';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
status_badge: {
|
||||||
|
title: 'Status',
|
||||||
|
render: (item, data) => {
|
||||||
|
return data.status_badge || '-';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
title: 'Aksi',
|
||||||
|
render: (item, data) => {
|
||||||
|
return `
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<button class="btn btn-sm btn-light btn-icon" onclick="showDetail(${data.id})" title="Detail">
|
||||||
|
<i class="ki-filled ki-eye"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Inisialisasi DataTable
|
||||||
|
dataTable = new KTDataTable(element, dataTableOptions);
|
||||||
|
dataTable.showSpinner();
|
||||||
|
|
||||||
|
// Fungsi pencarian
|
||||||
|
searchInput.addEventListener('input', function() {
|
||||||
|
const searchValue = this.value.trim();
|
||||||
|
dataTable.search(searchValue, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Export Excel functionality
|
||||||
|
document.getElementById('export-excel').addEventListener('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Build export URL with current filters
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
if (searchInput.value) params.append('search', searchInput.value);
|
||||||
|
const exportUrl = '{{ route('admin-kredit.laporan-slik.export') }}?' + params.toString();
|
||||||
|
window.open(exportUrl, '_blank');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* Fungsi untuk menampilkan detail data Laporan SLIK
|
||||||
|
* @param {number} id - ID data Laporan SLIK yang akan ditampilkan
|
||||||
|
*/
|
||||||
|
function showDetail(id) {
|
||||||
|
// Redirect ke halaman detail
|
||||||
|
window.location.href = `{{ route('admin-kredit.laporan-slik.show', ':id') }}`.replace(':id', id);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
172
resources/views/laporan-slik/show.blade.php
Normal file
172
resources/views/laporan-slik/show.blade.php
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
@extends('layouts.main')
|
||||||
|
|
||||||
|
@section('breadcrumbs')
|
||||||
|
{{ Breadcrumbs::render('admin-kredit.laporan-slik.show', $laporanSlik) }}
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="grid">
|
||||||
|
<div class="w-full">
|
||||||
|
<!-- Header -->
|
||||||
|
<div class="flex flex-wrap gap-4 justify-between items-center mb-6">
|
||||||
|
<div>
|
||||||
|
<h3 class="text-xl font-semibold text-gray-900">Detail Laporan SLIK</h3>
|
||||||
|
<p class="mt-1 text-sm text-gray-600">Informasi lengkap laporan SLIK {{ $laporanSlik->nama_debitur }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<a href="{{ route('admin-kredit.laporan-slik.index') }}" class="btn btn-sm btn-light">
|
||||||
|
<i class="ki-filled ki-arrow-left"></i>
|
||||||
|
Kembali
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Card Detail -->
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Informasi Laporan SLIK</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="grid grid-cols-1 gap-6 md:grid-cols-2">
|
||||||
|
<!-- Informasi Debitur -->
|
||||||
|
<div class="space-y-4">
|
||||||
|
<h4 class="mb-3 text-base font-semibold text-gray-800">Data Debitur</h4>
|
||||||
|
|
||||||
|
<div class="space-y-3">
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Nama Debitur:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->nama_debitur ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">No. Rekening:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->no_rekening ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">CIF:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->cif ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">NPWP:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->npwp ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">No. KTP:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->no_ktp ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">No. Telp:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->no_telp ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Alamat:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->alamat ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Kode Pos:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->kode_pos ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Informasi Fasilitas -->
|
||||||
|
<div class="space-y-4">
|
||||||
|
<h4 class="mb-3 text-base font-semibold text-gray-800">Data Fasilitas</h4>
|
||||||
|
|
||||||
|
<div class="space-y-3">
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Fasilitas:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->fasilitas ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Kolektibilitas:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->kolektibilitas ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Jenis Agunan:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->jenis_agunan ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Nilai Agunan:</span>
|
||||||
|
<span class="text-sm text-gray-900">Rp
|
||||||
|
{{ number_format($laporanSlik->nilai_agunan ?? 0, 0, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Baki Debet:</span>
|
||||||
|
<span class="text-sm text-gray-900">Rp
|
||||||
|
{{ number_format($laporanSlik->baki_debet ?? 0, 0, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Sandi Bank:</span>
|
||||||
|
<span class="text-sm text-gray-900">{{ $laporanSlik->sandi_bank ?? '-' }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-between">
|
||||||
|
<span class="text-sm font-medium text-gray-600">Status:</span>
|
||||||
|
<span class="text-sm text-gray-900">
|
||||||
|
<span
|
||||||
|
class="badge badge-light-{{ $laporanSlik->status == 'aktif' ? 'success' : 'danger' }}">
|
||||||
|
{{ $laporanSlik->status ?? 'aktif' }}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4 row">
|
||||||
|
<div class="col-12">
|
||||||
|
<h5 class="mb-3">Detail Lainnya</h5>
|
||||||
|
<table class="table table-borderless">
|
||||||
|
<tr>
|
||||||
|
<td width="20%"><strong>Kolektibilitas</strong></td>
|
||||||
|
<td width="5%">:</td>
|
||||||
|
<td>{{ $laporanSlik->kolektibilitas }}</td>
|
||||||
|
<td width="20%"><strong>Tanggal Mulai</strong></td>
|
||||||
|
<td width="5%">:</td>
|
||||||
|
<td>{{ $laporanSlik->tanggal_mulai ?? '-' }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Tanggal Jatuh Tempo</strong></td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $laporanSlik->tanggal_jatuh_tempo ?? '-' }}</td>
|
||||||
|
<td><strong>Tanggal Selesai</strong></td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $laporanSlik->tanggal_selesai ?? '-' }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Jenis Agunan</strong></td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $laporanSlik->jenis_agunan ?? '-' }}</td>
|
||||||
|
<td><strong>Fasilitas</strong></td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $laporanSlik->fasilitas ?? '-' }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Tanggal Lapor</strong></td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $laporanSlik->tanggal_lapor ?? '-' }}</td>
|
||||||
|
<td><strong>Tanggal Dibuat</strong></td>
|
||||||
|
<td>:</td>
|
||||||
|
<td>{{ $laporanSlik->created_at->format('d/m/Y H:i') }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -169,7 +169,6 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@push('styles')
|
@push('styles')
|
||||||
@@ -212,16 +211,8 @@
|
|||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script>
|
<script>
|
||||||
/**
|
let dataTable;
|
||||||
* Fungsi untuk menampilkan detail data SLIK
|
|
||||||
* @param {number} id - ID data SLIK yang akan ditampilkan
|
|
||||||
*/
|
|
||||||
function showDetail(id) {
|
|
||||||
// Redirect ke halaman detail
|
|
||||||
window.location.href = `{{ route('admin-kredit.slik.show', ':id') }}`.replace(':id', id);
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
/**
|
/**
|
||||||
* Inisialisasi DataTable untuk SLIK menggunakan KTDataTable
|
* Inisialisasi DataTable untuk SLIK menggunakan KTDataTable
|
||||||
@@ -229,9 +220,6 @@
|
|||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
const element = document.querySelector('#slik-table');
|
const element = document.querySelector('#slik-table');
|
||||||
const searchInput = document.getElementById('search');
|
const searchInput = document.getElementById('search');
|
||||||
const yearFilter = document.getElementById('year-filter');
|
|
||||||
const monthFilter = document.getElementById('month-filter');
|
|
||||||
const statusFilter = document.getElementById('status-filter');
|
|
||||||
|
|
||||||
const apiUrl = element.getAttribute('data-api-url');
|
const apiUrl = element.getAttribute('data-api-url');
|
||||||
|
|
||||||
@@ -301,6 +289,9 @@
|
|||||||
render: (item, data) => {
|
render: (item, data) => {
|
||||||
return `
|
return `
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
|
<button class="btn btn-sm btn-primary" onclick="moveToLaporan(${data.id})" title="SLIK">
|
||||||
|
<i class="ki-filled ki-file-up"></i> SLIK
|
||||||
|
</button>
|
||||||
<button class="btn btn-sm btn-light btn-icon" onclick="showDetail(${data.id})" title="Detail">
|
<button class="btn btn-sm btn-light btn-icon" onclick="showDetail(${data.id})" title="Detail">
|
||||||
<i class="ki-filled ki-eye"></i>
|
<i class="ki-filled ki-eye"></i>
|
||||||
</button>
|
</button>
|
||||||
@@ -312,7 +303,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Inisialisasi DataTable
|
// Inisialisasi DataTable
|
||||||
let dataTable = new KTDataTable(element, dataTableOptions);
|
dataTable = new KTDataTable(element, dataTableOptions);
|
||||||
dataTable.showSpinner();
|
dataTable.showSpinner();
|
||||||
|
|
||||||
// Fungsi pencarian
|
// Fungsi pencarian
|
||||||
@@ -321,26 +312,6 @@
|
|||||||
dataTable.search(searchValue, true);
|
dataTable.search(searchValue, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Filter berdasarkan tahun
|
|
||||||
yearFilter.addEventListener('change', function() {
|
|
||||||
const yearValue = this.value;
|
|
||||||
dataTable.setParam('year', yearValue);
|
|
||||||
dataTable.reload();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Filter berdasarkan bulan
|
|
||||||
monthFilter.addEventListener('change', function() {
|
|
||||||
const monthValue = this.value;
|
|
||||||
dataTable.setParam('month', monthValue);
|
|
||||||
dataTable.reload();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Filter berdasarkan status
|
|
||||||
statusFilter.addEventListener('change', function() {
|
|
||||||
const statusValue = this.value;
|
|
||||||
dataTable.setParam('status', statusValue);
|
|
||||||
dataTable.reload();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Export Excel functionality
|
// Export Excel functionality
|
||||||
document.getElementById('export-excel').addEventListener('click', function(e) {
|
document.getElementById('export-excel').addEventListener('click', function(e) {
|
||||||
@@ -349,13 +320,95 @@
|
|||||||
// Build export URL with current filters
|
// Build export URL with current filters
|
||||||
const params = new URLSearchParams();
|
const params = new URLSearchParams();
|
||||||
if (searchInput.value) params.append('search', searchInput.value);
|
if (searchInput.value) params.append('search', searchInput.value);
|
||||||
if (yearFilter.value) params.append('year', yearFilter.value);
|
|
||||||
if (monthFilter.value) params.append('month', monthFilter.value);
|
|
||||||
if (statusFilter.value) params.append('status', statusFilter.value);
|
|
||||||
|
|
||||||
const exportUrl = '{{ route('admin-kredit.slik.export') }}?' + params.toString();
|
const exportUrl = '{{ route('admin-kredit.slik.export') }}?' + params.toString();
|
||||||
window.open(exportUrl, '_blank');
|
window.open(exportUrl, '_blank');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* Fungsi untuk menampilkan detail data SLIK
|
||||||
|
* @param {number} id - ID data SLIK yang akan ditampilkan
|
||||||
|
*/
|
||||||
|
function showDetail(id) {
|
||||||
|
// Redirect ke halaman detail
|
||||||
|
window.location.href = `{{ route('admin-kredit.slik.show', ':id') }}`.replace(':id', id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fungsi untuk memindahkan data SLIK ke laporan
|
||||||
|
* @param {number} id - ID data SLIK yang akan dipindahkan
|
||||||
|
*/
|
||||||
|
function moveToLaporan(id) {
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Konfirmasi',
|
||||||
|
text: 'Apakah Anda yakin ingin memindahkan data ini ke laporan SLIK?',
|
||||||
|
icon: 'question',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: '#3085d6',
|
||||||
|
cancelButtonColor: '#d33',
|
||||||
|
confirmButtonText: 'Ya, Pindahkan!',
|
||||||
|
cancelButtonText: 'Batal',
|
||||||
|
reverseButtons: true
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
// Tampilkan loading
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Memproses...',
|
||||||
|
text: 'Sedang memindahkan data ke laporan SLIK',
|
||||||
|
allowOutsideClick: false,
|
||||||
|
showConfirmButton: false,
|
||||||
|
willOpen: () => {
|
||||||
|
window.Swal.showLoading();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
fetch(`{{ route('admin-kredit.laporan-slik.store') }}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRF-TOKEN': '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
slik_id: id
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
window.Swal.close();
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Berhasil!',
|
||||||
|
text: data.message || 'Data berhasil dipindahkan ke laporan SLIK',
|
||||||
|
icon: 'success',
|
||||||
|
confirmButtonText: 'OK'
|
||||||
|
}).then(() => {
|
||||||
|
// Reload tabel DataTable
|
||||||
|
dataTable.reload();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Gagal!',
|
||||||
|
text: data.message || 'Gagal memindahkan data',
|
||||||
|
icon: 'error',
|
||||||
|
confirmButtonText: 'OK'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error:', error);
|
||||||
|
window.Swal.close();
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Error!',
|
||||||
|
text: 'Terjadi kesalahan saat memindahkan data',
|
||||||
|
icon: 'error',
|
||||||
|
confirmButtonText: 'OK'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -14,6 +14,11 @@
|
|||||||
<p class="mt-1 text-sm text-gray-600">Informasi lengkap debitur {{ $slik->nama_debitur }}</p>
|
<p class="mt-1 text-sm text-gray-600">Informasi lengkap debitur {{ $slik->nama_debitur }}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
|
<button class="btn btn-sm btn-primary" onclick="moveToLaporan({{ $slik->id }})"
|
||||||
|
title="Pindahkan ke Laporan SLIK">
|
||||||
|
<i class="ki-filled ki-file-up"></i>
|
||||||
|
SLIK
|
||||||
|
</button>
|
||||||
<a href="{{ route('admin-kredit.slik.index') }}" class="btn btn-sm btn-light">
|
<a href="{{ route('admin-kredit.slik.index') }}" class="btn btn-sm btn-light">
|
||||||
<i class="ki-filled ki-arrow-left"></i>
|
<i class="ki-filled ki-arrow-left"></i>
|
||||||
Kembali
|
Kembali
|
||||||
@@ -165,6 +170,87 @@
|
|||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script>
|
<script>
|
||||||
|
/**
|
||||||
|
* Fungsi untuk memindahkan data SLIK ke laporan
|
||||||
|
* @param {number} id - ID data SLIK yang akan dipindahkan
|
||||||
|
*/
|
||||||
|
function moveToLaporan(id) {
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Konfirmasi',
|
||||||
|
text: 'Apakah Anda yakin ingin memindahkan data ini ke laporan SLIK?',
|
||||||
|
icon: 'question',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: '#3085d6',
|
||||||
|
cancelButtonColor: '#d33',
|
||||||
|
confirmButtonText: 'Ya, Pindahkan!',
|
||||||
|
cancelButtonText: 'Batal',
|
||||||
|
reverseButtons: true
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
// Tampilkan loading
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Memproses...',
|
||||||
|
text: 'Sedang memindahkan data ke laporan SLIK',
|
||||||
|
allowOutsideClick: false,
|
||||||
|
showConfirmButton: false,
|
||||||
|
willOpen: () => {
|
||||||
|
window.Swal.showLoading();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
fetch(`{{ route('admin-kredit.laporan-slik.store') }}`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-CSRF-TOKEN': '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
slik_id: id
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
window.Swal.close();
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Berhasil!',
|
||||||
|
text: data.message || 'Data berhasil dipindahkan ke laporan SLIK',
|
||||||
|
icon: 'success',
|
||||||
|
confirmButtonText: 'OK'
|
||||||
|
}).then(() => {
|
||||||
|
// Disable tombol setelah berhasil
|
||||||
|
const button = document.querySelector(
|
||||||
|
`button[onclick="moveToLaporan(${id})"]`);
|
||||||
|
if (button) {
|
||||||
|
button.disabled = true;
|
||||||
|
button.innerHTML =
|
||||||
|
'<i class="ki-filled ki-check"></i> Sudah di SLIK';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Gagal!',
|
||||||
|
text: data.message || 'Gagal memindahkan data',
|
||||||
|
icon: 'error',
|
||||||
|
confirmButtonText: 'OK'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error:', error);
|
||||||
|
window.Swal.close();
|
||||||
|
window.Swal.fire({
|
||||||
|
title: 'Error!',
|
||||||
|
text: 'Terjadi kesalahan saat memindahkan data',
|
||||||
|
icon: 'error',
|
||||||
|
confirmButtonText: 'OK'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Add any additional JavaScript for detail page
|
// Add any additional JavaScript for detail page
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
// Initialize any required components
|
// Initialize any required components
|
||||||
|
|||||||
@@ -731,6 +731,12 @@ Breadcrumbs::for('laporan-admin-kredit', function ($trail) {
|
|||||||
$trail->push('Laporan Admin Kredit', route('admin-kredit.laporan.index'));
|
$trail->push('Laporan Admin Kredit', route('admin-kredit.laporan.index'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Laporan Admin Kredit Laporan SLIK
|
||||||
|
Breadcrumbs::for('admin-kredit.laporan-slik', function (BreadcrumbTrail $trail) {
|
||||||
|
$trail->parent('laporan-admin-kredit');
|
||||||
|
$trail->push('Laporan SLIK', route('admin-kredit.laporan-slik.index'));
|
||||||
|
});
|
||||||
|
|
||||||
// Laporan Admin Kredit Edit
|
// Laporan Admin Kredit Edit
|
||||||
Breadcrumbs::for('laporan-admin-kredit-edit', function (BreadcrumbTrail $trail, $laporanAdminKredit) {
|
Breadcrumbs::for('laporan-admin-kredit-edit', function (BreadcrumbTrail $trail, $laporanAdminKredit) {
|
||||||
$trail->parent('laporan-admin-kredit');
|
$trail->parent('laporan-admin-kredit');
|
||||||
@@ -836,5 +842,10 @@ Breadcrumbs::for('admin-kredit.slik.import-form', function (BreadcrumbTrail $tra
|
|||||||
$trail->push('Import Data SLIK', route('admin-kredit.slik.import-form'));
|
$trail->push('Import Data SLIK', route('admin-kredit.slik.import-form'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Breadcrumbs::for('admin-kredit.laporan-slik.show', function (BreadcrumbTrail $trail, $slik) {
|
||||||
|
$trail->parent('admin-kredit.laporan-slik');
|
||||||
|
$trail->push('Detail SLIK #' . $slik->id, route('admin-kredit.laporan-slik.show', $slik));
|
||||||
|
});
|
||||||
|
|
||||||
// add andy
|
// add andy
|
||||||
require __DIR__ . '/breadcrumbs_registrasi.php';
|
require __DIR__ . '/breadcrumbs_registrasi.php';
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use Modules\Lpj\Http\Controllers\NocController;
|
|||||||
use Modules\Lpj\Http\Controllers\SLAController;
|
use Modules\Lpj\Http\Controllers\SLAController;
|
||||||
use Modules\Lpj\Http\Controllers\KJPPController;
|
use Modules\Lpj\Http\Controllers\KJPPController;
|
||||||
use Modules\Lpj\Http\Controllers\MemoController;
|
use Modules\Lpj\Http\Controllers\MemoController;
|
||||||
use Modules\Lpj\Http\Controllers\BucokController;
|
|
||||||
use Modules\Lpj\Http\Controllers\SlikController;
|
use Modules\Lpj\Http\Controllers\SlikController;
|
||||||
|
use Modules\Lpj\Http\Controllers\BucokController;
|
||||||
use Modules\Lpj\Http\Controllers\TeamsController;
|
use Modules\Lpj\Http\Controllers\TeamsController;
|
||||||
use Modules\Lpj\Http\Controllers\RegionController;
|
use Modules\Lpj\Http\Controllers\RegionController;
|
||||||
use Modules\Lpj\Http\Controllers\ResumeController;
|
use Modules\Lpj\Http\Controllers\ResumeController;
|
||||||
@@ -22,6 +22,7 @@ use Modules\Lpj\Http\Controllers\PenilaianController;
|
|||||||
use Modules\Lpj\Http\Controllers\PembatalanController;
|
use Modules\Lpj\Http\Controllers\PembatalanController;
|
||||||
use Modules\Lpj\Http\Controllers\PermohonanController;
|
use Modules\Lpj\Http\Controllers\PermohonanController;
|
||||||
use Modules\Lpj\Http\Controllers\CustomFieldController;
|
use Modules\Lpj\Http\Controllers\CustomFieldController;
|
||||||
|
use Modules\Lpj\Http\Controllers\LaporanSlikController;
|
||||||
use Modules\Lpj\Http\Controllers\LaporanUserController;
|
use Modules\Lpj\Http\Controllers\LaporanUserController;
|
||||||
use Modules\Lpj\Http\Controllers\JenisDokumenController;
|
use Modules\Lpj\Http\Controllers\JenisDokumenController;
|
||||||
use Modules\Lpj\Http\Controllers\JenisJaminanController;
|
use Modules\Lpj\Http\Controllers\JenisJaminanController;
|
||||||
@@ -805,6 +806,15 @@ Route::middleware(['auth'])->group(function () {
|
|||||||
Route::delete('truncate', [SlikController::class, 'truncate'])->name('truncate');
|
Route::delete('truncate', [SlikController::class, 'truncate'])->name('truncate');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Route Laporan SLIK
|
||||||
|
Route::prefix('laporan-slik')->name('laporan-slik.')->group(function () {
|
||||||
|
Route::get('/', [LaporanSlikController::class, 'index'])->name('index');
|
||||||
|
Route::get('datatables', [LaporanSlikController::class, 'dataForDatatables'])->name('datatables');
|
||||||
|
Route::get('{id}', [LaporanSlikController::class, 'show'])->name('show');
|
||||||
|
Route::post('store', [LaporanSlikController::class, 'store'])->name('store');
|
||||||
|
Route::get('export', [LaporanSlikController::class, 'export'])->name('export');
|
||||||
|
});
|
||||||
|
|
||||||
// Laporan Routes
|
// Laporan Routes
|
||||||
Route::prefix('laporan')->name('laporan.')->group(function () {
|
Route::prefix('laporan')->name('laporan.')->group(function () {
|
||||||
Route::get('/', [LaporanAdminKreditController::class, 'index'])->name('index');
|
Route::get('/', [LaporanAdminKreditController::class, 'index'])->name('index');
|
||||||
|
|||||||
Reference in New Issue
Block a user