diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index 727973b..5262587 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -432,18 +432,39 @@ function getWilayahName($code, $type) function formatLabel($key) { - $customLabels = [ - 'shgb_no_kel_desa' => 'SHGB', - 'nib' => 'NIB', - 'img_pbg_no' =>'IMB/PBG NO', - 'no_surat_ukur_gs' => 'No Surat Ukur/GS', - ]; - - // Jika ada dalam mapping, gunakan label custom - if (array_key_exists($key, $customLabels)) { - return $customLabels[$key]; + static $labelCache = []; + if (isset($labelCache[$key])) { + return $labelCache[$key]; } - // Default: Ubah underscore menjadi spasi dan kapitalisasi - return ucwords(str_replace('_', ' ', $key)); + $customLabel = CustomField::where('name', $key)->first(); + $labelCache[$key] = $customLabel->label ?? ucwords(str_replace('_', ' ', $key)); + + return $labelCache[$key]; +} + +function calculateSLA($permohonan, $type) +{ + if (!$type) { + return null; + } + + $nilai_plafond = in_array($permohonan->nilai_plafond_id, [2, 3]); + $nilai_plafond_2 = in_array($permohonan->nilai_plafond_id, [1]); + + $slaMap = [ + 'resume' => $nilai_plafond ? 2 : null, + 'paparan' => $nilai_plafond ? 2 : null, + 'standard' => $nilai_plafond ? 3 : null, + 'sederhana' => $nilai_plafond ? 2 : null, + 'paparan' => $nilai_plafond_2 ? 3 : null, + 'rap' => 3, + 'memo' => $nilai_plafond ? 1 : null + ]; + + if ($type === 'paparan' && isset($permohonan->tujuanPenilaian->name) && $permohonan->tujuanPenilaian->name === 'rap') { + return 2; + } + + return $slaMap[$type] ?? null; } diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 8670fe3..abc1505 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -326,7 +326,7 @@ class ActivityController extends Controller $filteredRecords = $query->count(); // Get data with necessary relationships - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan'])->get(); + $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan','nilaiPlafond'])->get(); // Calculate total pages $pageCount = ceil($totalRecords / $request->get('size', 10)); @@ -444,26 +444,40 @@ class ActivityController extends Controller $jeniAsset = null; $statusPembayaran = trim(strtolower($item->permohonan->status_bayar ?? '')); $tujuanPenilaian = $item->permohonan->tujuanPenilaian->name ?? null; + $plafond = $item->permohonan->nilaiPlafond->name ?? null; + $now = Carbon::now(); + $type_report = $item->permohonan->penilai->type ?? ""; - // $plafond = $item->permohonan->nilaiPlafond->name ?? null; - // $type_report = $item->permohonan->penilai->type_penilai; + $hari = $hariPaparan = 0; - // $hari = 0; - // if ($plafond == '< 1M') { - // $item->paparan = 'Tidak Ada'; - // }else if($plafond == '2 M - 5 M'){ - // $hari = 2; - // }else if($plafond == '5 M - 10 M'){ - // $hari = 3; - // } + if($type_report == "sederhana"){ + $hari = 2; + $item->paparan = 'Tidak Ada'; + } else{ + if ($plafond == '< 2M') { + $item->paparan = 'Tidak Ada'; + $hari = 3; + }else if($plafond == '2 M - 5 M'){ + $hari = 3; + $hariPaparan = 2; + }else { + $hari = 5; + $hariPaparan = 3; + } + } + + if ($tujuanPenilaian == 'RAP') { + $hari = 2; + $hariPaparan = 2; + } if ($item->permohonan && $item->permohonan->debiture) { $jeniAsset = $item->permohonan->debiture->documents->first() ?? null; } - $hariTambahan = 0; + /*$hariTambahan = 0; if ($tujuanPenilaian == 'RAP') { $hariTambahan = 2; @@ -473,33 +487,50 @@ class ActivityController extends Controller } else { $hariTambahan = 2; // H+2 untuk yang belum bayar } - } + }*/ $tanggalMulai = $item->waktu_penilaian; if ($tanggalMulai) { + if (!$tanggalMulai instanceof Carbon) { + $tanggalMulai = Carbon::parse($tanggalMulai); + } + $hariKerjaBerikutnya = hitungHariKerja($tanggalMulai->toDateString(),$tanggalMulai->copy()->addDays(1)); + $hariKerjaBerikutnya = max($hariKerjaBerikutnya, 1); + $tanggalMulai = $tanggalMulai->copy()->addDays($hariKerjaBerikutnya); + // Konversi string tanggal ke objek Carbon jika belum if (!$tanggalMulai instanceof Carbon) { $tanggalMulai = Carbon::parse($tanggalMulai); } // Hitung tanggal selesai berdasarkan hari tambahan - $tanggalSelesai = $tanggalMulai->copy()->addDays($hariTambahan); + $tanggalSelesai = $tanggalMulai->copy()->addDays($hari); + $tanggalPaparan = $tanggalMulai->copy()->addDays($hariPaparan); // Hitung hari kerja $hariKerja = hitungHariKerja($tanggalMulai->toDateString(), $tanggalSelesai->toDateString()); + $hariKerja = max($hariKerja, $hari); + + $hariKerjaPaparan = hitungHariKerja($tanggalMulai->toDateString(), $tanggalPaparan->toDateString()); + $hariKerjaPaparan = max($hariKerjaPaparan, $hariPaparan); // Set due date SLA $dueDateSla = $tanggalMulai->copy()->addDays($hariKerja); + $dueDateSlaPaparan = $tanggalMulai->copy()->addDays($hariKerjaPaparan); // Cek apakah sudah melewati due date - if ($now->greaterThan($dueDateSla)) { + /*if ($now->greaterThan($dueDateSla)) { $item->due_date_sla = null; } else { $item->due_date_sla = $dueDateSla->toDateString(); - } + }*/ + + $item->due_date_sla = $dueDateSla->toDateString(); + $item->paparan = $dueDateSlaPaparan->toDateString(); } else { $item->due_date_sla = null; + $item->paparan = null; } diff --git a/app/Http/Controllers/DokumenJaminanController.php b/app/Http/Controllers/DokumenJaminanController.php index a64cef0..b552df1 100644 --- a/app/Http/Controllers/DokumenJaminanController.php +++ b/app/Http/Controllers/DokumenJaminanController.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Controller; use Exception; + use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; @@ -572,4 +573,40 @@ $combinedLegalitas = array_merge($existingLegalitas, $newLegalitas); return response()->json($combinedLegalitas); } + + public function clearDetail(Request $request) + { + try { + DB::beginTransaction(); + + $detailId = $request->input('detail_id'); + $detail = DetailDokumenJaminan::findOrFail($detailId); + + // Delete associated files + if ($detail->dokumen_jaminan) { + $dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan)) + ? json_decode($detail->dokumen_jaminan) + : [$detail->dokumen_jaminan]; + + foreach ($dokumen_jaminan as $dokumen) { + if (Storage::exists($dokumen)) { + Storage::delete($dokumen); + } + } + } + + // Delete the detail record + $detail->delete(); + + DB::commit(); + + return response()->json(['success' => true, 'message' => 'Detail berhasil dihapus']); + } catch (\Exception $e) { + DB::rollBack(); + return response()->json([ + 'success' => false, + 'message' => 'Gagal menghapus detail: ' . $e->getMessage() + ], 500); + } + } } diff --git a/app/Http/Controllers/LaporanController.php b/app/Http/Controllers/LaporanController.php index 1fdbaa5..b457413 100644 --- a/app/Http/Controllers/LaporanController.php +++ b/app/Http/Controllers/LaporanController.php @@ -123,7 +123,7 @@ class LaporanController extends Controller $filteredRecords = $query->count(); // Get the data for the current page - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','jenisFasilitasKredit', 'documents.inspeksi','penilai'])->get(); + $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','jenisFasilitasKredit', 'documents.inspeksi','penilai','documents.detail'])->get(); // Calculate the page count $pageCount = ceil($totalRecords / $size); diff --git a/app/Http/Controllers/LaporanExternalController.php b/app/Http/Controllers/LaporanExternalController.php new file mode 100644 index 0000000..ea6cec1 --- /dev/null +++ b/app/Http/Controllers/LaporanExternalController.php @@ -0,0 +1,173 @@ +paginate(10); + return view('lpj::laporan_external.index', compact('laporanExternals')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + return view('lpj::laporan_external.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(LaporanExternalRequest $request) + { + $validatedData = $request->validated(); + + if ($request->hasFile('file_resume')) { + $validatedData['file_resume'] = $request->file('file_resume')->store('laporan_external/resume', 'public'); + } + + if ($request->hasFile('file_laporan')) { + $validatedData['file_laporan'] = $request->file('file_laporan')->store('laporan_external/laporan', 'public'); + } + + LaporanExternal::create($validatedData); + + return redirect()->route('laporan-external.index')->with('success', 'Laporan External berhasil ditambahkan.'); + } + + /** + * Show the specified resource. + */ + public function show(LaporanExternal $laporanExternal) + { + return view('lpj::laporan_external.show', compact('laporanExternal')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(LaporanExternal $laporanExternal) + { + $permohonan = Permohonan::find($laporanExternal->permohonan_id); + return view('lpj::laporan_external.create', compact('laporanExternal','permohonan')); + } + + /** + * Update the specified resource in storage. + */ + public function update(LaporanExternalRequest $request, LaporanExternal $laporanExternal) + { + $validatedData = $request->validated(); + + if ($request->hasFile('file_resume')) { + $validatedData['file_resume'] = $request->file('file_resume')->store('laporan_external/resume', 'public'); + } + + if ($request->hasFile('file_laporan')) { + $validatedData['file_laporan'] = $request->file('file_laporan')->store('laporan_external/laporan', 'public'); + } + + $laporanExternal->update($validatedData); + + return redirect()->route('laporan-external.index')->with('success', 'Laporan External berhasil diperbarui.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(LaporanExternal $laporanExternal) + { + $laporanExternal->delete(); + + return redirect()->route('laporan-external.index')->with('success', 'Laporan External berhasil dihapus.'); + } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('jenis_aset.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = LaporanExternal::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('nomor_laporan', 'LIKE', "%$search%") + ->orWhere('tanggal_laporan', 'LIKE', "%$search%") + ->orWhereHas('permohonan', function($q) use ($search) { + $q->where('nomor_permohonan', 'LIKE', "%$search%"); + }) + ->orWhere('tgl_final_laporan', 'LIKE', "%$search%") + ->orWhere('nilai_pasar', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_likuidasi', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_tanah', 'LIKE', "%$search%") + ->orWhere('estimasi_harga_tanah', 'LIKE', "%$search%") + ->orWhere('estimasi_harga_bangunan', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_bangunan', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_sarana_pelengkap', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_mesin', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_kendaraan_alat_berat', 'LIKE', "%$search%") + ->orWhere('file_resume', 'LIKE', "%$search%") + ->orWhere('file_laporan', 'LIKE', "%$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->get(); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 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, + ]); + } +} diff --git a/app/Http/Controllers/OtorisasiPenawaranController.php b/app/Http/Controllers/OtorisasiPenawaranController.php index 4adee4e..49deb5e 100644 --- a/app/Http/Controllers/OtorisasiPenawaranController.php +++ b/app/Http/Controllers/OtorisasiPenawaranController.php @@ -336,8 +336,9 @@ public function show($id) { - $prosespenawaran = PenawaranTender::find($id); - return view('lpj::otorisasipenawaran.show', compact('id','prosespenawaran')); + $prosespenawaran = PenawaranTender::with(['permohonan','tujuanPenilaianKjpp'])->find($id); + $permohonan = $prosespenawaran->permohonan; + return view('lpj::otorisasipenawaran.show', compact('id','prosespenawaran','permohonan')); } public function penawaranulang(Request $request, $id): JsonResponse diff --git a/app/Http/Controllers/PembayaranController.php b/app/Http/Controllers/PembayaranController.php index f6fe6de..806a411 100644 --- a/app/Http/Controllers/PembayaranController.php +++ b/app/Http/Controllers/PembayaranController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest; +use Modules\Lpj\Models\LaporanExternal; use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\PersetujuanPenawaran; @@ -235,6 +236,13 @@ class PembayaranController extends Controller 'updated_by' => Auth::id(), 'updated_at' => now(), ]); + + LaporanExternal::create([ + 'permohonan_id' => $permohonan->id, + 'nomor_laporan' => $permohonan->nomor_registrasi, + 'tanggal_laporan' => now(), + 'created_by' => Auth::id(), + ]); } } diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index 819a1d6..218ad3e 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -4,6 +4,7 @@ namespace Modules\Lpj\Http\Controllers; use Illuminate\Http\Request; use Barryvdh\DomPDF\Facade\Pdf; // https://github.com/barryvdh/laravel-dompdf +use Illuminate\Support\Facades\Storage; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Inspeksi; use Modules\Lpj\Models\Penilai; @@ -544,7 +545,9 @@ class PenilaiController extends Controller 'branch', 'tujuanPenilaian', 'jenisfasilitasKredit', - 'penilaian.userPenilai' // Ensure this relation is included + 'penilaian.userPenilai', + 'penilai', + 'nilaiPlafond' ])->get(); // Calculate the page count @@ -754,10 +757,10 @@ class PenilaiController extends Controller if (!$allComplete) { - $message = $rap - ? 'Harap Mengisi laporan terlebih dahulu' + $message = $rap + ? 'Harap Mengisi laporan terlebih dahulu' : 'Harap Mengisi laporan terlebih dahulu atau kertas kerja'; - + return response()->json([ 'success' => false, 'message' => $message, @@ -799,6 +802,18 @@ class PenilaiController extends Controller } } + public function uploadTempPhoto(Request $request) + { + if ($request->hasFile('file')) { + $file = $request->file('file'); + $filename = time() . '_' . $file->getClientOriginalName(); + $path = $file->storeAs('temp_photos', $filename, 'public'); + return response()->json(['success' => true, 'id' => $path]); + } + + return response()->json(['success' => false], 400); + } + public function storeResume(Request $request) { try { @@ -917,6 +932,59 @@ class PenilaiController extends Controller } } + public function storeMemoWithPhotos(Request $request) + { + try { + $validatedData = $request->validate([ + 'permohonan_id' => 'required|integer', + 'document_id' => 'required|integer', + 'inspeksi_id' => 'required|integer', + 'memo' => 'required', + ]); + + $memoData = json_decode($validatedData['memo'], true); + + $memo = Penilai::updateOrCreate( + [ + 'permohonan_id' => $validatedData['permohonan_id'], + 'dokument_id' => $validatedData['document_id'], + 'inspeksi_id' => $validatedData['inspeksi_id'], + ], + [ + 'memo' => json_encode($memoData), + ] + ); + + // Simpan foto-foto + if ($request->hasFile('foto_0')) { + $photoUrls = []; + $index = 0; + while ($request->hasFile("foto_$index")) { + $file = $request->file("foto_$index"); + $fileName = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('public/memo_photos', $fileName); + $photoUrls[] = Storage::url($filePath); + $index++; + } + + // Tambahkan URL foto ke data memo + $memoData['foto'] = $photoUrls; + $memo->memo = json_encode($memoData); + $memo->save(); + } + + return response()->json([ + 'success' => true, + 'message' => 'Memo dan foto berhasil disimpan', + ]); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan: ' . $e->getMessage(), + ], 500); + } + } + public function storeLpjSederhanadanStandard(Request $request) { DB::beginTransaction(); diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php index 616f5b9..4655298 100644 --- a/app/Http/Controllers/PenilaianController.php +++ b/app/Http/Controllers/PenilaianController.php @@ -891,11 +891,13 @@ class PenilaianController extends Controller public function revisiLaporan(Request $request, $id) { - $permohonan = Permohonan::find($id); - $userRole = Auth::user()->roles[0]->name; - - $authorization = Authorization::where('permohonan_id', $permohonan->id) - ->where('jenis', 'paparan')->first(); + if($request->dataHeader=='Paparan'){ + $authorization = Authorization::find($id); + $permohonan = Permohonan::find($authorization->permohonan_id); + } else { + $permohonan = Permohonan::find($id); + $userRole = Auth::user()->roles[0]->name; + } if ($permohonan->status === 'proses-paparan') { if ($authorization) { diff --git a/app/Http/Controllers/RegistrasiController.php b/app/Http/Controllers/RegistrasiController.php index 42efcea..137f10d 100644 --- a/app/Http/Controllers/RegistrasiController.php +++ b/app/Http/Controllers/RegistrasiController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Models\JenisPenilaian; +use Modules\Lpj\Models\Penilai; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Regions; use Modules\Lpj\Models\DokumenJaminan; @@ -153,7 +154,6 @@ class RegistrasiController extends Controller if ($tindakan == 0) { $dataku['jenis_penilaian_id'] = $request->jenis_penilaian; $dataku['region_id'] = $request->region; - $dataku['sla'] = $request->sla; $dataku['status'] = 'registered'; if ($request->catatan2) { $dataku['registrasi_catatan'] = $request->catatan2; @@ -168,6 +168,13 @@ class RegistrasiController extends Controller $modal = Permohonan::find($id); $modal->update($dataku); + + if($modal && $request->jenis_laporan){ + Penilai::updateOrCreate( + ['permohonan_id' => $id], + ['type' => $request->jenis_laporan] + ); + } // $data['status'] = 'success'; $data['message'] ['message_success'] = ['Regitrasi ' . $modal->nomor_registrasi . ' successfully']; @@ -209,11 +216,7 @@ class RegistrasiController extends Controller if (1 == $jenis_penilaian) { $validateIt['region'] = ['required']; $messageIt ['region.required'] = 'Silahkan pilih Region'; - } else { - $validateIt['sla'] = ['required']; - $messageIt ['sla.required'] = 'Silahkan isi SLA'; } - } elseif ($tindakan == 1) { $validateIt['catatan'] = ['required']; $messageIt ['catatan.required'] = 'Silahkan isi Catatan'; diff --git a/app/Http/Controllers/SpkController.php b/app/Http/Controllers/SpkController.php index 770944c..f5de6aa 100644 --- a/app/Http/Controllers/SpkController.php +++ b/app/Http/Controllers/SpkController.php @@ -158,7 +158,7 @@ use Illuminate\Support\Facades\Auth; $penawaran->jenis_laporan_name = $penawaran->jenisLaporan->name; $penawaran->jenis_laporan_code = $penawaran->jenisLaporan->code; $penawaran->tujuan_penilaian_kjpp_name = $penawaran->tujuanPenilaianKjpp->name; - $penawaran->penilaian_waktu_penilain = $penawaran->penilaian->waktu_penilaian; + $penawaran->penilaian_waktu_penilain = $penawaran->penilaian->waktu_penilaian ?? ""; $permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi) ->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id') @@ -244,7 +244,7 @@ use Illuminate\Support\Facades\Auth; $penawaran->jenis_laporan_name = $penawaran->jenisLaporan->name; $penawaran->jenis_laporan_code = $penawaran->jenisLaporan->code; $penawaran->tujuan_penilaian_kjpp_name = $penawaran->tujuanPenilaianKjpp->name; - $penawaran->penilaian_waktu_penilain = $penawaran->penilaian->waktu_penilaian; + $penawaran->penilaian_waktu_penilain = $penawaran->penilaian->waktu_penilaian ?? ""; $permohonan = Permohonan::where('nomor_registrasi','=',$penawaran->nomor_registrasi) ->leftJoin('dokumen_jaminan', 'dokumen_jaminan.permohonan_id','=','permohonan.id') diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index 6d5bc2d..31e0f55 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -3256,6 +3256,8 @@ class SurveyorController extends Controller private function getUnitData($data, $request): array { + + $luas_unit_key = ($data['luas_unit'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai'; $luas_unit = []; @@ -3264,11 +3266,11 @@ class SurveyorController extends Controller : ($data['luas_unit_tidak_sesuai'] ?? null); // Masukkan key baru yang sesuai - $luas_luas_unit[$luas_luas_unit_key] = preg_replace('/[^0-9.,]/', '', $hasil_luas_unit); + $luas_unit[$luas_unit_key] = preg_replace('/[^0-9.,]/', '', $hasil_luas_unit); return [ 'action' => $data['action'] ?? null, - 'luas_unit' => $luas_luas_unit, + 'luas_unit' => $luas_unit, 'kondisi_unit' => $data['kondisi_unit'] ?? null, 'posisi_unit' => $data['posisi_unit'] ?? null, 'lantai' => $data['lantai'] ?? null, diff --git a/app/Http/Requests/LaporanExternalRequest.php b/app/Http/Requests/LaporanExternalRequest.php new file mode 100644 index 0000000..1e2a4f4 --- /dev/null +++ b/app/Http/Requests/LaporanExternalRequest.php @@ -0,0 +1,41 @@ + 'required|exists:permohonan,id', + 'nomor_laporan' => 'nullable|string|max:255', + 'tgl_final_laporan' => 'nullable|date', + 'nilai_pasar' => 'nullable|numeric', + 'indikasi_nilai_likuidasi' => 'nullable|numeric', + 'indikasi_nilai_pasar_tanah' => 'nullable|numeric', + 'estimasi_harga_tanah' => 'nullable|numeric', + 'estimasi_harga_bangunan' => 'nullable|numeric', + 'indikasi_nilai_pasar_bangunan' => 'nullable|numeric', + 'indikasi_nilai_pasar_sarana_pelengkap' => 'nullable|numeric', + 'indikasi_nilai_pasar_mesin' => 'nullable|numeric', + 'indikasi_nilai_pasar_kendaraan_alat_berat' => 'nullable|numeric', + 'file_resume' => 'nullable|file|mimes:pdf|max:10240', // 10MB max + 'file_laporan' => 'nullable|file|mimes:pdf|max:10240', + ]; + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize() + : bool + { + return true; + } + } diff --git a/app/Models/LaporanExternal.php b/app/Models/LaporanExternal.php new file mode 100644 index 0000000..77a63e3 --- /dev/null +++ b/app/Models/LaporanExternal.php @@ -0,0 +1,32 @@ +belongsTo(Permohonan::class); + } +} diff --git a/database/migrations/2025_03_06_012851_create_laporan_externals_table.php b/database/migrations/2025_03_06_012851_create_laporan_externals_table.php new file mode 100644 index 0000000..032cbbc --- /dev/null +++ b/database/migrations/2025_03_06_012851_create_laporan_externals_table.php @@ -0,0 +1,47 @@ +id(); + $table->foreignIdFor(Permohonan::class)->constrained('permohonan')->onDelete('cascade'); + $table->string('nomor_laporan'); + $table->date('tgl_final_laporan')->nullable(); + $table->decimal('nilai_pasar', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_likuidasi', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_tanah', 15, 2)->nullable(); + $table->decimal('estimasi_harga_tanah', 15, 2)->nullable(); + $table->decimal('estimasi_harga_bangunan', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_bangunan', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_sarana_pelengkap', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_mesin', 15, 2)->nullable(); + $table->decimal('indikasi_nilai_pasar_kendaraan_alat_berat', 15, 2)->nullable(); + $table->string('file_resume')->nullable(); // New field for resume file + $table->string('file_laporan')->nullable(); // New field for report file + $table->timestamps(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('laporan_externals'); + } +}; diff --git a/module.json b/module.json index d656031..74efc94 100644 --- a/module.json +++ b/module.json @@ -218,6 +218,18 @@ "admin" ] }, + { + "title": "Laporan External", + "path": "laporan-external", + "icon": "ki-filled ki-document text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "admin" + ] + }, { "title": "Registrasi Final", "path": "registrasifinal", diff --git a/resources/views/activity/progres_activity/index.blade.php b/resources/views/activity/progres_activity/index.blade.php index 11c5fac..844fce5 100644 --- a/resources/views/activity/progres_activity/index.blade.php +++ b/resources/views/activity/progres_activity/index.blade.php @@ -120,8 +120,8 @@ Tgl Assign Tgl Kunjungan Progress - Due Date SLA - Paparan + SLA Laporan + SLA Paparan Approve Keterangan Action @@ -251,6 +251,15 @@ return `${window.formatTanggalIndonesia(data.due_date_sla)}`; } }, + due_date: { + title: 'Due Date SLA', + render: (item, data) => { + if (!data.due_date_sla) { + return `-`; + } + return `${window.formatTanggalIndonesia(data.due_date_sla)}`; + }, + }, paparan: { title: 'Paparan', @@ -258,7 +267,7 @@ if (!data.due_date_sla) { return `-`; } - return `${window.formatTanggalIndonesia(data.due_date_sla)}`; + return `${window.formatTanggalIndonesia(data.paparan)}`; } }, approve: { diff --git a/resources/views/component/detail-jaminan.blade.php b/resources/views/component/detail-jaminan.blade.php index 3d996ed..edba9aa 100644 --- a/resources/views/component/detail-jaminan.blade.php +++ b/resources/views/component/detail-jaminan.blade.php @@ -50,6 +50,26 @@ + @if(isset($penawaran)) +
+

+ Nomor Penawaran: +

+ + {{ $penawaran->code }} + +
+ +
+

+ Nomor Penawaran: +

+ + {{ $penawaran->tujuanPenilaianKjpp->name }} + +
+ @else +

Tujan Permohonan: @@ -77,6 +97,7 @@ {{ str_replace('_', ' ', $permohonan->status_bayar) }}

+ @endif @@ -237,12 +258,7 @@ Alamat Jaminan: - {{ $dokumen->pemilik->address ?? '' }}, -
{{ $dokumen->pemilik->village->name ?? '' }}, - {{ $dokumen->pemilik->district->name ?? '' }}, - {{ $dokumen->pemilik->city->name ?? '' }}, - {{ $dokumen->pemilik->province->name ?? '' }} - - {{ $dokumen->pemilik->village->postal_code ?? '' }} + {{ formatAlamat($dokumen) }}
@@ -267,7 +283,7 @@ @foreach (json_decode($detail->details) as $key => $value) - {{ str_replace("_"," ",$key) ?? "" }} + {{formatLabel($key)}} {{ $value ?? "" }} diff --git a/resources/views/component/form-penilai.blade.php b/resources/views/component/form-penilai.blade.php index 569476c..50824f6 100644 --- a/resources/views/component/form-penilai.blade.php +++ b/resources/views/component/form-penilai.blade.php @@ -1,4 +1,3 @@ -
@foreach ($permohonan->documents as $dokumen) @@ -17,8 +16,8 @@ @if (array_intersect($kategoriUnik, ['tanah', 'bangunan', 'apartemen-kantor'])) - @include('lpj::surveyor.components.header') - @endif + @include('lpj::surveyor.components.header') + @endif @foreach ($kategoriUnik as $kategori) {{-- Tampilkan komponen sesuai kategori --}} @@ -36,6 +35,12 @@

Informasi dan pembanding

+
+ + Edit Data Pembanding + +
@include('lpj::penilai.components.informasi-pembanding') @@ -70,6 +75,21 @@ @endphp @foreach ($kategoriUnik as $item) + @php + + if ($item === 'bangunan') { + $luas = + $forminspeksi['bangunan']['luas_tanah_bagunan']['tidak sesuai'] ?? + ($forminspeksi['bangunan']['luas_tanah_bagunan']['sesuai'] ?? null); + } elseif ($item === 'tanah') { + $luas = + $forminspeksi['tanah']['luas_tanah']['tidak sesuai'] ?? + ($forminspeksi['tanah']['luas_tanah']['sesuai'] ?? null); + } else { + $luas = null; + } + $luas = old('luas_' . $item, $lpjData['luas_' . $item] ?? $luas); + @endphp @if (isset($labelNilai[$item]))
@@ -77,16 +97,15 @@ {{ $labelNilai[$item] }}
@@ -124,7 +143,7 @@
-
+
@@ -237,7 +256,7 @@ placeholder="Nama NPW"> { + const kategori = item.id.replace('luas_', ''); const luasInput = document.getElementById(`luas_${kategori}`); const nilaiInput = document.querySelector(`input[name="nilai_${kategori}_1"]`); @@ -458,7 +478,7 @@ // Tambahkan perhitungan untuk NPW tambahan const npwRows = document.querySelectorAll('.npw-row'); npwRows.forEach(row => { - const luasInput = row.querySelector('input[id^="luas_npw_"]'); + const luasInput = row.querySelector('input[id^="ls_npw_"]'); const nilaiInput = row.querySelector('input[id^="nilai_npw_"][id$="_1"]'); const outputElement = row.querySelector('input[id^="nilai_npw_"][id$="_2"]'); @@ -475,6 +495,7 @@ // Update total nilai pasar wajar const totalElement = document.getElementById('total_nilai_pasar_wajar'); if (totalElement) { + totalElement.value = formatCurrency(totalNilaiPasarWajar.toString()); } diff --git a/resources/views/debitur/components/dokumen.blade.php b/resources/views/debitur/components/dokumen.blade.php index 1d5980d..3bfb80b 100644 --- a/resources/views/debitur/components/dokumen.blade.php +++ b/resources/views/debitur/components/dokumen.blade.php @@ -262,7 +262,16 @@ - + +
@@ -750,5 +759,75 @@ return ``; } } + + function clearDetail(detailId) { + Swal.fire({ + title: 'Apakah Anda yakin?', + text: "Anda akan menghapus detail ini!", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Ya, yakin!', + cancelButtonText: 'Batal' + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + title: 'Apakah Anda yakin?', + text: "Data yang telah di hapus tidak dapat di kembalikan", + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Ya, hapus!', + cancelButtonText: 'Batal' + }).then((result2) => { + if (result2.isConfirmed) { + // Hapus input fields + $(`input[name="detail_dokumen_jaminan_id[]"][value="${detailId}"]`).closest('.grid.gap-5').remove(); + + // Kirim request AJAX untuk menghapus data dari database + $.ajax({ + url: '{{ route("debitur.jaminan.clearDetail", $debitur->id ) }}', + type: 'POST', + data: { + _token: '{{ csrf_token() }}', + detail_id: detailId + }, + success: function (response) { + if (response.success) { + Swal.fire({ + title: 'Berhasil!', + text: 'Detail berhasil dihapus', + icon: 'success', + confirmButtonText: 'OK' + }).then((result) => { + if (result.isConfirmed) { + location.reload(); + } + }); + } else { + Swal.fire({ + title: 'Gagal!', + text: 'Detail gagal dihapus', + icon: 'error', + confirmButtonText: 'OK' + }); + } + }, + error: function () { + Swal.fire({ + title: 'Gagal!', + text: 'Terjadi kesalahan saat menghapus detail', + icon: 'error', + confirmButtonText: 'OK' + }); + } + }); + } + }); + } + }); + } @endpush diff --git a/resources/views/laporan/index.blade.php b/resources/views/laporan/index.blade.php index 788f865..27d00f4 100644 --- a/resources/views/laporan/index.blade.php +++ b/resources/views/laporan/index.blade.php @@ -93,6 +93,24 @@ @endsection @push('scripts') + + +@endpush diff --git a/resources/views/otorisasipenawaran/show.blade.php b/resources/views/otorisasipenawaran/show.blade.php index bf5d25e..de5d4ce 100644 --- a/resources/views/otorisasipenawaran/show.blade.php +++ b/resources/views/otorisasipenawaran/show.blade.php @@ -8,35 +8,19 @@ @endphp @section('content')
-
-
-

- Detail Data Otorisasi Penawaran -

- -
-
-
-

- Nomor Register Permohonan: -

- - {{ $prosespenawaran->nomor_registrasi }} - -
-
-

- Nomor Penawaran: -

- - {{ $prosespenawaran->code }} - -
-
-
+ @php + $buttonProses=''; + $buttonProses=' Otorisasi Penawaran'; + @endphp + + @include('lpj::component.detail-jaminan', [ + 'customlink' => $buttonProses, + 'backLink' => 'otorisasitender.penawaran.index', + 'title' => 'Detail Data Otorisasi Penawaran', + 'penawaran' => $prosespenawaran, + ]) + +
diff --git a/resources/views/penawaran_ulang/index.blade.php b/resources/views/penawaran_ulang/index.blade.php index 508e5aa..2bc7c37 100644 --- a/resources/views/penawaran_ulang/index.blade.php +++ b/resources/views/penawaran_ulang/index.blade.php @@ -131,7 +131,7 @@ - + `; diff --git a/resources/views/penilai/components/informasi-pembanding.blade.php b/resources/views/penilai/components/informasi-pembanding.blade.php index 2d8c34c..bb9708a 100644 --- a/resources/views/penilai/components/informasi-pembanding.blade.php +++ b/resources/views/penilai/components/informasi-pembanding.blade.php @@ -51,20 +51,19 @@
- {{ isset($item['harga_diskon']) ? formatRupiah($item['harga_diskon']) : '' }} + {{ isset($item['total']) ? formatRupiah($item['total']) : '' }}
- {{ $item['telepon'] }} + {{ $item['telepon'] ?? '' }}
-
- +
- {{ $item['penawaran'] ?? '' }} + {{ isset($item['tanggal']) ? formatTanggalIndonesia($item['tanggal']) : '' }}
diff --git a/resources/views/penilai/components/memo.blade.php b/resources/views/penilai/components/memo.blade.php index 2aefa66..fb5db32 100644 --- a/resources/views/penilai/components/memo.blade.php +++ b/resources/views/penilai/components/memo.blade.php @@ -289,6 +289,28 @@
+
+
+
+

Upload Foto

+
+ +
+
+ +
+

Drop files here or click to upload.

+ Upload up to 10 files +
+
+
+
+ +
+ {{-- @include('lpj::penilai.components.foto-lampiran') --}} @endsection @include('lpj::surveyor.js.utils') - + @endpush diff --git a/resources/views/penilai/components/print-pembanding.blade.php b/resources/views/penilai/components/print-pembanding.blade.php index a4d6f4a..f18a495 100644 --- a/resources/views/penilai/components/print-pembanding.blade.php +++ b/resources/views/penilai/components/print-pembanding.blade.php @@ -15,10 +15,9 @@ 'jenis_aset' => 'Jenis properti', 'hak_properti' => 'Status Hak Tanah', 'address' => 'Alamat Lokasi', - 'harga_penawaran' => 'Harga Penawaran', - 'harga_diskon' => 'Indikasi Harga Transaksi', + 'harga' => 'Harga Penawaran', + 'total' => 'Indikasi Harga Transaksi', 'telepon' => 'Penjual (HP)', - 'penawaran' => 'Ditawarkan Sejak', 'luas_tanah' => 'Luas Tanah', 'luas_bangunan' => 'Luas Bangunan', 'tanggal' => 'Tanggal Data', @@ -40,8 +39,11 @@ @if ($key == 'luas_tanah' || $key == 'luas_bangunan') {{ $data[$key] ?? '-' }} m² - @elseif($key == 'harga' || $key == 'harga_diskon') + @elseif($key == 'harga' || $key == 'total') {{ formatRupiah($data[$key]) ?? 0 }} + + @elseif($key == 'tanggal') + {{ formatTanggalIndonesia($data[$key]) ?? '-' }} @elseif($key == 'kordinat') @php $lat = $data['kordinat_lat'] ?? null; diff --git a/resources/views/penilai/index.blade.php b/resources/views/penilai/index.blade.php index bda05fe..cd076ef 100644 --- a/resources/views/penilai/index.blade.php +++ b/resources/views/penilai/index.blade.php @@ -60,6 +60,10 @@ Fasilitas Kredit + + Jenis Laporan + + Tanggal Survei @@ -170,16 +174,53 @@ return data.jenisfasilitas_kredit && data.jenisfasilitas_kredit.name ? `${data.jenisfasilitas_kredit.name}` : '-'; }, }, + jenis_laporan: { + title: 'Jenis Laporan', + render: (item, data) => { + return data.penilai?.type; + }, + }, tanggal_survei: { title: 'Tanggal Survei', render: (item, data) => { - return `${formatDate(new Date(data.created_at))}`; + if(data.penilaian.waktu_penilaian){ + return `${formatDate(new Date(data.penilaian.waktu_penilaian))}`; + } + return `${formatDate(new Date(data.penilaian.created_at))}`; }, }, due_date_sla: { title: 'Due Date SLA', render: (item, data) => { - return `${formatDate(new Date(data.created_at))}`; + const tujuan_penilaian = data.tujuan_penilaian.name; + const tipe_laporan = data.penilai?.type; + const nilai_plafond = data.penilaian.nilaiPlafond?.name; + let waktu_penilaian = new Date(data.penilaian.created_at); + if(data.penilaian.waktu_penilaian){ + waktu_penilaian = new Date(data.penilaian.waktu_penilaian); + } + + if(tujuan_penilaian.name==="RAP"){ + waktu_penilaian.setDate(waktu_penilaian.getDate() + 3); + } else { + if(tipe_laporan==="sederhana"){ + waktu_penilaian.setDate(waktu_penilaian.getDate() + 2); + } else if(tipe_laporan==="standar"){ + if(nilai_plafond==="2 M - 5 M"){ + waktu_penilaian.setDate(waktu_penilaian.getDate() + 3); + } else if(nilai_plafond==="< 2M"){ + waktu_penilaian.setDate(waktu_penilaian.getDate() + 3); + } else { + waktu_penilaian.setDate(waktu_penilaian.getDate() + 5); + } + } + } + + + + + return formatDate(waktu_penilaian); + }, }, status: { diff --git a/resources/views/penilai/show.blade.php b/resources/views/penilai/show.blade.php index a55abec..b6eb0e0 100644 --- a/resources/views/penilai/show.blade.php +++ b/resources/views/penilai/show.blade.php @@ -319,6 +319,11 @@
+ + Cetak Hasil Inspeksi + + @@ -401,7 +406,7 @@
- @if ($permohonan->penilai->kertas_kerja) + @if (isset($permohonan->penilai) && isset($permohonan->penilai->kertas_kerja) && $permohonan->penilai->kertas_kerja) Lihat Kertas Kerja diff --git a/resources/views/penilaian/otorisator/show.blade.php b/resources/views/penilaian/otorisator/show.blade.php index a09a60a..5a026cc 100644 --- a/resources/views/penilaian/otorisator/show.blade.php +++ b/resources/views/penilaian/otorisator/show.blade.php @@ -110,7 +110,7 @@ @endif - @if ($permohonan->authorization->approve_so && $dataHeader == 'paparan' ) + @if (isset($permohonan->authorization->approve_so) && $dataHeader == 'paparan' )

@@ -217,7 +217,7 @@ @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $authorization->approve_so == null) -