Compare commits

...

42 Commits

Author SHA1 Message Date
Daeng Deni Mardaeni
e55184591c Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-03-03 09:27:28 +07:00
majid
f928cf1d76 fix(surveyoe/penilai/so/dd/eo): penambahan akses menu dd, eo di resume dan laporan, penambahan tanggal data di data pembanding dan properti sejenis di rap 2025-03-03 09:09:22 +07:00
majid
bfc515f3ed perbaikkan foto dan tanah 2025-03-03 08:11:53 +07:00
Daeng Deni Mardaeni
e968cefe0d Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-03-03 08:00:55 +07:00
majid76
8c08b46c8f fix(penilai/surveyor): perbaikkan activity, form inspeksi, print out inspeksi dan laporan, ganti nama detail penilai ke detail penilaian 2025-03-03 01:27:44 +07:00
majid
f65b9bec23 Ffix(surveyor/penilai): perbaikkan edit foto dan call report 2025-03-01 10:25:50 +07:00
Daeng Deni Mardaeni
d51f9f902c Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-02-28 16:46:57 +07:00
putrakuningan
9a6223ac26 Merge pull request 'feature/senior-officer' (#113) from feature/senior-officer into staging
Reviewed-on: #113
2025-02-28 09:37:56 +01:00
majid
2efcf7d85c fix(so): perbaikkan view laporan di so 2025-02-28 09:37:56 +01:00
majid
025cb3d5b8 Merge branch 'staging' into feature/senior-officer 2025-02-28 15:35:43 +07:00
majid
85644362a9 fix(so): perbaikkan view laporan di so 2025-02-28 15:33:58 +07:00
putrakuningan
33162704e8 Merge pull request 'feature/senior-officer' (#112) from feature/senior-officer into staging
Reviewed-on: #112
2025-02-28 07:43:05 +01:00
majid
25735d205f fix(penilai/surveyor): perbaikkan call report, button camera, dan inspeksi berdasarkan dokument 2025-02-28 07:43:05 +01:00
majid
5389cd1d3a Merge branch 'staging' into feature/senior-officer 2025-02-28 13:37:24 +07:00
majid
2793e397b0 fix(penilai/surveyor): perbaikkan call report, button camera, dan inspeksi berdasarkan dokument 2025-02-28 13:35:42 +07:00
Daeng Deni Mardaeni
476106a58c Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-02-28 09:53:28 +07:00
majid
f253d0c14c fix(so/penilai/surveyor) : perbaikkan print out, lampiran, send email jadwal, otorisator, dan typo 2025-02-28 02:29:24 +07:00
Daeng Deni Mardaeni
cc500bfcac fix(spk): perbaiki pengolahan dokumen jaminan
- Mengubah referensi dari $data->debiture->documents menjadi $data->dokumenjaminan.
- Memperbaiki logika pengulangan untuk menampilkan dokumen jaminan.
- Menambahkan pengecekan untuk memastikan detail dokumen jaminan ditampilkan dengan benar.
2025-02-27 15:47:08 +07:00
Daeng Deni Mardaeni
03b0ba4ac0 fix(spk): perbaiki tampilan dokumen jaminan
- Memperbaiki kondisi pengecekan ID dokumen jaminan.
- Menambahkan tampilan nama detail dokumen jaminan jika ada.
- Memperbaiki format tampilan nomor dokumen dengan pemisah koma.
2025-02-27 15:38:32 +07:00
Daeng Deni Mardaeni
f6bae680af fix(spk): perbaiki pengolahan data dokumen jaminan
- Memperbaiki relasi data dokumen jaminan pada controller.
- Mengubah penghitungan total aset untuk menggunakan dokumen jaminan yang benar.
- Memperbarui tampilan untuk menampilkan dokumen jaminan dengan benar.
2025-02-27 15:26:24 +07:00
Daeng Deni Mardaeni
2759fdc8d9 fix(penawaran): perbaiki tampilan opsi pada form edit
- Menambahkan jenis kantor pada opsi yang ditampilkan.
- Menampilkan nama kota tanpa awalan 'KOTA', 'KAB.', atau 'KAB' jika jenis kantor adalah 'Kantor Cabang'.
2025-02-27 14:08:57 +07:00
Daeng Deni Mardaeni
e08130132f Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-02-27 13:19:05 +07:00
Daeng Deni Mardaeni
222ada0f0c fix(tender): perbaiki pengolahan email kantor
- Mengubah cara pengolahan email dari string menjadi koleksi untuk menghindari duplikasi.
- Memastikan bahwa detail email yang diambil dari JSON diproses dengan benar.
- Menambahkan validasi untuk memastikan bahwa detail email adalah array sebelum diakses.
2025-02-27 13:18:41 +07:00
Daeng Deni Mardaeni
e6b6ad6e2c fix(penawaran): perbaiki pengolahan email kantor
- Mengubah struktur penyimpanan email dari array menjadi Set untuk menghindari duplikasi.
- Memastikan semua email dari detail_email_kantor ditambahkan dengan benar.
- Mengonversi Set kembali menjadi array sebelum validasi email.
2025-02-27 13:17:44 +07:00
majid
7fd77dde57 penambaha sentuh tanahku 2025-02-27 12:55:37 +07:00
majid
b8a492e842 fix(so/dd/eo/penilai) : perbaikan otorisator pelaporan dan print out sedehana dan standar 2025-02-27 12:15:55 +07:00
majid
fbabb2efaa Merge branch 'staging' into feature/senior-officer 2025-02-27 10:20:03 +07:00
majid
2a475a9ea7 fix(so/penilai) : perbaikkan paparan dan resume 2025-02-27 10:18:31 +07:00
Daeng Deni Mardaeni
ecbeb15d2f fix(penilai): perbaikan query status 2025-02-26 14:52:51 +07:00
majid
6102205900 perbaikan status 2025-02-26 14:46:21 +07:00
majid
a8be1591c3 fix(survey/penilai) : perbaikkan print resume dan resume 2025-02-26 14:45:05 +07:00
majid
94fc66a48f fix(penilai/so) : perbaikkan nilai resume dan sla activity 2025-02-26 12:08:55 +07:00
majid
88bd409d42 fix(so): perbaikan filter laporan 2025-02-26 10:56:15 +07:00
majid
222cbd8df8 delete file data.json 2025-02-26 10:07:34 +07:00
majid
77189701d6 fix(surveyor): perbaikkan upload foto duplikat 2025-02-26 09:38:52 +07:00
majid
3d7da22ac0 fix(penilai): perbaikan lpj standart dan sederhana 2025-02-26 06:27:39 +07:00
majid
18ec35f272 Merge branch 'staging' into feature/senior-officer 2025-02-26 05:13:39 +07:00
majid
7766d127e0 fix(suveyor/penilai/so): perbaikan print out, form survey dan laporan dan paparan 2025-02-26 05:07:25 +07:00
Daeng Deni Mardaeni
9d29cb3540 Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-02-25 13:53:23 +07:00
Daeng Deni Mardaeni
009cdf2955 fix(pembatalan): perbaiki akses data permohonan dengan optional chaining
- Menggunakan optional chaining untuk menghindari error jika data permohonan tidak ada.
- Memperbaiki pengambilan nomor registrasi, nama debitur, dan cabang.
2025-02-25 13:51:43 +07:00
majid
2045da36d8 Merge branch 'staging' into feature/senior-officer 2025-02-25 08:51:02 +07:00
majid
dfa364cdd8 fix(survyor/penilai): perbaikan view print-resume, lampiran, foto-lampiran, foto, header, main dan controller penilai dan surveyor 2025-02-25 08:50:03 +07:00
68 changed files with 4114 additions and 3419 deletions

View File

@@ -392,7 +392,7 @@ class ActivityController extends Controller
$q->where('user_id', $id); $q->where('user_id', $id);
}) })
->whereHas('permohonan', function ($q) { ->whereHas('permohonan', function ($q) {
$q->whereIn('status', ['assign', 'proses-laporan', 'done', 'proses-survey', 'request-reschedule', 'reschedule', 'rejected-reschedule', 'approved-reschedule', 'revisi-laporan', 'survey']); $q->whereNotIn('status', ['done']);
}); });

View File

@@ -75,7 +75,7 @@ class LaporanController extends Controller
} }
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query()->whereIn('status',['proses-laporan','done'])->whereNotNull('approval_so_at')->whereNotNull('approval_eo_at')->where(function ($q) { $query = Permohonan::query()->whereIn('status',['proses-laporan','done', 'paparan', 'proses-paparan'])->whereNotNull('approval_so_at')->whereNotNull('approval_eo_at')->where(function ($q) {
$q->whereIn('nilai_plafond_id', [1,4]) $q->whereIn('nilai_plafond_id', [1,4])
->whereNotNull('approval_dd_at') ->whereNotNull('approval_dd_at')
->orWhereIn('nilai_plafond_id', [2,3]); ->orWhereIn('nilai_plafond_id', [2,3]);

View File

@@ -27,11 +27,13 @@
return view('lpj::pembayaran.index'); return view('lpj::pembayaran.index');
} }
public function approval() { public function approval()
{
return view('lpj::pembayaran.approval'); return view('lpj::pembayaran.approval');
} }
public function dataApprovalForDatatables(Request $request) { public function dataApprovalForDatatables(Request $request)
{
if (is_null($this->user) || !$this->user->can('noc.view')) { if (is_null($this->user) || !$this->user->can('noc.view')) {
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.'); //abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
} }
@@ -105,7 +107,7 @@
]); ]);
} }
function edit($id) public function edit($id)
{ {
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
return view('lpj::pembayaran.form', compact('permohonan')); return view('lpj::pembayaran.form', compact('permohonan'));
@@ -157,8 +159,8 @@
->route('pembayaran.index')->with('success', 'Pembayaran berhasil disimpan.'); ->route('pembayaran.index')->with('success', 'Pembayaran berhasil disimpan.');
} }
public function update(Request $request, $id) public function update(Request $request, $id): JsonResponse
: JsonResponse { {
// init // init
$data = []; $data = [];
$output = []; $output = [];
@@ -179,11 +181,31 @@
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
if ($permohonan) { if ($permohonan) {
if ($request->type === 'revisi') {
$data['status_bayar'] = 'belum_bayar';
} else {
$data['status_bayar'] = 'sudah_bayar'; $data['status_bayar'] = 'sudah_bayar';
}
if ($permohonan->jenis_penilaian_id == 2) { if ($permohonan->jenis_penilaian_id == 2) {
$data['status'] = 'spk'; $data['status'] = 'spk';
} }
if ($permohonan->jenis_penilaian_id == 1) {
unset(
$data['approval_so'],
$data['approval_so_at'],
$data['approval_eo'],
$data['approval_eo_at'],
$data['approval_dd'],
$data['approval_dd_at'],
$data['keterangan']
);
$data['status'] = 'proses-laporan';
}
$permohonan->update($data); $permohonan->update($data);
if ($permohonan->jenis_penilaian_id == 2) { if ($permohonan->jenis_penilaian_id == 2) {

View File

@@ -82,6 +82,7 @@ class PenilaiController extends Controller
$inspeksiId = $request->query('inspeksiId'); $inspeksiId = $request->query('inspeksiId');
$permohonan = $this->surveyorController->getPermohonanJaminanId($id, $documentId, $jaminanId); $permohonan = $this->surveyorController->getPermohonanJaminanId($id, $documentId, $jaminanId);
$basicData = $this->surveyorController->getCommonData(); $basicData = $this->surveyorController->getCommonData();
$provinces = Province::all();
$noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj'); $noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj');
@@ -107,7 +108,7 @@ class PenilaiController extends Controller
$lpjData = json_decode($lpj->lpj, true); $lpjData = json_decode($lpj->lpj, true);
} }
return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData')); return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData', 'provinces'));
} }
public function standard(Request $request, $id) public function standard(Request $request, $id)
@@ -121,7 +122,7 @@ class PenilaiController extends Controller
$basicData = $this->surveyorController->getCommonData(); $basicData = $this->surveyorController->getCommonData();
$noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj'); $noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj');
$provinces = Province::all();
$inspeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $documentId)->first(); $inspeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $documentId)->first();
$lpj = Penilai::updateOrCreate( $lpj = Penilai::updateOrCreate(
[ [
@@ -144,7 +145,7 @@ class PenilaiController extends Controller
$lpjData = json_decode($lpj->lpj, true); $lpjData = json_decode($lpj->lpj, true);
} }
return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData')); return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData', 'provinces'));
} }
public function resume(Request $request) public function resume(Request $request)
@@ -274,18 +275,28 @@ class PenilaiController extends Controller
] ]
); );
if ($request->hasFile('file_paparan')) { if ($request->hasFile('file_paparan')) {
// Menyimpan atau memperbarui data Penilai
$penilai = Penilai::updateOrCreate(
[
'permohonan_id' => $request->permohonan_id,
'dokument_id' => $request->documentId,
'inspeksi_id' => $request->inspeksiId,
]
);
// Menyimpan fil
$file = $request->file('file_paparan'); $file = $request->file('file_paparan');
$path = $file->store('public/file_paparan'); $path = $file->store('public/file_paparan');
$penilai = Penilai::where('permohonan_id', $id)->first();
$penilai->file_paparan = $path; $penilai->file_paparan = $path;
$penilai->save(); $penilai->save();
} }
return redirect() return redirect()
->route('penilai.show', ['id' => $id])->with('success', 'diperbarui ke status paparan dan dikirim ke So untuk proses lebih lanjut.'); ->route('penilai.show', ['id' => $id])->with('success', 'diperbarui ke status paparan dan dikirim ke So untuk proses lebih lanjut.');
} catch (\Exception $e) { } catch (\Exception $e) {
return redirect()->route('penilai.show', ['id' => $id])->with('error', 'Terjadi kesalahan saat memproses permohonan.'); return redirect()->route('penilai.show', ['id' => $id])->with('error', 'Terjadi kesalahan saat memproses permohonan.');
} }
@@ -424,11 +435,8 @@ class PenilaiController extends Controller
if ($call && isset($call->call_report)) { if ($call && isset($call->call_report)) {
$callReport = json_decode($call->call_report, true); $callReport = json_decode($call->call_report, true);
} }
$forminspeksi = null;
if ($forminspeksi) {
$forminspeksi = json_decode($inspeksi->data_form, true); $forminspeksi = json_decode($inspeksi->data_form, true);
}
// Default: gunakan data dari debitur // Default: gunakan data dari debitur
$debitur = Debiture::find($permohonan->debiture_id); $debitur = Debiture::find($permohonan->debiture_id);
@@ -449,6 +457,7 @@ class PenilaiController extends Controller
$villages = Village::where('district_code', $districtCode)->get(); $villages = Village::where('district_code', $districtCode)->get();
if ($forminspeksi) { if ($forminspeksi) {
if (isset($forminspeksi['alamat']['sesuai']['province_code'])) { if (isset($forminspeksi['alamat']['sesuai']['province_code'])) {
$cities = City::where('province_code', $forminspeksi['alamat']['sesuai']['province_code'])->get(); $cities = City::where('province_code', $forminspeksi['alamat']['sesuai']['province_code'])->get();
} }
@@ -462,7 +471,6 @@ class PenilaiController extends Controller
} }
} }
return view('lpj::penilai.components.call-report', compact('permohonan', 'basicData', 'nomorLaporan', 'forminspeksi', 'cities', 'districts', 'villages', 'cekAlamat', 'callReport')); return view('lpj::penilai.components.call-report', compact('permohonan', 'basicData', 'nomorLaporan', 'forminspeksi', 'cities', 'districts', 'villages', 'cekAlamat', 'callReport'));
} }
@@ -496,7 +504,7 @@ class PenilaiController extends Controller
}); });
} }
$query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ?)', ['assign','survey-completed', 'proses-laporan', 'paparan', 'proses-paparan','paparan']); $query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ?,?, ?)', ['assign', 'survey-completed', 'proses-laporan', 'paparan', 'proses-paparan', 'paparan', 'revisi-laporan', 'revisi-paparan']);
if (!Auth::user()->hasRole('administrator')) { if (!Auth::user()->hasRole('administrator')) {
$query->whereHas('penilaian.userPenilai', function ($q) { $query->whereHas('penilaian.userPenilai', function ($q) {
@@ -740,7 +748,8 @@ class PenilaiController extends Controller
!empty($item->memo) || !empty($item->memo) ||
!empty($item->resume) || !empty($item->resume) ||
!empty($item->lpj) || !empty($item->lpj) ||
!empty($item->rap) !empty($item->rap) ||
!empty($item->call_report)
) && !empty($item->kertas_kerja); ) && !empty($item->kertas_kerja);
}); });
@@ -762,7 +771,6 @@ class PenilaiController extends Controller
'success' => true, 'success' => true,
'message' => 'Berhasil Megirim reported ke so' 'message' => 'Berhasil Megirim reported ke so'
], 200); ], 200);
} catch (\Exception $e) { } catch (\Exception $e) {
return response()->json([ return response()->json([
'success' => false, 'success' => false,
@@ -775,20 +783,23 @@ class PenilaiController extends Controller
public function storeResume(Request $request) public function storeResume(Request $request)
{ {
try { try {
// dd($request->all());
$validatedData = $request->validate([ $validatedData = $request->validate([
'permohonan_id' => 'required', 'permohonan_id' => 'required',
'document_id' => 'required', 'dokument_id' => 'required',
'inspeksi_id' => 'required', 'inspeksi_id' => 'required',
'resume' => 'required|array', 'resume' => 'required|array',
'fakta_positif' => 'nullable|array',
'fakta_negatif' => 'nullable|array',
'type' => 'required',
'action' => 'required',
'keterangan' => 'nullable|array'
]); ]);
// Simpan atau update data
Penilai::updateOrCreate( Penilai::updateOrCreate(
[ [
'permohonan_id' => $validatedData['permohonan_id'], 'permohonan_id' => $validatedData['permohonan_id'],
'dokument_id' => $validatedData['document_id'], 'dokument_id' => $validatedData['dokument_id'],
'inspeksi_id' => $validatedData['inspeksi_id'], 'inspeksi_id' => $validatedData['inspeksi_id'],
], ],
[ [
@@ -796,10 +807,51 @@ class PenilaiController extends Controller
] ]
); );
$inspeksi = Inspeksi::where('permohonan_id', $validatedData['permohonan_id'])
->where('dokument_id', $validatedData['dokument_id'])
->first();
if ($inspeksi) {
// Get existing data_form
$existingData = json_decode($inspeksi->data_form, true) ?: [];
// Structure the fakta data correctly
$existingFaktaData = $existingData['fakta'] ?? [];
// Gabungkan data baru dengan data yang sudah ada
$updatedFaktaData = array_merge($existingFaktaData, [
'fakta_positif' => $validatedData['fakta_positif'] ?? $existingFaktaData['fakta_positif'] ?? null,
'fakta_negatif' => $validatedData['fakta_negatif'] ?? $existingFaktaData['fakta_negatif'] ?? null,
'keterangan' => $validatedData['keterangan'] ?? $existingFaktaData['keterangan'] ?? null,
]);
$existingData['fakta'] = $updatedFaktaData;
$inspeksi->update([
'data_form' => json_encode($existingData),
]);
} else {
// If inspeksi
$newData = [
'fakta' => [
'fakta_positif' => $validatedData['fakta_positif'] ?? null,
'fakta_negatif' => $validatedData['fakta_negatif'] ?? null,
'keterangan' => $validatedData['keterangan'] ?? null,
],
];
Inspeksi::create([
'permohonan_id' => $validatedData['permohonan_id'],
'dokument_id' => $validatedData['dokument_id'],
'data_form' => json_encode($newData),
'name' => $validatedData['type']
]);
}
return response()->json([ return response()->json([
'success' => true, 'success' => true,
'message' => 'Berhasil saved resume' 'message' => 'Berhasil saved resume',
], 200); ], 200);
} catch (\Exception $e) { } catch (\Exception $e) {
return response()->json([ return response()->json([
@@ -985,7 +1037,6 @@ class PenilaiController extends Controller
'trace' => $e->getTraceAsString() 'trace' => $e->getTraceAsString()
], 500); ], 500);
} }
} }
public function storeCallReport(Request $request) public function storeCallReport(Request $request)
@@ -997,10 +1048,15 @@ class PenilaiController extends Controller
'permohonan_id' => 'required|exists:permohonan,id', 'permohonan_id' => 'required|exists:permohonan,id',
'dokument_id' => 'required', 'dokument_id' => 'required',
'inspeksi_id' => 'required', 'inspeksi_id' => 'required',
'data' => 'required' 'data' => 'required',
'fakta_positif' => 'nullable|array',
'fakta_negatif' => 'nullable|array',
'type' => 'required',
'action' => 'required',
'keterangan' => 'nullable|array',
]); ]);
$data = $request->input('data');
Penilai::updateOrCreate( Penilai::updateOrCreate(
[ [
@@ -1012,11 +1068,51 @@ class PenilaiController extends Controller
'call_report' => json_encode($validated['data']), 'call_report' => json_encode($validated['data']),
] ]
); );
$inspeksi = Inspeksi::where('permohonan_id', $validated['permohonan_id'])
->where('dokument_id', $validated['dokument_id'])
->first();
if ($inspeksi) {
// Get existing data_form
$existingData = json_decode($inspeksi->data_form, true) ?: [];
// Structure the fakta data correctly
$existingFaktaData = $existingData['fakta'] ?? [];
// Gabungkan data baru dengan data yang sudah ada
$updatedFaktaData = array_merge($existingFaktaData, [
'fakta_positif' => $validated['fakta_positif'] ?? $existingFaktaData['fakta_positif'] ?? null,
'fakta_negatif' => $validated['fakta_negatif'] ?? $existingFaktaData['fakta_negatif'] ?? null,
'keterangan' => $validated['keterangan'] ?? $existingFaktaData['keterangan'] ?? null,
]);
$existingData['fakta'] = $updatedFaktaData;
$inspeksi->update([
'data_form' => json_encode($existingData),
]);
} else {
// If inspeksi
$newData = [
'fakta' => [
'fakta_positif' => $validated['fakta_positif'] ?? null,
'fakta_negatif' => $validated['fakta_negatif'] ?? null,
'keterangan' => $validated['keterangan'] ?? null,
],
];
Inspeksi::create([
'permohonan_id' => $validated['permohonan_id'],
'dokument_id' => $validated['dokument_id'],
'data_form' => json_encode($newData),
'name' => $validated['type']
]);
}
// DB::commit(); // DB::commit();
return response()->json([ return response()->json([
'success' => true, 'success' => true,
'message' => 'Berhasil menyimpan data', 'message' => 'Berhasil menyimpan data',
'data' => $data
], 200); ], 200);
} catch (\Throwable $e) { } catch (\Throwable $e) {
// DB::rollBack(); // DB::rollBack();
@@ -1136,12 +1232,10 @@ class PenilaiController extends Controller
$pdf->setPaper('A4', 'portrait'); $pdf->setPaper('A4', 'portrait');
return $pdf->download('Laporan_' . $tipeLaporan . '_' . $permohonan->debiture->name . '_' . $cleanNomorLaporan . '_data.pdf'); return $pdf->download('Laporan_' . $tipeLaporan . '_' . $permohonan->debiture->name . '_' . $cleanNomorLaporan . '_data.pdf');
} }
} catch (\Exception $e) { } catch (\Exception $e) {
Log::error('PDF generation failed: ' . $e->getMessage()); Log::error('PDF generation failed: ' . $e->getMessage());
return response()->json(['error' => 'Failed to generate PDF. Please check the log for details.' . $e->getMessage()], 500); return response()->json(['error' => 'Failed to generate PDF. Please check the log for details.' . $e->getMessage()], 500);
} }
} }
private function getViewLaporan($tipe) private function getViewLaporan($tipe)
@@ -1332,8 +1426,6 @@ class PenilaiController extends Controller
$validationRules = [ $validationRules = [
'resume' => [ 'resume' => [
'fakta.fakta_positif',
'fakta.fakta_negatif',
'fisik' 'fisik'
], ],
]; ];
@@ -1363,7 +1455,7 @@ class PenilaiController extends Controller
// Validasi struktur data di dalam array // Validasi struktur data di dalam array
foreach ($value as $item) { foreach ($value as $item) {
$requiredKeys = ['sertifikat', 'luas_tanah', 'luas_bangunan', 'nilai']; $requiredKeys = ['sertifikat', 'luas_tanah', 'nilai'];
foreach ($requiredKeys as $requiredKey) { foreach ($requiredKeys as $requiredKey) {
if (!isset($item[$requiredKey])) { if (!isset($item[$requiredKey])) {
$missingFields[] = $field . '.' . $requiredKey; $missingFields[] = $field . '.' . $requiredKey;
@@ -1498,5 +1590,18 @@ class PenilaiController extends Controller
} }
public function revisiSurveyor(Request $request, $id)
{
$permohonan = Permohonan::findOrFail($id);
$permohonan->update([
'status' => 'revisi-survey',
'keterangan' => $request->message,
'submitted_at' => now()
]);
return response()->json([
'success' => true,
'message' => 'Berhasil Revisi Ke surveyor',
], 200);
}
} }

View File

@@ -17,6 +17,7 @@ use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\Teams; use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\Inspeksi; use Modules\Lpj\Models\Inspeksi;
use Modules\Lpj\Models\Penilai; use Modules\Lpj\Models\Penilai;
use Modules\Lpj\Models\Regions;
use Modules\Location\Models\Province; use Modules\Location\Models\Province;
use Modules\Location\Models\City; use Modules\Location\Models\City;
use Modules\Location\Models\District; use Modules\Location\Models\District;
@@ -96,6 +97,7 @@ class PenilaianController extends Controller
} }
} else { } else {
$teams_ids[] = $validatedData['teams_id'];
$user_ids[] = $validatedData['surveyor_id']; $user_ids[] = $validatedData['surveyor_id'];
} }
@@ -136,13 +138,14 @@ class PenilaianController extends Controller
$user_ids[] = $validatedData['penilai_surveyor_id']; $user_ids[] = $validatedData['penilai_surveyor_id'];
} }
} else { } else {
$teams_ids[] = $validatedData['teams_id'];
$user_ids[] = $validatedData['penilai_id']; $user_ids[] = $validatedData['penilai_id'];
} }
$roles[] = 'penilai'; $roles[] = 'penilai';
} }
// dd($teams_ids, $user_ids); // dd($validatedData['penilai_region_id'],$validatedData['teams_id']);
foreach ($teams_ids as $key => $teams_id) { foreach ($teams_ids as $key => $teams_id) {
PenilaianTeam::create([ PenilaianTeam::create([
'penilaian_id' => $validatedData['penilaian_id'], 'penilaian_id' => $validatedData['penilaian_id'],
@@ -153,13 +156,11 @@ class PenilaianController extends Controller
} }
if ($validatedData['surveyor_id'] === 'pilih_dari_region' || $validatedData['penilai_id'] === 'pilih_dari_region' || $validatedData['penilai_surveyor_id'] === 'pilih_dari_region') { if ($validatedData['surveyor_id'] === 'pilih_dari_region' || $validatedData['penilai_id'] === 'pilih_dari_region' || $validatedData['penilai_surveyor_id'] === 'pilih_dari_region') {
$status = $permohonan->status; $status = 'reassign';
} else { } else {
$status = 'assign'; $status = 'assign';
} }
$permohonan->update([ $permohonan->update([
'status' => $status, 'status' => $status,
]); ]);
@@ -344,7 +345,7 @@ class PenilaianController extends Controller
}); });
} }
$query->whereIn('status', ['registered', 'registrasi-final']); $query->whereIn('status', ['registered', 'registrasi-final', 'reassign']);
// Filter berdasarkan role // Filter berdasarkan role
if (Auth::user()->roles[0]->name !== 'administrator') { if (Auth::user()->roles[0]->name !== 'administrator') {
@@ -404,6 +405,8 @@ class PenilaianController extends Controller
'paparan' => 'Paparan' 'paparan' => 'Paparan'
]; ];
$regions = Regions::all();
$header = $headers[$type] ?? 'Pelaporan'; $header = $headers[$type] ?? 'Pelaporan';
switch ($header) { switch ($header) {
@@ -412,7 +415,7 @@ class PenilaianController extends Controller
case 'Paparan': case 'Paparan':
return view('lpj::penilaian.paparan-so', compact('header')); return view('lpj::penilaian.paparan-so', compact('header'));
default: default:
return view('lpj::penilaian.otorisator.index', compact('header')); return view('lpj::penilaian.otorisator.index', compact('header', 'regions'));
} }
} }
@@ -491,27 +494,22 @@ class PenilaianController extends Controller
break; break;
case 'pelaporan': case 'pelaporan':
if (Auth::user()->roles[0]->name === 'senior-officer') { $role = Auth::user()->roles[0]->name;
$permohonan->update([ $status = 'done';
'status' => 'proses-laporan', $approvalField = null;
'approval_so' => Auth::user()->id, if ($role === 'senior-officer') {
'approval_so_at' => now(), $approvalField = 'approval_so';
'keterangan' => $request->message, $status = in_array($permohonan->nilai_plafond_id, [3]) ? 'done' : 'proses-laporan';
]); } elseif ($role === 'EO Appraisal') {
} elseif (Auth::user()->roles[0]->name === 'EO Appraisal') { $approvalField = 'approval_eo';
$permohonan->update([ $status = in_array($permohonan->nilai_plafond_id, [2, 1]) ? 'done' : 'proses-laporan';
'status' => 'proses-laporan', } elseif ($role === 'DD Appraisal') {
'approval_eo' => Auth::user()->id, $approvalField = 'approval_dd';
'approval_eo_at' => now(), $status = 'done';
'keterangan' => $request->message, }
]);
} elseif (Auth::user()->roles[0]->name === 'DD Appraisal') { if ($approvalField) {
$permohonan->update([ $this->updatePermohonan($permohonan, $status, $approvalField, $request->message);
'status' => 'done',
'approval_dd' => Auth::user()->id,
'approval_dd_at' => now(),
'keterangan' => $request->message,
]);
} }
break; break;
@@ -610,6 +608,15 @@ class PenilaianController extends Controller
]); ]);
} }
public function updatePermohonan($permohonan, $status, $approvalField, $message)
{
$permohonan->update([
'status' => $status,
$approvalField => Auth::user()->id,
"{$approvalField}_at" => now(),
'keterangan' => $message,
]);
}
public function dataForAuthorization(Request $request, $otorisator) public function dataForAuthorization(Request $request, $otorisator)
{ {
@@ -634,6 +641,7 @@ class PenilaianController extends Controller
// Pencarian berdasarkan parameter search // Pencarian berdasarkan parameter search
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$query->where(function ($q) use ($search) { $query->where(function ($q) use ($search) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
@@ -641,6 +649,7 @@ class PenilaianController extends Controller
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('region', 'name', 'LIKE', '%' . $search . '%');
$q->orWhere('status', 'LIKE', '%' . $search . '%'); $q->orWhere('status', 'LIKE', '%' . $search . '%');
}); });
} }
@@ -661,11 +670,27 @@ class PenilaianController extends Controller
} }
// Filter berdasarkan region user yang login // Filter berdasarkan region user yang login
// if ($status == 'proses-laporan') {
// $requestedRegion = $request->get('search');
// if ($requestedRegion) {
// $query->whereHas('region', function ($q) use ($requestedRegion) {
// $q->where('name', $requestedRegion);
// });
// } else {
// $query->whereHas('region.teams.teamsUsers', function ($q) {
// $q->where('user_id', Auth::id());
// });
// }
// } else {
if (Auth::user()->hasRole('senior-officer')) { if (Auth::user()->hasRole('senior-officer')) {
$query->whereHas('region.teams.teamsUsers', function ($q) { $query->whereHas('region.teams.teamsUsers', function ($q) {
$q->where('user_id', Auth::id()); $q->where('user_id', Auth::id());
}); });
} }
// }
// Sorting berdasarkan sortField dan sortOrder // Sorting berdasarkan sortField dan sortOrder
@@ -763,6 +788,7 @@ class PenilaianController extends Controller
if ($lpj) { if ($lpj) {
$lpjData = json_decode($lpj->lpj, true); $lpjData = json_decode($lpj->lpj, true);
$resumeData = json_decode($lpj->resume, true); $resumeData = json_decode($lpj->resume, true);
$callReport = json_decode($lpj->call_report, true);
if (isset($lpj->memo)) { if (isset($lpj->memo)) {
$memo = json_decode($lpj->memo); $memo = json_decode($lpj->memo);
} }
@@ -790,7 +816,7 @@ class PenilaianController extends Controller
return redirect()->back()->with('error', 'Laporan belum dibuat'); return redirect()->back()->with('error', 'Laporan belum dibuat');
} }
return view('lpj::' . $viewLaporan, compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData', 'provinces', 'resumeData', 'rap', 'memo', 'cities', 'districts', 'villages', 'formFoto', 'formPeta', 'nomorLaporan', 'penilai')); return view('lpj::' . $viewLaporan, compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData', 'provinces', 'resumeData', 'rap', 'memo', 'cities', 'districts', 'villages', 'formFoto', 'formPeta', 'nomorLaporan', 'penilai', 'callReport'));
} }
private function getViewLaporan($tipe) private function getViewLaporan($tipe)
@@ -800,7 +826,8 @@ class PenilaianController extends Controller
'standard' => 'penilai.components.lpj-sederhana-standard', 'standard' => 'penilai.components.lpj-sederhana-standard',
'resume' => 'penilai.components.resume', 'resume' => 'penilai.components.resume',
'memo' => 'penilai.components.memo', 'memo' => 'penilai.components.memo',
'rap' => 'penilai.components.rap-penilai' 'rap' => 'penilai.components.rap-penilai',
'call-report' => 'penilai.components.call-report',
]; ];
return $viewMap[$tipe] ?? ''; return $viewMap[$tipe] ?? '';
} }
@@ -862,15 +889,48 @@ class PenilaianController extends Controller
public function revisiLaporan(Request $request, $id) public function revisiLaporan(Request $request, $id)
{ {
$permohonan = Permohonan::findOrFail($id); $permohonan = Permohonan::findOrFail($id);
$userRole = Auth::user()->roles[0]->name;
if ($permohonan->status === 'proses-paparan' && in_array($userRole, ['EO Appraisal', 'DD Appraisal'])) {
Authorization::delete([
'permohonan_id' => $permohonan->id,
'jenis' => 'paparan',
'request' => 'paparan',
]);
$status = 'revisi-paparan';
} elseif ($permohonan->status === 'proses-laporan' && $userRole === 'EO Appraisal') {
$permohonan->update([ $permohonan->update([
'status' => 'revisi-laporan', 'approve_so' => null,
'approve_so_at' => null,
]);
$status = 'revisi-laporan';
} elseif ($permohonan->status === 'proses-laporan' && $userRole === 'DD Appraisal') {
$permohonan->update([
'approve_so' => null,
'approve_so_at' => null,
'approve_eo' => null,
'approve_eo_at' => null,
]);
$status = 'revisi-laporan';
} else {
return response()->json([
'success' => false,
'message' => 'Tidak ada tindakan yang dapat dilakukan untuk status saat ini.',
], 400);
}
// Perbarui status dan informasi lainnya
$permohonan->update([
'status' => $status,
'keterangan' => $request->message, 'keterangan' => $request->message,
'submitted_at' => now() 'submitted_at' => now(),
]); ]);
return response()->json([ return response()->json([
'success' => true, 'success' => true,
'message' => 'Berhasil Revisi Laporan penilai', 'message' => 'Berhasil Revisi Laporan penilai.',
], 200); ], 200);
} }
} }

View File

@@ -175,7 +175,7 @@ use Illuminate\Support\Facades\Auth;
->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name', ->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name',
'dokumen_jaminan.address as dokumen_jaminan_address'); 'dokumen_jaminan.address as dokumen_jaminan_address');
$data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian','dokumenjaminan'])->first(); $data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian','dokumenjaminan.detail'])->first();
if($penawaran->detail_penawaran_tgl_proposal) if($penawaran->detail_penawaran_tgl_proposal)
$penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y'); $penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y');

View File

@@ -79,16 +79,20 @@ use Modules\Lpj\Models\LaluLintasLokasi;
use Modules\Lpj\Models\SpekBagunanAnalisaDetail; use Modules\Lpj\Models\SpekBagunanAnalisaDetail;
use Modules\Lpj\Http\Requests\SurveyorRequest; use Modules\Lpj\Http\Requests\SurveyorRequest;
use Modules\Lpj\Http\Requests\FormSurveyorRequest; use Modules\Lpj\Http\Requests\FormSurveyorRequest;
use Modules\Lpj\Emails\SendJadwalKunjunganEmail; use Modules\Lpj\Jobs\SendJadwalKunjunganEmailJob;
use App\Helpers\Lpj; use App\Helpers\Lpj;
use Modules\Lpj\Models\Authorization; use Modules\Lpj\Models\Authorization;
use Modules\Lpj\Services\SurveyorValidateService;
class SurveyorController extends Controller class SurveyorController extends Controller
{ {
public $user; public $user;
public $validateService;
public function __construct(SurveyorValidateService $validateService)
{
$this->validateService = $validateService;
}
public function index() public function index()
{ {
@@ -156,11 +160,12 @@ class SurveyorController extends Controller
/** /**
* Store form inspeksi. * Store form inspeksi.
*/ */
public function store(FormSurveyorRequest $request) public function store(Request $request)
{ {
try { try {
// Validate request data // Validate request data
$validatedData = $request->validated(); $validatedData = $request->all();
// Get action specific rules and process data // Get action specific rules and process data
$processedData = $this->getActionSpecificRules( $processedData = $this->getActionSpecificRules(
@@ -237,6 +242,9 @@ class SurveyorController extends Controller
$rules = []; $rules = [];
$hasAssetDescriptionRules = false; $hasAssetDescriptionRules = false;
$hasFactaData = false; $hasFactaData = false;
$pisah = array_filter( $pisah = array_filter(
explode(',', $action), explode(',', $action),
function ($act) use ($allowedActions) { function ($act) use ($allowedActions) {
@@ -244,22 +252,29 @@ class SurveyorController extends Controller
} }
); );
// dd($pisah);
foreach ($pisah as $act) { foreach ($pisah as $act) {
$act = trim($act); $act = trim($act); // Bersihkan spasi
if (isset($allowedActions[$act])) {
$method = $allowedActions[$act]; $method = $allowedActions[$act];
$actionRules = $this->$method($data, $request); $actionRules = $this->$method($data, $request);
$rules = array_merge($rules, $actionRules); $rules = array_merge($rules, $actionRules);
// Cek apakah act memerlukan asset description rules
if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan', 'rap'])) { if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan', 'rap'])) {
$hasAssetDescriptionRules = true; $hasAssetDescriptionRules = true;
} }
// Cek apakah act memerlukan fakta data
if (in_array($act, ['rap'])) { if (in_array($act, ['rap'])) {
$hasFactaData = true; $hasFactaData = true;
} }
} }
}
if ($hasAssetDescriptionRules) { if ($hasAssetDescriptionRules) {
$rules = array_merge($rules, $this->getAssetData($data)); $rules = array_merge($rules, $this->getAssetData($data));
} }
@@ -492,7 +507,6 @@ class SurveyorController extends Controller
if ($request->hasFile($paramName)) { if ($request->hasFile($paramName)) {
$files = $request->file($paramName); $files = $request->file($paramName);
// Pastikan $files adalah array
if (!is_array($files)) { if (!is_array($files)) {
$files = [$files]; $files = [$files];
} }
@@ -500,23 +514,49 @@ class SurveyorController extends Controller
$formatFotoData = []; $formatFotoData = [];
$nomor_registrasi = $request->nomor_registrasi; $nomor_registrasi = $request->nomor_registrasi;
$batchTimestamp = time();
$existingFilePaths = [];
if (isset($formatFotojson[$paramName]) && is_array($formatFotojson[$paramName])) {
foreach ($formatFotojson[$paramName] as $existingFile) {
if (isset($existingFile['path'])) {
$existingFilePaths[] = $existingFile['path'];
}
}
}
foreach ($files as $index => $file) { foreach ($files as $index => $file) {
$timestamp = time();
$originalName = $file->getClientOriginalName(); $originalName = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension(); $extension = $file->getClientOriginalExtension();
// Validasi nama file $fileNameWithoutExt = pathinfo($originalName, PATHINFO_FILENAME);
if (empty($originalName)) {
$originalName = "file_{$timestamp}"; if (empty($fileNameWithoutExt)) {
$fileNameWithoutExt = "file_{$batchTimestamp}_{$index}";
} }
$uniqueFileName = "{$timestamp}.{$extension}";
// Simpan file $safeFileName = preg_replace('/[^a-zA-Z0-9_-]/', '_', $fileNameWithoutExt);
$nomor_registrasi = $request->nomor_registrasi; $uniqueFileName = "{$batchTimestamp}_{$index}_{$safeFileName}.{$extension}";
$path = $file->storeAs("surveyor/{$paramName}/{$nomor_registrasi}", $uniqueFileName, 'public'); $path = "surveyor/{$paramName}/{$nomor_registrasi}/{$uniqueFileName}";
if (in_array($path, $existingFilePaths)) {
$counter = 1;
do {
$uniquePath = "surveyor/{$paramName}/{$nomor_registrasi}/{$batchTimestamp}_{$index}_{$safeFileName}_{$counter}.{$extension}";
$counter++;
} while (in_array($uniquePath, $existingFilePaths));
$path = $uniquePath;
}
$savedPath = $file->storeAs('', $path, 'public');
$existingFilePaths[] = $path;
// Add file data
$fotoData = [ $fotoData = [
'name' => pathinfo($originalName, PATHINFO_FILENAME), 'name' => $fileNameWithoutExt,
'path' => $path, 'path' => $savedPath,
'category' => 'lainnya', 'category' => 'lainnya',
'sub' => null, 'sub' => null,
'description' => null, 'description' => null,
@@ -527,6 +567,8 @@ class SurveyorController extends Controller
$formatFotoData[] = $fotoData; $formatFotoData[] = $fotoData;
} }
// Only update if we have new photos to add
if (!empty($formatFotoData)) {
// Struktur JSON yang konsisten // Struktur JSON yang konsisten
if (!isset($formatFotojson[$paramName])) { if (!isset($formatFotojson[$paramName])) {
$formatFotojson[$paramName] = $formatFotoData; $formatFotojson[$paramName] = $formatFotoData;
@@ -537,9 +579,9 @@ class SurveyorController extends Controller
); );
} }
return $formatFotoData; return $formatFotoData;
} }
}
return []; return [];
} }
@@ -632,6 +674,52 @@ class SurveyorController extends Controller
]); ]);
} }
public function saveEditedImage(Request $request)
{
try {
$request->validate([
'edited_image' => 'required|string',
'original_path' => 'required|string',
'nomor_registrasi' => 'required',
]);
// Decode base64 image
$base64Image = $request->input('edited_image');
if (str_contains($base64Image, ';base64,')) {
[$metadata, $base64Image] = explode(';base64,', $base64Image);
}
$decodedImage = base64_decode($base64Image);
if (!$decodedImage) {
return response()->json([
'status' => 'error',
'message' => 'Gambar tidak valid',
], 400);
}
// Path asli
$originalPath = $request->input('original_path');
$fileName = basename($originalPath);
$newFilePath = 'surveyor/upload_foto/'. $request->input('nomor_registrasi') . '/' . $fileName;
// Simpan file ke storage
Storage::disk('public')->put($newFilePath, $decodedImage);
return response()->json([
'status' => 'success',
'message' => 'Gambar berhasil disimpan',
'file_path' => $newFilePath,
], 200);
} catch (\Exception $e) {
return response()->json([
'status' => 'error',
'message' => 'Terjadi kesalahan: ' . $e->getMessage(),
], 500);
}
}
private function findFotoByParamName($fotoForm, $paramName) private function findFotoByParamName($fotoForm, $paramName)
{ {
// Mapping parameter name ke struktur JSON // Mapping parameter name ke struktur JSON
@@ -699,80 +787,6 @@ class SurveyorController extends Controller
return false; return false;
} }
public function hapusLantai(Request $request)
{
$permohonanId = $request->permohonan_id;
$dokumentId = $request->dokument_id;
// Normalisasi path foto
$cleanRequestPath = str_replace(['storage/', 'surveyor/'], '', $request->foto_path);
$inspeksi = Inspeksi::firstOrNew(
['permohonan_id' => $permohonanId, 'dokument_id' => $dokumentId]
);
$fotoLantaiUnit = json_decode($inspeksi->foto_form, true);
// Konversi lantai ke string untuk konsistensi
$lantai = (string)$request->lantai;
// Cek apakah lantai ada di array
$pat = null;
if (isset($fotoLantaiUnit['foto_lantai_unit'][$lantai])) {
// Filter foto, hapus foto yang sesuai
$fotoLantaiUnit['foto_lantai_unit'][$lantai] = array_filter(
$fotoLantaiUnit['foto_lantai_unit'][$lantai],
function ($foto) use ($cleanRequestPath) {
// Normalisasi path foto yang tersimpan
$storedPath = str_replace(['storage/', 'surveyor/'], '', $foto['path']);
// Jika path cocok, hapus file dari storage
if ($storedPath === $cleanRequestPath) {
// Hapus file dari storage dengan berbagai kemungkinan path
$possiblePaths = [
'storage/surveyor/lantai_unit/' . $cleanRequestPath,
'storage/surveyor/' . $cleanRequestPath,
'storage/' . $cleanRequestPath,
$cleanRequestPath
];
foreach ($possiblePaths as $path) {
if (Storage::disk('public')->exists($path)) {
Storage::disk('public')->delete($path);
break;
}
}
return false; // Hapus dari array
}
return true;
}
);
// Reset index array
$fotoLantaiUnit['foto_lantai_unit'][$lantai] = array_values($fotoLantaiUnit['foto_lantai_unit'][$lantai]);
// Hapus lantai jika tidak ada foto
if (empty($fotoLantaiUnit['foto_lantai_unit'][$lantai])) {
unset($fotoLantaiUnit['foto_lantai_unit'][$lantai]);
}
// Update inspeksi
$inspeksi->foto_form = json_encode($fotoLantaiUnit);
$inspeksi->save();
return response()->json([
'success' => true,
'foto_lantai_unit' => $pat
]);
}
return response()->json([
'success' => false,
'message' => 'gagal menghapus'
], 404);
}
private function generateUniqueFileName($file, $prefix = '') private function generateUniqueFileName($file, $prefix = '')
{ {
@@ -797,7 +811,7 @@ class SurveyorController extends Controller
'permohonan_id' => 'required', 'permohonan_id' => 'required',
'dokument_id' => 'required', 'dokument_id' => 'required',
'nomor_registrasi' => 'required', 'nomor_registrasi' => 'required',
'foto_rute.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg,webp,bmp,tiff,heic,heif|max:'. $maxSize, 'upload_foto.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg,webp,bmp,tiff,heic,heif|max:'. $maxSize,
]); ]);
} }
@@ -808,6 +822,7 @@ class SurveyorController extends Controller
$buttonStatusCheck = $this->checkButtonStatus($id); $buttonStatusCheck = $this->checkButtonStatus($id);
$buttonStatus = json_decode($buttonStatusCheck->getContent(), true); $buttonStatus = json_decode($buttonStatusCheck->getContent(), true);
// Check if button should be disabled // Check if button should be disabled
if ($buttonStatus['buttonDisable']) { if ($buttonStatus['buttonDisable']) {
return response()->json([ return response()->json([
@@ -816,19 +831,57 @@ class SurveyorController extends Controller
], 422); ], 422);
} }
$inspeksiRecords = Inspeksi::with(['dokument.jenisJaminan'])
->where('permohonan_id', $id)
->get();
$validateConfig = [
'tanah' => 'validateTanah',
'bangunan' => 'validateBangunan',
'lingkungan' => 'validateLingkungan',
'fakta' => 'validateFactData',
'rap' => 'validateRapData',
];
// Ambil data inspeksi
$inspeksiRecords = Inspeksi::with(['dokument.jenisJaminan'])
->where('permohonan_id', $id)
->get();
foreach ($inspeksiRecords as $inspeksi) {
$cekname = $inspeksi->name;
// Pecah nama menjadi array
$names = array_map('trim', explode(',', $cekname));
$dataForm = json_decode($inspeksi->data_form, true);
foreach ($names as $name) {
// Validasi hanya untuk nama yang ada dalam konfigurasi
if (array_key_exists($name, $validateConfig)) {
$validateMethod = $validateConfig[$name];
$invalidFields = $this->validateService->{$validateMethod}($dataForm);
// Jika validasi gagal, kembalikan respons error
if ($invalidFields) {
return response()->json([
'success' => false,
'message' => ucfirst($name) . ' tidak valid: ' . implode(', ', $invalidFields),
], 422);
}
}
}
}
// If validation passes, update permohonan status // If validation passes, update permohonan status
$permohonan = Permohonan::findOrFail($id); $permohonan = Permohonan::findOrFail($id);
$permohonan->update([ $permohonan->update([
'status' => 'survey-completed', 'status' => 'survey-completed',
'submitted_at' => now() 'submitted_at' => now()
]); ]);
return response()->json([ return response()->json([
'success' => true, 'success' => true,
'message' => 'Form surveyor berhasil disubmit' 'message' => 'Form surveyor berhasil disubmit'
@@ -903,7 +956,7 @@ class SurveyorController extends Controller
} }
public function storeJadwal(Request $request) public function storeJadwal(Request $request, $id)
{ {
try { try {
$validate = $request->validate([ $validate = $request->validate([
@@ -912,7 +965,15 @@ class SurveyorController extends Controller
'deskripsi_penilaian' => 'required' 'deskripsi_penilaian' => 'required'
]); ]);
$penilaian = Penilaian::findOrFail($validate['id']); $penilaian = Penilaian::findOrFail($id);
if (Carbon::parse($validate['waktu_penilaian']) <= Carbon::parse($penilaian->tanggal_kunjungan)) {
return response()->json([
'success' => false,
'message' => 'Waktu penilaian harus lebih besar dari tanggal assign.'
], 422);
}
$emailData = [ $emailData = [
'email' => $penilaian->permohonan->user->email, 'email' => $penilaian->permohonan->user->email,
@@ -921,28 +982,26 @@ class SurveyorController extends Controller
]; ];
Mail::to($emailData['email'])->send(new SendJadwalKunjunganEmail($emailData, $penilaian->permohonan->nomor_resitrasi, $penilaian->permohonan->debiture)); SendJadwalKunjunganEmailJob::dispatch($emailData);
if (Carbon::parse($validate['waktu_penilaian']) <= Carbon::parse($penilaian->tanggal_kunjungan)) {
return redirect()
->route('surveyor.index')
->with('error', 'Waktu penilaian harus lebih besar dari tanggal assign.');
}
$penilaian->update([ $penilaian->update([
'waktu_penilaian' => $validate['waktu_penilaian'], 'waktu_penilaian' => $validate['waktu_penilaian'],
'deskripsi_penilaian' => $validate['deskripsi_penilaian'], 'deskripsi_penilaian' => $validate['deskripsi_penilaian'],
]); ]);
return response()->json([
return redirect() 'success' => true,
->route('surveyor.index') 'message' => 'Berhasil kirim jadwal kunjungan'
->with('success', 'Jadwal berhasil dibuat.'); ], 200);
} catch (\Exception $e) { } catch (\Exception $e) {
\Log::error('Error sending email: ' . $e->getMessage());
return redirect() return response()->json([
->route('surveyor.index') 'success' => false,
->with('error', 'Internal Server Error: ' . $e->getMessage()); 'message' => 'Terjadi kesalahan',
'error' => $e->getMessage()
], 500);
} }
} }
@@ -1031,7 +1090,7 @@ class SurveyorController extends Controller
'address', 'village_code', 'district_code', 'city_code', 'province_code', 'address', 'village_code', 'district_code', 'city_code', 'province_code',
'nama', 'type','warna','lokasi', 'total', 'diskon', 'harga_diskon', 'nama', 'type','warna','lokasi', 'total', 'diskon', 'harga_diskon',
'sumber_data', 'harga', 'tahun','transmisi','telepon', 'sumber_data', 'harga', 'tahun','transmisi','telepon',
'kordinat_lat', 'kordinat_lng', 'tahun_pembuatan','merek_buatan','kapasitas','power','kondisi' 'kordinat_lat', 'kordinat_lng', 'tahun_pembuatan','merek_buatan','kapasitas','power','kondisi','tanggal'
]; ];
@@ -1041,7 +1100,7 @@ class SurveyorController extends Controller
'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan', 'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan',
'status_nara_sumber', 'harga', 'harga_diskon', 'diskon', 'total', 'nama_nara_sumber', 'status_nara_sumber', 'harga', 'harga_diskon', 'diskon', 'total', 'nama_nara_sumber',
'peruntukan', 'penawaran', 'telepon','hak_properti', 'peruntukan', 'penawaran', 'telepon','hak_properti',
'kordinat_lat', 'kordinat_lng', 'jenis_aset','foto_objek' 'kordinat_lat', 'kordinat_lng', 'jenis_aset','foto_objek','tanggal'
]; ];
} }
@@ -1096,7 +1155,7 @@ class SurveyorController extends Controller
'address', 'village_code', 'district_code', 'city_code', 'province_code', 'address', 'village_code', 'district_code', 'city_code', 'province_code',
'luas_tanah', 'luas_tanah_bagunan', 'total', 'diskon', 'harga_diskon', 'luas_tanah', 'luas_tanah_bagunan', 'total', 'diskon', 'harga_diskon',
'status_nara_sumber', 'harga', 'nama_nara_sumber','hak_properti','telepon', 'status_nara_sumber', 'harga', 'nama_nara_sumber','hak_properti','telepon',
'kordinat_lat', 'kordinat_lng', 'jenis_aset','penawaran', 'kordinat_lat', 'kordinat_lng', 'jenis_aset','penawaran', 'tanggal',
]; ];
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
@@ -1436,7 +1495,8 @@ class SurveyorController extends Controller
'type' => $request->input('type'), 'type' => $request->input('type'),
'dokument_id' => $request->input('dokument_id'), 'dokument_id' => $request->input('dokument_id'),
'objek_penilaian' => $objekPenilaian, 'objek_penilaian' => $objekPenilaian,
'data_pembanding' => $this->formatDataPembanding($request) 'data_pembanding' => $this->formatDataPembanding($request),
'keterangan' => $request->input('keterangan')
]; ];
@@ -2026,7 +2086,7 @@ class SurveyorController extends Controller
}); });
} }
$query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ? ,?,?)', ['assign', 'survey', 'proses-survey', 'request-reschedule', 'reschedule', 'rejected-reschedule', 'approved-reschedule', 'revisi-laporan' ]); $query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ? ,?,?)', ['assign', 'survey', 'proses-survey', 'request-reschedule', 'reschedule', 'rejected-reschedule', 'approved-reschedule', 'revisi-survey' ]);
if (!Auth::user()->hasRole('administrator')) { if (!Auth::user()->hasRole('administrator')) {
@@ -2347,7 +2407,7 @@ class SurveyorController extends Controller
'province_code' => $data['province_code'] ?? null, 'province_code' => $data['province_code'] ?? null,
]; ];
$alamatKey = ($data['alamat_sesuai'] === 'sesuai') ? 'sesuai' : 'tidak sesuai'; $alamatKey = ($data['alamat_sesuai'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai';
$alamat = []; $alamat = [];
// Masukkan key baru yang sesuai // Masukkan key baru yang sesuai
@@ -2356,21 +2416,27 @@ class SurveyorController extends Controller
'asset' => [ 'asset' => [
'debitur_perwakilan' => $data['debitur_perwakilan'] ?? [], 'debitur_perwakilan' => $data['debitur_perwakilan'] ?? [],
'jenis_asset' => [ 'jenis_asset' => [
$data['jenis_asset'] => ($data['jenis_asset'] === 'sesuai') $data['jenis_asset'] ?? null => ($data['jenis_asset'] ?? null) === 'sesuai'
? $data['jenis_asset_name'] ? ($data['jenis_asset_name'] ?? null)
: ($data['jenis_asset_tidak_sesuai'] ?? null) : ($data['jenis_asset_tidak_sesuai'] ?? null)
], ],
'alamat' => $alamat, 'alamat' => $alamat,
'hub_cadeb' => [ 'hub_cadeb' => [
$data['hub_cadeb'] => ($data['hub_cadeb'] == 'sesuai') ? $data['hub_cadeb_sesuai'] : $data['hub_cadeb_tidak_sesuai'] $data['hub_cadeb'] ?? null => ($data['hub_cadeb'] ?? null) === 'sesuai'
? ($data['hub_cadeb_sesuai'] ?? null)
: ($data['hub_cadeb_tidak_sesuai'] ?? null)
], ],
'hub_cadeb_penghuni' => [ 'hub_cadeb_penghuni' => [
$data['hub_cadeb_penghuni'] => ($data['hub_cadeb_penghuni'] == 'sesuai') ? $data['hub_cadeb_penghuni_sesuai'] : $data['hub_penghuni_tidak_sesuai'] $data['hub_cadeb_penghuni'] ?? null => ($data['hub_cadeb_penghuni'] ?? null) === 'sesuai'
? ($data['hub_cadeb_penghuni_sesuai'] ?? null)
: ($data['hub_penghuni_tidak_sesuai'] ?? null)
], ],
'pihak_bank' => $data['pihak_bank'] ?? null, 'pihak_bank' => $data['pihak_bank'] ?? null,
'kordinat_lng' => $data['kordinat_lng'] ?? null, 'kordinat_lng' => $data['kordinat_lng'] ?? null,
'kordinat_lat' => $data['kordinat_lat'] ?? null, 'kordinat_lat' => $data['kordinat_lat'] ?? null,
'nomor_nib' => $data['nomor_nib'] ?? null
] ]
]; ];
} }
@@ -2378,17 +2444,23 @@ class SurveyorController extends Controller
private function getTanahData(array $data): array private function getTanahData(array $data): array
{ {
//luas tanah key //luas tanah key
$luas_tanah_key = ($data['luas_tanah'] === 'sesuai') ? 'sesuai' : 'tidak sesuai'; // Luas tanah key
$luas_tanah_key = ($data['luas_tanah'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai';
$luas_tanah = []; $luas_tanah = [];
$hasil_tanah = $luas_tanah_key === 'sesuai' ? $data['luas_tanah_sesuai'] : $data['luas_tanah_tidak_sesuai']; $hasil_tanah = $luas_tanah_key === 'sesuai'
? ($data['luas_tanah_sesuai'] ?? null)
: ($data['luas_tanah_tidak_sesuai'] ?? null);
$luas_tanah[$luas_tanah_key] = $hasil_tanah; $luas_tanah[$luas_tanah_key] = $hasil_tanah;
// hadap mata angin // Hadap mata angin key
$hadap_mata_angin_key = ($data['hadap_mata_angin'] === 'sesuai') ? 'sesuai' : 'tidak sesuai'; $hadap_mata_angin_key = ($data['hadap_mata_angin'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai';
$hadap_mata_angin = []; $hadap_mata_angin = [];
$hasil_hadap_mata_angin = $hadap_mata_angin_key === 'sesuai' ? $data['hadap_mata_angin_sesuai'] : $data['hadap_mata_angin_tidak_sesuai']; $hasil_hadap_mata_angin = $hadap_mata_angin_key === 'sesuai'
? ($data['hadap_mata_angin_sesuai'] ?? null)
: ($data['hadap_mata_angin_tidak_sesuai'] ?? null);
$hadap_mata_angin[$hadap_mata_angin_key] = $hasil_hadap_mata_angin; $hadap_mata_angin[$hadap_mata_angin_key] = $hasil_hadap_mata_angin;
return [ return [
'tanah' => [ 'tanah' => [
'luas_tanah' => $luas_tanah, 'luas_tanah' => $luas_tanah,
@@ -2467,14 +2539,17 @@ class SurveyorController extends Controller
$luas_tanah_bagunan_key = ($data['luas_tanah_bagunan'] === 'sesuai') ? 'sesuai' : 'tidak sesuai'; $luas_tanah_bagunan_key = ($data['luas_tanah_bagunan'] ?? null) === 'sesuai' ? 'sesuai' : 'tidak sesuai';
$luas_tanah_bagunan = []; $luas_tanah_bagunan = [];
$hasil_tanah_bagunan = $luas_tanah_bagunan_key === 'sesuai' ? $data['luas_bangunan_sesuai'] : $data['luas_tanah_bagunan_tidak_sesuai']; $hasil_tanah_bagunan = $luas_tanah_bagunan_key === 'sesuai'
? ($data['luas_bangunan_sesuai'] ?? null)
: ($data['luas_tanah_bagunan_tidak_sesuai'] ?? null);
// Masukkan key baru yang sesuai // Masukkan key baru yang sesuai
$luas_tanah_bagunan[$luas_tanah_bagunan_key] = $hasil_tanah_bagunan; $luas_tanah_bagunan[$luas_tanah_bagunan_key] = $hasil_tanah_bagunan;
return [ return [
'bangunan' => [ 'bangunan' => [
'luas_tanah_bagunan' => $luas_tanah_bagunan, 'luas_tanah_bagunan' => $luas_tanah_bagunan,
@@ -2513,10 +2588,11 @@ class SurveyorController extends Controller
false, false,
'lainnya' 'lainnya'
), ),
'disekitar_lokasi' => $data['disekitar_lokasi'] === 'yes' ? [ 'disekitar_lokasi' => ($data['disekitar_lokasi'] ?? null) === 'yes' ? [
'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null, 'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null, 'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
] : $data['disekitar_lokasi'], ] : ($data['disekitar_lokasi'] ?? null),
'kondisi_bagunan_disekitar_lokasi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null, 'kondisi_bagunan_disekitar_lokasi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
'sifat_bagunan_disekitar_lokasi' => $data['sifat_bagunan_disekitar_lokasi'] ?? null, 'sifat_bagunan_disekitar_lokasi' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
'dekat_makam' => $data['dekat_makam'] ?? null, 'dekat_makam' => $data['dekat_makam'] ?? null,
@@ -2566,7 +2642,8 @@ class SurveyorController extends Controller
'foto_gistaru', 'foto_gistaru',
'foto_bhumi', 'foto_bhumi',
'foto_argis_region', 'foto_argis_region',
'foto_tempat' 'foto_tempat',
'foto_sentuh_tanahku'
]; ];
if ($inspeksi) { if ($inspeksi) {
@@ -2574,16 +2651,17 @@ class SurveyorController extends Controller
foreach ($fotoTypes as $fotoType) { foreach ($fotoTypes as $fotoType) {
// Jika ada file baru diupload // Jika ada file baru diupload
if ($request->hasFile($fotoType)) { if ($request->hasFile($fotoType)) {
$factData[$fotoType] = $this->updateOrDeleteFile($dataForm, $request, $fotoType); $factData[$fotoType] = $this->updateOrDeleteFile($dataForm, $request, $fotoType) ?: null;
} else { } else {
$factData[$fotoType] = $dataForm[$fotoType] ?? null; $factData[$fotoType] = $dataForm[$fotoType] ?? null;
} }
} }
} else { } else {
foreach ($fotoTypes as $fotoType) { foreach ($fotoTypes as $fotoType) {
$factData[$fotoType] = $this->updateOrDeleteFile($data, $request, $fotoType); $factData[$fotoType] = $this->updateOrDeleteFile($data, $request, $fotoType) ?: null;
} }
} }
return $factData; return $factData;
} }
@@ -2698,6 +2776,7 @@ class SurveyorController extends Controller
'target_market' => $data['target_market'] ?? null, 'target_market' => $data['target_market'] ?? null,
'kerjasama_dengan_bank' => $data['kerjasama_dengan_bank'] ?? null, 'kerjasama_dengan_bank' => $data['kerjasama_dengan_bank'] ?? null,
'rute_menuju_lokasi' => $data['rute_menuju_lokasi'] ?? null, 'rute_menuju_lokasi' => $data['rute_menuju_lokasi'] ?? null,
'properti_sejenis' => $data['properti_sejenis'] ?? null,
]; ];
return $rapData; return $rapData;

View File

@@ -700,15 +700,17 @@ class TenderController extends Controller
$kjpps = KJPP::whereIn('id', $detail_penawaran) $kjpps = KJPP::whereIn('id', $detail_penawaran)
->get() ->get()
->map(function ($item) { ->map(function ($item) {
$emails = [$item->email_kantor]; $emails = collect(explode(',', $item->email_kantor))->filter()->unique();
// Parse JSON string jika ada dan tidak kosong // Parse JSON string jika ada dan tidak kosong
if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') { if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') {
$detail_emails = json_decode($item->detail_email_kantor, true); $detail_emails = json_decode($item->detail_email_kantor, true);
if (is_array($detail_emails)) { if (is_array($detail_emails)) {
foreach ($detail_emails as $detail) { foreach ($detail_emails as $detail) {
if (isset($detail['email_kantor'])) { if (is_array($detail) && isset($detail['email_kantor'])) {
$emails[] = $detail['email_kantor']; $emails->push($detail['email_kantor']);
} elseif (is_string($detail)) {
$emails->push($detail);
} }
} }
} }
@@ -716,10 +718,11 @@ class TenderController extends Controller
return [ return [
'kjpp' => $item, 'kjpp' => $item,
'emails' => array_filter($emails) 'emails' => array_filter($emails->unique()->values()->all())
]; ];
}); });
foreach ($permohonan->documents as $document) { foreach ($permohonan->documents as $document) {
$village_permohonan = $document->village_code; $village_permohonan = $document->village_code;
$district_permohonan = $document->district_code; $district_permohonan = $document->district_code;
@@ -896,23 +899,27 @@ class TenderController extends Controller
$kjpps = KJPP::whereIn('id', $detail_penawaran) $kjpps = KJPP::whereIn('id', $detail_penawaran)
->get() ->get()
->map(function ($item) { ->map(function ($item) {
$emails = [$item->email_kantor]; $emails = collect(explode(',', $item->email_kantor))->filter()->unique();
// Parse JSON string jika ada dan tidak kosong // Parse JSON string jika ada dan tidak kosong
if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') { if (!empty($item->detail_email_kantor) && $item->detail_email_kantor !== '[]') {
$detail_emails = json_decode($item->detail_email_kantor, true); $detail_emails = json_decode($item->detail_email_kantor, true);
if (is_array($detail_emails)) { if (is_array($detail_emails)) {
foreach ($detail_emails as $detail) { foreach ($detail_emails as $detail) {
if (isset($detail['email_kantor'])) { if (is_array($detail) && isset($detail['email_kantor'])) {
$emails[] = $detail['email_kantor']; $emails->add($detail['email_kantor']);
} elseif (is_string($detail)) {
$emails->add($detail);
} }
} }
} }
} }
return array_filter($emails); return array_filter(array_values(iterator_to_array($emails)));
}) })
->flatten() ->flatten()
->unique()
->values()
->toArray(); ->toArray();
$dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first(); $dp1 = PenawaranDetailTender::with('kjpp')->where('kjpp_rekanan_id', '=', $id)->first();

View File

@@ -577,11 +577,11 @@ class FormSurveyorRequest extends FormRequest
'alamat_sesuai' => 'required', 'alamat_sesuai' => 'required',
'alamat_tidak_sesuai' => 'nullable|string', 'alamat_tidak_sesuai' => 'nullable|string',
'pihak_bank' => 'nullable|string', 'pihak_bank' => 'nullable|string',
'nomor_nib' => 'nullable|string',
'hub_cadeb' => 'required', 'hub_cadeb' => 'nullable|string',
'hub_cadeb_sesuai' => 'nullable|string', 'hub_cadeb_sesuai' => 'nullable|string',
'hub_cadeb_tidak_sesuai' => 'nullable|string', 'hub_cadeb_tidak_sesuai' => 'nullable|string',
'hub_cadeb_penghuni' => 'required', 'hub_cadeb_penghuni' => 'nullable',
'hub_cadeb_penghuni_sesuai' => 'nullable|string', 'hub_cadeb_penghuni_sesuai' => 'nullable|string',
'hub_penghuni_tidak_sesuai' => 'nullable|string', 'hub_penghuni_tidak_sesuai' => 'nullable|string',

View File

@@ -0,0 +1,33 @@
<?php
namespace Modules\Lpj\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Modules\Lpj\Emails\SendJadwalKunjunganEmail;
use Illuminate\Support\Facades\Mail;
class SendJadwalKunjunganEmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $emailData;
/**
* Create a new job instance.
*/
public function __construct(array $emailData)
{
$this->emailData = $emailData;
}
/**
* Execute the job.
*/
public function handle(): void
{
Mail::to($this->emailData['email'])->send(new SendJadwalKunjunganEmail($this->emailData));
}
}

View File

@@ -0,0 +1,392 @@
<?php
namespace Modules\Lpj\Services;
class SurveyorValidateService
{
/**
* Validasi data asset
*
* @param array $assetData
* @return string
*/
public function validateAsset(array $assetData): array
{
$invalidFields = [];
// Validasi data `debitur_perwakilan`
if (empty($assetData['asset']['debitur_perwakilan'])) {
$invalidFields[] = 'debitur perwakilan';
}
// Validasi data `jenis_asset`
$jenisAsset = $assetData['asset']['jenis_asset'] ?? [];
foreach ($jenisAsset as $key => $value) {
if (empty($key) || empty($value)) {
$invalidFields[] = "jenis_asset[$key]";
}
}
// Validasi data `alamat`
$alamat = $assetData['asset']['alamat'] ?? [];
foreach ($alamat as $key => $alamatData) {
if (empty($key)) {
$invalidFields[] = "alamat[$key]";
}
foreach ($alamatData as $field => $value) {
if (empty($value)) {
$invalidFields[] = "alamat[$key][$field]";
}
}
}
// Validasi data `hub_cadeb`
$hubCadeb = $assetData['asset']['hub_cadeb'] ?? [];
foreach ($hubCadeb as $key => $value) {
if (empty($key) || empty($value)) {
$invalidFields[] = "Hubungan cadeb/debitur dengan Pemilik Jaminan";
}
}
// Validasi data `hub_cadeb_penghuni`
$hubCadebPenghuni = $assetData['asset']['hub_cadeb_penghuni'] ?? [];
foreach ($hubCadebPenghuni as $key => $value) {
if (empty($key) || empty($value)) {
$invalidFields[] = "Hubungan Cadeb/Debitur dengan Penghuni Jaminan";
}
}
// Validasi data tambahan lainnya
$fieldsToValidate = [
'pihak_bank',
'kordinat_lng',
'kordinat_lat',
'nomor_nib',
];
foreach ($fieldsToValidate as $field) {
if (empty($assetData['asset'][$field])) {
$invalidFields[] = $field;
}
}
// validasi signature
$signature = [
'penilai',
'cabang',
'debitur',
];
foreach ($signature as $value) {
if (empty($assetData['signature'][$value])) {
$invalidFields[] = 'Tanda tangan' . $value . ' tidak ada';
}
}
// Kembalikan daftar field yang tidak valid
return $invalidFields;
}
public function validateTanah(array $data): array
{
$invalidFields = [];
if (empty($data['tanah']['luas_tanah'])) {
$invalidFields[] = 'luas tanah';
}
if (empty($data['tanah']['hadap_mata_angin'])) {
$invalidFields[] = 'hadap mata angin';
}
// Validasi bentuk tanah
if (empty($data['tanah']['bentuk_tanah'])) {
$invalidFields[] = 'bentuk tanah';
}
// Validasi kontur tanah
if (empty($data['tanah']['kontur_tanah'])) {
$invalidFields[] = 'kontur tanah';
}
// Validasi ketinggian tanah
if (empty($data['tanah']['ketinggian_jalan']) && empty($data['tanah']['ketinggian_lebih_tinggi']) && empty($data['tanah']['ketinggian_lebih_rendah'])) {
$invalidFields[] = 'ketinggian tanah';
}
// Validasi kontur jalan
if (empty($data['tanah']['kontur_jalan'])) {
$invalidFields[] = 'kontur jalan';
}
// Validasi posisi kavling
if (empty($data['tanah']['posisi_kavling'])) {
$invalidFields[] = 'posisi kavling';
}
// Validasi tusuk sate
if (!isset($data['tanah']['tusuk_sate'])) {
$invalidFields[] = 'tusuk sate';
}
// Validasi lockland
if (!isset($data['tanah']['lockland'])) {
$invalidFields[] = 'lockland';
}
// Validasi kondisi fisik tanah
if (empty($data['tanah']['kondisi_fisik_tanah'])) {
$invalidFields[] = 'kondisi fisik tanah';
}
return $invalidFields;
}
public function validateBangunan(array $data): array
{
$invalidFields = [];
// Validasi luas tanah banguna
if (empty($data['bangunan']['luas_tanah_bagunan'])) {
$invalidFields[] = 'luas bangunan';
}
// Validasi jenis bangunan
if (empty($data['bangunan']['jenis_bangunan'])) {
$invalidFields[] = 'jenis bangunan';
}
// Validasi kondisi bangunan
if (empty($data['bangunan']['kondisi_bangunan'])) {
$invalidFields[] = 'kondisi bangunan';
}
// Validasi sifat bangunan
if (empty($data['bangunan']['sifat_bangunan'])) {
$invalidFields[] = 'sifat bangunan';
}
// Validasi sifat bangunan input
if (empty($data['bangunan']['sifat_bangunan_input'])) {
$invalidFields[] = 'sifat bangunan input';
}
// Validasi sarana pelengkap
if (empty($data['bangunan']['sarana_pelengkap'])) {
$invalidFields[] = 'sarana pelengkap';
}
// Validasi sarana pelengkap input
if (empty($data['bangunan']['sarana_pelengkap_input'])) {
$invalidFields[] = 'sarana pelengkap input';
}
return $invalidFields;
}
public function validateLingkungan(array $data): array
{
$invalidFields = [];
// Validasi jarak jalan utama
if (empty($data['lingkungan']['jarak_jalan_utama'])) {
$invalidFields[] = 'jarak jalan utama';
}
// Validasi jalan lingkungan
if (empty($data['lingkungan']['jalan_linkungan'])) {
$invalidFields[] = 'jalan lingkungan';
}
// Validasi jarak CBD point
if (empty($data['lingkungan']['jarak_cbd_point'])) {
$invalidFields[] = 'jarak CBD point';
}
// Validasi nama CBD point
if (empty($data['lingkungan']['nama_cbd_point'])) {
$invalidFields[] = 'nama CBD point';
}
// Validasi lebar perkerasan jalan
if (empty($data['lingkungan']['lebar_perkerasan_jalan'])) {
$invalidFields[] = 'lebar perkerasan jalan';
}
// Validasi perkerasan jalan
if (empty($data['lingkungan']['perkerasan_jalan'])) {
$invalidFields[] = 'perkerasan jalan';
}
// Validasi lalu lintas
if (empty($data['lingkungan']['lalu_lintas'])) {
$invalidFields[] = 'lalu lintas';
}
// Validasi golongan masyarakat sekitar
if (empty($data['lingkungan']['gol_mas_sekitar'])) {
$invalidFields[] = 'golongan masyarakat sekitar';
}
// Validasi tingkat keramaian
if (empty($data['lingkungan']['tingkat_keramaian'])) {
$invalidFields[] = 'tingkat keramaian';
}
// Validasi terletak di area
if (empty($data['lingkungan']['terletak_diarea'])) {
$invalidFields[] = 'terletak di area';
}
// Validasi lokasi sekitar
if (isset($data['lingkungan']['disekitar_lokasi']) && $data['lingkungan']['disekitar_lokasi'] === 'yes') {
if (empty($data['lingkungan']['kondisi_bagunan_disekitar_lokasi'])) {
$invalidFields[] = 'kondisi bangunan di sekitar lokasi';
}
if (empty($data['lingkungan']['sifat_bagunan_disekitar_lokasi'])) {
$invalidFields[] = 'sifat bangunan di sekitar lokasi';
}
}
// Validasi dekat makam
if (isset($data['lingkungan']['dekat_makam']) && $data['lingkungan']['dekat_makam'] === 'yes') {
if (empty($data['lingkungan']['jarak_makam'])) {
$invalidFields[] = 'jarak makam';
}
if (empty($data['lingkungan']['nama_makam'])) {
$invalidFields[] = 'nama makam';
}
}
// Validasi dekat TPS
if (isset($data['lingkungan']['dekat_tps']) && $data['lingkungan']['dekat_tps'] === 'yes') {
if (empty($data['lingkungan']['jarak_tps'])) {
$invalidFields[] = 'jarak TPS';
}
if (empty($data['lingkungan']['nama_tps'])) {
$invalidFields[] = 'nama TPS';
}
}
// Validasi fasilitas dekat object
if (empty($data['lingkungan']['fasilitas_dekat_object'])) {
$invalidFields[] = 'fasilitas dekat object';
}
// Validasi fasilitas dekat object input
if (empty($data['lingkungan']['fasilitas_dekat_object_input'])) {
$invalidFields[] = 'fasilitas dekat object input';
}
return $invalidFields;
}
public function validateFactData(array $data): array
{
$invalidFields = [];
// Validasi fakta_positif dan fakta_negatif
if (empty($data['fakta']['fakta_positif'])) {
$invalidFields[] = 'fakta_positif harus diisi';
}
if (empty($data['fakta']['fakta_negatif'])) {
$invalidFields[] = 'fakta_negatif harus diisi';
}
// Validasi rute_menuju
if (empty($data['fakta']['rute_menuju'])) {
$invalidFields[] = 'rute_menuju harus diisi';
}
// Validasi batas_batas dan batas_batas_input
if (empty($data['fakta']['batas_batas']) && empty($data['fakta']['batas_batas_input'])) {
$invalidFields[] = 'Batas batas';
}
// Validasi kondisi_lingkungan
if (empty($data['fakta']['kondisi_lingkungan'])) {
$invalidFields[] = 'kondisi_lingkungan harus diisi';
}
return $invalidFields;
}
public function validateRapData(array $data): array
{
$invalidFields = [];
// Validasi pengalaman_developer
if (empty($data['pengalaman_developer'])) {
$invalidFields[] = 'Pengalaman developer harus diisi';
}
// Validasi kondisi_perumahan
if (empty($data['kondisi_perumahan'])) {
$invalidFields[] = 'Kondisi perumahan harus diisi';
}
// Validasi progres_pembangunan
if (empty($data['progres_pembangunan'])) {
$invalidFields[] = 'Progres pembangunan harus diisi';
}
// Validasi partisi
if (isset($data['partisi'])) {
foreach ($data['partisi'] as $name => $values) {
if (empty($values['value'])) {
$invalidFields[] = "Partisi '{$name}' harus memiliki nilai";
}
}
}
// Validasi jumlah_unit
if (empty($data['jumlah_unit'])) {
$invalidFields[] = 'Jumlah unit harus diisi';
}
// Validasi batas_batas_perumahan
if (empty($data['batas_batas_perumahan'])) {
$invalidFields[] = 'Batas batas perumahan harus diisi';
}
// Validasi fasus_fasum
if (empty($data['fasus_fasum'])) {
$invalidFields[] = 'Fasus fasum harus diisi';
}
// Validasi harga_unit
if (empty($data['harga_unit'])) {
$invalidFields[] = 'Harga unit harus diisi';
}
// Validasi target_market
if (empty($data['target_market'])) {
$invalidFields[] = 'Target market harus diisi';
}
// Validasi kerjasama_dengan_bank
if (empty($data['kerjasama_dengan_bank'])) {
$invalidFields[] = 'Kerjasama dengan bank harus diisi';
}
// Validasi rute_menuju_lokasi
if (empty($data['rute_menuju_lokasi'])) {
$invalidFields[] = 'Rute menuju lokasi harus diisi';
}
return $invalidFields;
}
}

View File

@@ -103,6 +103,7 @@
"roles": [ "roles": [
"administrator", "administrator",
"senior-officer", "senior-officer",
"EO Appraisal",
"DD Appraisal" "DD Appraisal"
] ]
} }
@@ -332,6 +333,8 @@
"pemohon-ao", "pemohon-ao",
"pemohon-eo", "pemohon-eo",
"admin", "admin",
"DD Appraisal",
"EO Appraisal",
"senior-officer" "senior-officer"
] ]
} }

View File

@@ -56,6 +56,19 @@
@if ($permohonan->status === 'done') @if ($permohonan->status === 'done')
@foreach ($permohonan->documents as $dokumen)
@php
$inspeksiId = null;
foreach ($dokumen->inspeksi as $item) {
$inspeksiId = $item->id;
}
$jaminanId = $dokumen->id;
$currentInspeksi = $inspeksiData[$jaminanId] ?? null;
$tanahBangunanTypes = ['KAPAL', 'PESAWAT', 'ALAT BERAT'];
@endphp
<div class="card border border-agi-100 grow" id="activity_2024"> <div class="card border border-agi-100 grow" id="activity_2024">
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
@@ -66,17 +79,18 @@
<div class="card-body"> <div class="card-body">
<a class="btn btn-info" {{-- href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1" --}}> <a class="btn btn-info" href="{{ route('penilai.lampiran') }}?permohonanId={{ $permohonan->id }}&documentId={{ $dokumen->id }}&inspeksiId={{ $inspeksiId }}&jaminanId={{ $dokumen->jenis_jaminan_id }}&statusLpj=1">
LAMPIRAN FOTO DAN DOKUMEN LAMPIRAN FOTO DAN DOKUMEN
</a> </a>
<a {{-- href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jaminanId')]) }}" --}} class="btn btn-light"> <a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => $dokumen->id, 'jenis_jaminan_id' => $dokumen->jenis_jaminan_id ]) }}" class="btn btn-light">
<i class="ki-filled ki-printer"></i> Hasil Inspeksi <i class="ki-filled ki-printer"></i> Hasil Inspeksi
</a> </a>
<a class="btn btn-success" {{-- onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', '{{ request('inspeksiId') }}', {{ request('jaminanId') }}, )" --}}> <a class="btn btn-success" onclick="checkLaporan('{{ $permohonan->id }}', '{{ $dokumen->id }}', '{{ $inspeksiId }}', {{ $dokumen->jenis_jaminan_id }}, 0 )">
<i class="ki-filled ki-printer"></i> Print Laporan <i class="ki-filled ki-printer"></i> Print Laporan
</a> </a>
</div> </div>
</div> </div>
@endforeach
@endif @endif
<div class="card border border-agi-100 grow" id="activity_2024"> <div class="card border border-agi-100 grow" id="activity_2024">
@@ -84,3 +98,4 @@
</div> </div>
</div> </div>
@endsection @endsection
@include('lpj::surveyor.js.utils')

View File

@@ -246,7 +246,7 @@
title: 'Due Date', title: 'Due Date',
render: (item, data) => { render: (item, data) => {
if (!data.due_date_sla) { if (!data.due_date_sla) {
return `<span class="badge badge-sm badge-outline badge-danger uppercase flex justify-center">Sudah melewati batas</span>`; return ``;
} }
return `${window.formatTanggalIndonesia(data.due_date_sla)}`; return `${window.formatTanggalIndonesia(data.due_date_sla)}`;
} }
@@ -256,7 +256,7 @@
title: 'Paparan', title: 'Paparan',
render: (item, data) => { render: (item, data) => {
if (!data.due_date_sla) { if (!data.due_date_sla) {
return `<span class="badge badge-sm badge-outline badge-danger uppercase flex justify-center">Sudah melewati batas</span>`; return `-`;
} }
return `${window.formatTanggalIndonesia(data.due_date_sla)}`; return `${window.formatTanggalIndonesia(data.due_date_sla)}`;
} }

View File

@@ -1,547 +1,5 @@
<div style="display: none">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<label class="form-label max-w-56">Debitur/Perwakilan</label>
@if (isset($forminspeksi['asset']['debitur_perwakilan']) && !empty($forminspeksi['asset']['debitur_perwakilan']))
<div id="perwakilan" class="flex flex-wrap items-baseline w-full gap-5">
@foreach ($forminspeksi['asset']['debitur_perwakilan'] as $key => $item)
<div class="perwakilan flex flex-wrap w-full items-baseline gap-2 ">
<input type="text" class="input form-control" name="debitur_perwakilan[]"
value="{{ old('debitur_perwakilan.' . $key, $item) }}"
placeholder="Masukkan Debitur/Perwakilan" />
<button type="button" class="btn btn-danger btn-outline btn-xs remove-btn">Hapus</button>
</div>
@endforeach
</div>
@else
<div id="perwakilan" class="flex flex-wrap items-baseline w-full gap-5">
<div class="perwakilan flex flex-wrap w-full items-baseline gap-2 ">
<input type="text" class="input form-control" name="debitur_perwakilan[]"
value="{{ old('debitur_perwakilan') }}" placeholder="Masukkan Debitur/Perwakilan" />
<button type="button" class="btn btn-danger btn-outline btn-xs remove-btn"
style="display: none">Hapus
</button>
</div>
</div>
@endif
<button onclick="addClonableItem('perwakilan', 'perwakilan')" type="button" class="btn-md btn btn-primary">
<i class="ki-filled ki-plus"></i>
</button>
<em id="error-debitur_perwakilan" class="alert text-danger text-sm"></em>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<label class="form-label max-w-56">Pihak Bank</label>
<div id="perwakilan" class="flex items-baseline w-full gap-5">
<div class="flex gap-4 items-center w-full">
<input class="input" type="text" placeholder="Masukan Pihak Bank Selain Pj" type="text"
name="pihak_bank" id="lat"
value="{{ old('pihak_bank', isset($forminspeksi['asset']['pihak_bank']) ? $forminspeksi['asset']['pihak_bank'] : '') }}">
</div>
</div>
</div>
<div class="card border border-agi-100 w-full bg-white rounded-lg shadow-md overflow-hidden">
<div class="card-header bg-agi-50">
<h1 class="text-md font-medium text-gray-900 uppercase">Nama Cadeb/Debitur</h1>
</div>
<div class="card-body">
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Nama</label>
<div class="flex flex-wrap items-baseline w-full">
@if (isset($permohonan->debiture))
<p class="text-2sm text-gray-700">{{ $permohonan->debiture->name }}</p>
@endif
</div>
</div>
</div>
</div>
</div>
<div class="card border border-agi-100 w-full bg-white rounded-lg shadow-md ">
<div class="card-header bg-agi-50">
<h1 class="text-md font-medium text-gray-900 uppercase">Deskripsi Aset jaminan</h1>
</div>
<div class="card-body">
<div class="grid gap-5 w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Jenis Aset</label>
<div>
<div class="flex flex-wrap items-baseline w-full">
@if (isset($permohonan->documents))
@foreach ($permohonan->documents as $item)
<p class="text-2sm text-gray-700">{{ $item->jenisJaminan->name }}</p>
<input type="hidden" name="jenis_asset_name"
value="{{ $item->jenisJaminan->name }}">
@endforeach
@endif
</div>
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input
onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])"
type="radio" class="radio" name="jenis_asset" value="sesuai"
{{ isset($forminspeksi['asset']['jenis_asset']['sesuai']) ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input
onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])"
type="radio" class="radio" name="jenis_asset" value="tidak sesuai"
{{ isset($forminspeksi['asset']['jenis_asset']['tidak sesuai']) ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
<!-- Select dropdown untuk "Tidak Sesuai" -->
@php
$statusKey = isset($forminspeksi['asset']['jenis_asset']['sesuai'])
? 'sesuai'
: 'tidak sesuai';
$selectedValue = $forminspeksi['asset']['jenis_asset'][$statusKey] ?? null;
@endphp
<div id="jenis_asset" class="flex items-baseline gap-2"
style="{{ isset($selectedValue) === 'tidak sesuai' ? '' : 'display: none;' }}">
<select id="jenis_asset_tidak_sesuai" class="input w-full"
name="jenis_asset_tidak_sesuai">
<option value="">Select Jenis asset</option>
@if (isset($basicData['jenisJaminan']))
@foreach ($basicData['jenisJaminan'] as $item)
<option value="{{ $item->id }}"
{{ old('jenis_asset_tidak_sesuai', $forminspeksi['asset']['jenis_asset_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}>
{{ $item->name }}
</option>
@endforeach
@endif
</select>
{{-- <button type="button" class="btn btn-md btn-primary"
onclick="updateAnalisa('jenis_asset')">Save</button> --}}
</div>
</div>
<em id="error-jenis_asset" class="alert text-danger text-sm"></em>
</div>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Alamat</label>
<div class="w-full">
<span class="text-2sm text-gray-700">
{{ formatAlamat($permohonan->debiture) }}
</span>
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="createAlamat('sesuai')" type="radio" class="radio"
name="alamat_sesuai" value="sesuai"
{{ old('jenis_asset', isset($forminspeksi['asset']['alamat']['sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="createAlamat('tidak sesuai')" type="radio" class="radio"
name="alamat_sesuai" value="tidak sesuai"
{{ old('jenis_asset', isset($forminspeksi['asset']['alamat']['tidak sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
</div>
<em id="error-alamat_sesuai" class="alert text-danger text-sm"></em>
<em id="error-alamat_sesuai" class="alert text-danger text-sm"></em>
</div>
@php
$statusKey = isset($forminspeksi['asset']['alamat']['sesuai']) ? 'sesuai' : 'tidak sesuai';
$address = $forminspeksi['asset']['alamat'][$statusKey] ?? null;
@endphp
<div id="alamat_form" class="grid gap-2 mt-5" style="display: none;">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card border border-agi-100 w-full bg-white rounded-lg shadow-md overflow-hidden">
<div class="card-header bg-agi-50">
<h1 class="text-md font-medium text-gray-900 uppercase">Titik Koordinat Google Maps</h1>
</div>
<div class="card-body">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Koordinat</label>
<div id="perwakilan" class="flex items-baseline w-full gap-5">
<div class="grid grid-cols-2 gap-4 items-center w-full">
<input class="input" type="text" placeholder="Masukan Koordinat Latitude" type="text"
name="kordinat_lat" id="lat"
value="{{ old('kordinat_lat', isset($forminspeksi['asset']['kordinat_lat']) ? $forminspeksi['asset']['kordinat_lat'] : '') }}">
<input class="input" type="text" placeholder="Masukan Koordinat Longitude"
name="kordinat_lng" id="lng"
value="{{ old('kordinat_lng', isset($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '') }}">
</div>
<a onclick="getCoordinates()" type="button" class="btn btn-md btn-outline btn-primary">
<i class="ki-filled ki-map"></i>Ambil
Koordinat </a>
<a target="_blank" href="https://www.google.com/maps" type="button"
class="btn btn-md btn-outline btn-success">
<i class="ki-filled ki-map"></i>Ke google Maps</a>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header bg-agi-50">
<h1 class="text-md font-medium text-gray-900 uppercase">Status</h1>
</div>
<div class="card-body">
<div class=" mx-auto rounded-lg overflow-hidden">
<div class="py-4 ">
<h1 class="text-md font-medium text-gray-900">Hubungan cadeb/debitur dengan Pemilik Jaminan
</h1>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Pemilik Jaminan</label>
<div>
<div class="flex flex-wrap items-baseline w-full">
@foreach ($permohonan->documents as $dokumen)
@php
$hubCadebPemilik = $dokumen->pemilik->hubungan_pemilik->name ?? 'N/A';
@endphp
{{ $hubCadebPemilik }}
<input type="hidden" name="hub_cadeb_sesuai" value="{{ $hubCadebPemilik }}"
id="">
@endforeach
</div>
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input
onclick="toggleFieldVisibility('hub_cadeb','hub_cadeb_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb" value="sesuai"
{{ old('hub_cadeb', isset($forminspeksi['asset']['hub_cadeb']['sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input
onclick="toggleFieldVisibility('hub_cadeb','hub_cadeb_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb" value="tidak sesuai"
{{ old('hub_cadeb', isset($forminspeksi['asset']['hub_cadeb']['tidak sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
<!-- Select dropdown untuk "Tidak Sesuai" -->
@php
$statusKey = isset($forminspeksi['asset']['hub_cadeb']['sesuai'])
? 'sesuai'
: 'tidak sesuai';
$selectedData = $forminspeksi['asset']['hub_cadeb'][$statusKey] ?? null;
@endphp
<select id="hub_cadeb_tidak_sesuai" class="input w-full"
name="hub_cadeb_tidak_sesuai"
style="{{ old('hub_cadeb_tidak_sesuai', $selectedData) ? '' : 'display: none;' }}">
<option value="">Select Hubungan Cadeb</option>
@if (isset($basicData['hubCadeb']))
@foreach ($basicData['hubCadeb'] as $item)
@if ($item->name != $hubCadebPemilik)
<option value="{{ $item->name }}"
{{ old('hub_cadeb_tidak_sesuai', $selectedData) == $item->name ? 'selected' : '' }}>
{{ $item->name }}
</option>
@endif
@endforeach
@endif
</select>
</div>
<em id="error-hub_cadeb" class="alert text-danger text-sm"></em>
</div>
</div>
</div>
</div>
<div class=" mx-auto bg-white rounded-lg overflow-hidden">
<div class="py-4 ">
<h1 class="text-md font-medium text-gray-900">Hubungan Cadeb/Debitur dengan Penghuni Jaminan
</h1>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Penghuni Jaminan</label>
<div class="mt-2">
<div class="flex flex-wrap items-baseline w-full text-sm">
<input type="hidden" name="hub_cadeb_penghuni_sesuai" value="ditempati sendiri"
id="">
</div>
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input
onclick="toggleFieldVisibility('hub_cadeb_penghuni','hub_penghuni_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb_penghuni" value="sesuai"
{{ old('hub_cadeb_penghuni', isset($forminspeksi['asset']['hub_cadeb_penghuni'])) ? 'checked' : '' }}>
<span class="ml-2">Ditempati Sendiri</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input
onclick="toggleFieldVisibility('hub_cadeb_penghuni','hub_penghuni_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb_penghuni"
value="tidak sesuai"
{{ old('hub_cadeb_penghuni', $forminspeksi['asset']['hub_cadeb_penghuni']['tidak sesuai'] ?? false) ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
<!-- Select dropdown untuk "Tidak Sesuai" -->
@php
$statusKey = isset($forminspeksi['asset']['hub_cadeb_penghuni']['sesuai'])
? 'sesuai'
: 'tidak sesuai';
$selectedData =
$forminspeksi['asset']['hub_cadeb_penghuni'][$statusKey] ?? null;
@endphp
<input id="hub_penghuni_tidak_sesuai" class="input"
name="hub_penghuni_tidak_sesuai"
placeholder="Masukkan Hubungan penghuni jaminan"
value="{{ old('hub_penghuni_tidak_sesuai', isset($selectedData) ? $selectedData : '') }}"
style="{{ old('hub_penghuni_tidak_sesuai', $selectedData ?? false) ? '' : 'display: none;' }}">
</div>
<em id="error-hub_cadeb_penghuni" class="alert text-danger text-sm"></em>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card border border-agi-100 min-w-full">
<div class="card border border-agi-100 min-w-full">
<div class="card-header bg-agi-50">
<h3 class="card-title">
{{ $title ?? 'Data Jaminan' }}
</h3>
@php
use Illuminate\Support\Facades\Route;
@endphp
<div class="flex items-center gap-2">
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Route::currentRouteName('otorisator.show'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => 'Pelaporan']) }}"
class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
@elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor']) && Route::currentRouteName('penilai.show'))
<a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
@endif
</div>
</div>
<div class="card-body grid gap-5 grid-cols-2">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Nama Debitur</label>
<div class="flex flex-wrap items-baseline w-full">
@if (isset($permohonan->debiture))
<p class="text-2sm text-gray-700">{{ $permohonan->debiture->name }}</p>
@endif
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Alamat Object</label>
<div class="flex flex-wrap items-baseline w-full">
@foreach ($permohonan->documents as $dokumen)
<span class="text-2sm text-gray-700">
{{ formatAlamat($dokumen->pemilik) }}
{{ formatAlamat($dokumen->pemilik) }}
</span>
@endforeach
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Nomor Registrasi</label>
<div class="flex flex-wrap items-base line w-full">
<p class="text-2sm text-gray-700">{{ $permohonan->nomor_registrasi }}</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Cab/Direktorat</label>
<div class="flex flex-wrap items-baseline w-full">
@if (isset($permohonan->branch))
<p class="text-2sm text-gray-700">{{ $permohonan->branch->name }}</p>
@endif
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Nomor Laporan</label>
<div class="flex flex-wrap items-base line w-full">
<p class="text-2sm text-gray-700">{{ $permohonan->nomor_registrasi }}</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">AO</label>
<div class="flex flex-wrap items-baseline w-full">
@if (isset($permohonan->user))
<p class="text-2sm text-gray-700">{{ $permohonan->user->name }}</p>
@endif
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header bg-agi-50">
<h3 class="card-title uppercase">
Identitas Cadeb/Debitur
</h3>
</div>
<div class="card-body grid gap-2.5 w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Nama</label>
<div class="flex flex-wrap items-baseline w-full">
<span>
@if (isset($permohonan->debiture))
<p class="text-2sm text-gray-700">{{ $permohonan->debiture->name }}</p>
@endif
</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Perwakilan Cadeb/Debitur Di lokasi</label>
<div class="flex flex-wrap items-baseline w-full">
<span>
{{ $forminspeksi['asset']['debitur_perwakilan'][0] ?? '' }}
</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Pihak Bank Selain Appraisal</label>
<div class="flex flex-wrap items-baseline w-full">
<span> {{ $forminspeksi['asset']['pihak_bank'] ?? '' }}</span>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header bg-agi-50">
<h3 class="card-title uppercase">
Deskripsi dan Alamat Aset
</h3>
</div>
<div class="card-body grid gap-2.5 w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Jenis Asset</label>
@php
$statusKey = isset($forminspeksi['asset']['jenis_asset']['sesuai']) ? 'sesuai' : 'tidak sesuai';
$selectedValue = $forminspeksi['asset']['jenis_asset'][$statusKey] ?? null;
@endphp
<div class="flex flex-wrap items-baseline w-full">
<span>{{ $selectedValue }}</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@php
$statusKey = isset($forminspeksi['asset']['alamat']['sesuai']) ? 'sesuai' : 'tidak sesuai';
$selectedValue = $forminspeksi['asset']['alamat'][$statusKey] ?? null;
@endphp
<label class="form-label max-w-56">Terletak di</label>
<div class="flex flex-wrap items-baseline w-full">
<span>{{ $selectedValue['address'] ?? '' }}</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="province" class="form-label max-w-56">Provinsi</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="province" class="input w-full cursor-not-allowed" readonly
value="{{ isset($permohonan->debiture->province) ? $permohonan->debiture->province->name : '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="city" class="form-label max-w-56">Kabupaten/Kota</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="city" class="input w-full cursor-not-allowed" readonly
value="{{ isset($permohonan->debiture->city) ? $permohonan->debiture->city->name : '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="district" class="form-label max-w-56">Kecamatan</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="district" class="input w-full cursor-not-allowed" readonly
value="{{ isset($permohonan->debiture->district) ? $permohonan->debiture->district->name : '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="village" class="form-label max-w-56">Desa/Kelurahan</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="village" class="input w-full cursor-not-allowed" readonly
value="{{ isset($permohonan->debiture->village) ? $permohonan->debiture->village->name : '' }}">
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header bg-agi-50">
<h3 class="card-title uppercase">
dokumen
</h3>
</div>
<div class="card-body">
@include('lpj::component.detail-jaminan', ['status' => true])
</div>
</div>
<div class="card">
<div class="card-header bg-agi-50">
<h3 class="card-title uppercase">
Hubungan Cadeb/Debitur dengan pemilik dan penghuni
</h3>
</div>
@php
$statusKey = isset($forminspeksi['asset']['hub_cadeb']['sesuai']) ? 'sesuai' : 'tidak sesuai';
$selectedData = $forminspeksi['asset']['hub_cadeb'][$statusKey] ?? null;
@endphp
<div class="card-body">
</div>
</div>
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan) @if ($dokumen->jenisJaminan)
@@ -558,6 +16,10 @@
<input type="hidden" name="type" value="{{ implode(',', $kategoriUnik) }}"> <input type="hidden" name="type" value="{{ implode(',', $kategoriUnik) }}">
@if (array_intersect($kategoriUnik, ['tanah', 'bangunan', 'apartemen-kantor']))
@include('lpj::surveyor.components.header')
@endif
@foreach ($kategoriUnik as $kategori) @foreach ($kategoriUnik as $kategori)
{{-- Tampilkan komponen sesuai kategori --}} {{-- Tampilkan komponen sesuai kategori --}}
@include('lpj::surveyor.components.' . str_replace('-', '-', $kategori), [ @include('lpj::surveyor.components.' . str_replace('-', '-', $kategori), [
@@ -662,8 +124,8 @@
</div> </div>
<div class="tambah mb-10" id="tambah-npw" style="margin-bottom: 20px;"> <div class="tambah mb-10" style="margin-bottom: 20px;">
<button type="button" class="btn btn-primary"> <button type="button" id="tambah-npw" class="btn btn-primary">
<i class="ki-filled ki-plus"></i> <i class="ki-filled ki-plus"></i>
Tambah NPW </button> Tambah NPW </button>
</div> </div>
@@ -751,60 +213,12 @@
</div> </div>
</div> </div>
<div class="card">
<div class="card-header bg-agi-50">
<h3 class="card-title uppercase">
nilai asuransi
</h3>
</div>
<div class="card-body">
<div>
<label for="total_nilai_pasar_wajar" class="form-label uppercase">TOTAL NILAI ASURANSI</label>
<div class="card-body grid gap-2.5 w-full">
<div class="flex grid-col-3 gap-2.5 w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="province" class="form-label">Luas Bangunan</label>
<input type="text" class="input w-full" id="asuransi_luas_bangunan"
name="asuransi_luas_bangunan"
value="{{ old('asuransi_luas_bangunan', $lpjData['asuransi_luas_bangunan'] ?? null) }}"
oninput="calculateTotal()">
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="province" class="">X</label>
<label class="input">
<i class="">Rp
</i>
<input type="text" class="input w-full currency" id="asuransi_nilai_1"
name="asuransi_nilai_1"
value="{{ old('asuransi_nilai_1', $lpjData['asuransi_nilai_1'] ?? null) }}"
oninput="calculateTotal()">
</label>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label class="input">
<i class="">Rp
</i>
<input type="text" class="input w-full currency-format" name="asuransi_nilai_2"
value="{{ old('asuransi_nilai_2', $lpjData['asuransi_nilai_2'] ?? null) }}">
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
const datas = @json($forminspeksi); const datas = @json($forminspeksi);
console.log(datas); console.log(datas);
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const tambahNPWButton = document.getElementById('tambah-npw'); const tambahNPWButton = document.getElementById('tambah-npw');
const addPasarWajarContainer = document.getElementById('add_pasar_wajar'); const addPasarWajarContainer = document.getElementById('add_pasar_wajar');
let npwCounter = 0; let npwCounter = 0;
@@ -1000,88 +414,100 @@
} }
function calculateTotal() { function calculateTotal() {
const parseInput = (value) => parseFloat(value.replace(/[^0-9]/g, '')) || 0; const parseInput = (value) => {
if (!value) return 0;
return parseFloat(value.replace(/[^0-9]/g, '')) || 0;
};
// Bagian Likuidasi // Function to format currency
let persentaseLikuidasiInput = document.getElementById('likuidasi'); function formatCurrency(value) {
let persentaseLikuidasi = parseInput(persentaseLikuidasiInput.value); // Ensure we have a valid number to format
persentaseLikuidasiInput.value = formatPercentage(persentaseLikuidasiInput.value); const num = parseFloat(value.replace(/[^0-9]/g, '')) || 0;
return num.toLocaleString('id-ID');
}
let totalNilaiPasarLikuidasi = document.querySelector('input[name="likuidasi_nilai_1"]'); // Function to format percentage
let totalLikuidasi = document.querySelector('input[name="likuidasi_nilai_2"]'); function formatPercentage(value) {
if (!value) return '';
// Bagian Asuransi const num = parseFloat(value.replace(/[^0-9.]/g, '')) || 0;
let luasBangunanAsuransi = parseInput(document.getElementById('asuransi_luas_bangunan').value); return num.toString();
let hargaPerMeterAsuransi = parseInput(document.querySelector('input[name="asuransi_nilai_1"]').value); }
let totalNilaiAsuransi = document.querySelector('input[name="asuransi_nilai_2"]');
// Perhitungan Asuransi
const hasilAsuransi = luasBangunanAsuransi * hargaPerMeterAsuransi;
// Calculate total nilai pasar wajar
let totalNilaiPasarWajar = 0; let totalNilaiPasarWajar = 0;
// Perhitungan untuk input yang sudah ada // Get all kategori unik elements dynamically
const jenisAsetData = @json($jenisAset); const kategoriItems = document.querySelectorAll('[id^="luas_"]');
// Menentukan input yang akan dihitung berdasarkan jenis aset kategoriItems.forEach(item => {
let standardInputs = []; const kategori = item.id.replace('luas_', '');
const luasInput = document.getElementById(`luas_${kategori}`);
const nilaiInput = document.querySelector(`input[name="nilai_${kategori}_1"]`);
const outputElement = document.querySelector(`input[name="nilai_${kategori}_2"]`);
if (jenisAsetData.toUpperCase() === 'RUKO/RUKAN') { if (luasInput && nilaiInput && outputElement) {
standardInputs = [{ const luas = parseInput(luasInput.value);
luas: 'luas_bangunan', const nilai = parseInput(nilaiInput.value);
nilai: 'nilai_bangunan_1', const hasil = luas * nilai;
output: 'nilai_bangunan_2'
}]; outputElement.value = formatCurrency(hasil.toString());
} else { totalNilaiPasarWajar += hasil;
standardInputs = [{
luas: 'luas_tanah',
nilai: 'nilai_tanah_1',
output: 'nilai_tanah_2'
},
{
luas: 'luas_bangunan',
nilai: 'nilai_bangunan_1',
output: 'nilai_bangunan_2'
} }
];
}
standardInputs.forEach(input => {
let luas = parseInput(document.getElementById(input.luas).value);
let hargaPerMeter = parseInput(document.querySelector(`input[name="${input.nilai}"]`).value);
let totalNilai = luas * hargaPerMeter;
document.querySelector(`input[name="${input.output}"]`).value = formatCurrency(totalNilai
.toString());
totalNilaiPasarWajar += totalNilai;
}); });
// Tambahkan perhitungan untuk NPW tambahan // Tambahkan perhitungan untuk NPW tambahan
const npwRows = document.querySelectorAll('.npw-row'); const npwRows = document.querySelectorAll('.npw-row');
npwRows.forEach(row => { npwRows.forEach(row => {
let luasNPW = parseInput(row.querySelector('input[id^="luas_npw_"]').value); const luasInput = row.querySelector('input[id^="luas_npw_"]');
let nilaiNPW = parseInput(row.querySelector('input[id^="nilai_npw_"][id$="_1"]').value); const nilaiInput = row.querySelector('input[id^="nilai_npw_"][id$="_1"]');
let totalNilaiNPW = luasNPW * nilaiNPW; const outputElement = row.querySelector('input[id^="nilai_npw_"][id$="_2"]');
row.querySelector('input[id^="nilai_npw_"][id$="_2"]').value = formatCurrency(totalNilaiNPW if (luasInput && nilaiInput && outputElement) {
.toString()); const luas = parseInput(luasInput.value);
totalNilaiPasarWajar += totalNilaiNPW; const nilai = parseInput(nilaiInput.value);
const hasil = luas * nilai;
outputElement.value = formatCurrency(hasil.toString());
totalNilaiPasarWajar += hasil;
}
}); });
// Update total nilai pasar wajar // Update total nilai pasar wajar
document.getElementById('total_nilai_pasar_wajar').value = formatCurrency(totalNilaiPasarWajar.toString()); const totalElement = document.getElementById('total_nilai_pasar_wajar');
if (totalElement) {
totalElement.value = formatCurrency(totalNilaiPasarWajar.toString());
}
// Bagian Likuidasi
const persentaseLikuidasiInput = document.getElementById('likuidasi');
if (persentaseLikuidasiInput) {
let persentaseLikuidasi = parseInput(persentaseLikuidasiInput.value);
persentaseLikuidasiInput.value = formatPercentage(persentaseLikuidasiInput.value);
const totalNilaiPasarLikuidasi = document.querySelector('input[name="likuidasi_nilai_1"]');
const totalLikuidasi = document.querySelector('input[name="likuidasi_nilai_2"]');
if (totalNilaiPasarLikuidasi && totalLikuidasi) {
totalNilaiPasarLikuidasi.value = formatCurrency(totalNilaiPasarWajar.toString());
// Perhitungan Likuidasi // Perhitungan Likuidasi
const hasilLikuidasi = (persentaseLikuidasi / 100) * totalNilaiPasarWajar; const hasilLikuidasi = (persentaseLikuidasi / 100) * totalNilaiPasarWajar;
// Tampilkan nilai likuidasi dan asuransi
totalNilaiPasarLikuidasi.value = formatCurrency(totalNilaiPasarWajar.toString());
totalNilaiAsuransi.value = formatCurrency(hasilAsuransi.toString());
// Total likuidasi (total nilai pasar wajar + nilai likuidasi)
// const totalPasarWajarDenganLikuidasi = totalNilaiPasarWajar + hasilLikuidasi;
totalLikuidasi.value = formatCurrency(hasilLikuidasi.toString()); totalLikuidasi.value = formatCurrency(hasilLikuidasi.toString());
}
}
// Bagian Asuransi (jika ada)
const luasBangunanAsuransi = document.getElementById('asuransi_luas_bangunan');
const hargaPerMeterAsuransi = document.querySelector('input[name="asuransi_nilai_1"]');
const totalNilaiAsuransi = document.querySelector('input[name="asuransi_nilai_2"]');
if (luasBangunanAsuransi && hargaPerMeterAsuransi && totalNilaiAsuransi) {
const luas = parseInput(luasBangunanAsuransi.value);
const nilai = parseInput(hargaPerMeterAsuransi.value);
const hasilAsuransi = luas * nilai;
totalNilaiAsuransi.value = formatCurrency(hasilAsuransi.toString());
}
} }

View File

@@ -8,7 +8,7 @@
Input Nilai Liquidasi (LPJ) Input Nilai Liquidasi (LPJ)
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<a href="{{ route('pembayaran.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a> <a href="{{ route('laporan.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a>
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">

View File

@@ -107,19 +107,19 @@
nomor_registrasi: { nomor_registrasi: {
title: 'Nomor Registrasi', title: 'Nomor Registrasi',
render: (item, data) => { render: (item, data) => {
return `${data.permohonan.nomor_registrasi}`; return `${data.permohonan?.nomor_registrasi}`;
}, },
}, },
nama_debitur: { nama_debitur: {
title: 'Nama Debitur', title: 'Nama Debitur',
render: (item, data) => { render: (item, data) => {
return `${data.permohonan.debiture.name}`; return `${data.permohonan?.debiture.name}`;
}, },
}, },
cabang: { cabang: {
title: 'Cabang', title: 'Cabang',
render: (item, data) => { render: (item, data) => {
return `${data.permohonan.branch.name}`; return `${data.permohonan?.branch.name}`;
}, },
}, },
user_pemohon: { user_pemohon: {

View File

@@ -106,11 +106,14 @@
@push('scripts') @push('scripts')
<script type="text/javascript"> <script type="text/javascript">
function pembayaranOtorisator(id) { function handlePembayaran(id, type) {
// alert('hai id = ' + id); let rv = type
let title = type === 'revisi' ? 'Apakah Anda yakin ingin merevisi pembayaran ini?' : 'Apakah Anda yakin?';
let text = type === 'revisi' ? 'Untuk melakukan revisi pembayaran!' : 'Untuk melakukan approve pembayaran!';
Swal.fire({ Swal.fire({
title: 'Apakah Anda yakin?', title: title,
text: `Untuk melakukan approve Pembayaran!`, text: text,
icon: 'warning', icon: 'warning',
input: 'textarea', // Menambahkan input textarea input: 'textarea', // Menambahkan input textarea
inputLabel: 'Keterangan', inputLabel: 'Keterangan',
@@ -133,6 +136,7 @@
input_data._method = 'PUT'; input_data._method = 'PUT';
input_data.id = id; input_data.id = id;
input_data.keterangan = keterangan; input_data.keterangan = keterangan;
input_data.type = rv;
$.ajaxSetup({ $.ajaxSetup({
headers: { headers: {
@@ -324,10 +328,10 @@
} }
if(permohonan) { if(permohonan) {
return `${permohonan.approve_keterangan_bayar}`; return `${permohonan.approve_keterangan_bayar}` || '-';
} }
return ""; return "-";
}, },
}, },
actions: { actions: {
@@ -339,12 +343,16 @@
var permohonan = data.penawaran.permohonan; var permohonan = data.penawaran.permohonan;
} }
if(permohonan) {
var iconPembayaranOtorisator = ''; var iconPembayaranOtorisator = '';
if(permohonan) {
if (!permohonan.approve_bayar_by) { if (!permohonan.approve_bayar_by) {
iconPembayaranOtorisator = `<a class="btn btn-sm btn-icon btn-clear btn-primary " onclick="pembayaranOtorisator(${permohonan.id})"> iconPembayaranOtorisator = `<a class="btn btn-sm btn-icon btn-clear btn-primary " onclick="handlePembayaran(${permohonan.id},'otorisator')">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
</a>`; </a>`;
}else{
iconPembayaranOtorisator = `<a class="btn btn-sm btn-icon btn-clear btn-primary " onclick="handlePembayaran(${permohonan.id}, 'revisi')">
<i class="ki-filled ki-arrow-circle-left"></i>
</a>`;
} }
return `<div class="flex flex-nowrap justify-center">` + iconPembayaranOtorisator + `</div>`; return `<div class="flex flex-nowrap justify-center">` + iconPembayaranOtorisator + `</div>`;

View File

@@ -91,7 +91,10 @@
@if ($row->status == 1) @if ($row->status == 1)
<option value="{{ $row->id }}" <option value="{{ $row->id }}"
{{ in_array($row->id, old('kjpp', $kjpps ?? [])) ? 'selected' : '' }}> {{ in_array($row->id, old('kjpp', $kjpps ?? [])) ? 'selected' : '' }}>
{{ $row->name }} {{ $row->name }} | {{ $row->jenis_kantor }}
@if($row->jenis_kantor == 'Kantor Cabang')
{{ str_replace(['KOTA','KAB.','KAB'],'',$row->city->name) }}
@endif
</option> </option>
@endif @endif
@endforeach @endforeach

View File

@@ -46,7 +46,7 @@
email_kantor: { email_kantor: {
title: 'Email Kantor', title: 'Email Kantor',
render: (item, data) => { render: (item, data) => {
let emails = [data.kjpp.email_kantor]; // Always include the main email let emails = new Set([data.kjpp.email_kantor]); // Always include the main email
// Check if there's a detail_email_kantor and try to parse it // Check if there's a detail_email_kantor and try to parse it
if (data.kjpp.detail_email_kantor) { if (data.kjpp.detail_email_kantor) {
@@ -56,15 +56,12 @@
// If the parsed result is an array, extract emails from each object and concatenate // If the parsed result is an array, extract emails from each object and concatenate
if (Array.isArray(detailEmails)) { if (Array.isArray(detailEmails)) {
detailEmails.forEach(item => { detailEmails.forEach(item => {
if (item.email_kantor) { emails.add(item);
emails.push(item
.email_kantor); // Add the email from each object
}
}); });
} else { } else {
// If it's a single object (not an array), just add the email // If it's a single object (not an array), just add the email
if (detailEmails.email_kantor) { if (detailEmails) {
emails.push(detailEmails.email_kantor); emails.add(detailEmails);
} }
} }
} catch (e) { } catch (e) {
@@ -74,6 +71,8 @@
} }
} }
emails = Array.from(emails);
// Helper function for basic email validation (regex pattern) // Helper function for basic email validation (regex pattern)
const isValidEmail = (email) => { const isValidEmail = (email) => {
const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/; const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;

View File

@@ -20,8 +20,13 @@
@foreach ($informasi as $key) @foreach ($informasi as $key)
@if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-') @if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-')
<p> - {{ ucfirst(str_replace('_', ' ', $key)) }}: @php
{{ $forminspeksi['fakta'][$key] }}</p> $displayKey = ucfirst(str_replace('_', ' ', $key));
if (strlen($key) == 3) {
$displayKey = strtoupper($key);
}
@endphp
<p> - {{ $displayKey }}: {{ $forminspeksi['fakta'][$key] }}</p>
@endif @endif
@endforeach @endforeach

View File

@@ -16,17 +16,17 @@
<tr> <tr>
<td style=" width:25%; padding: 2px; vertical-align: top;">Jarak Jalan Utama</td> <td style=" width:25%; padding: 2px; vertical-align: top;">Jarak Jalan Utama</td>
<td style=" width:1%; padding: 2px; vertical-align: top;">:</td> <td style=" width:1%; padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jarak_jalan_utama'] ?? '-' }} m</td> <td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jarak_jalan_utama'] ?? '-' }}</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Jalan Lingkungan</td> <td style="padding: 2px; vertical-align: top;">Jalan Lingkungan</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jalan_linkungan'] ?? '-' }} m</td> <td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jalan_linkungan'] ?? '-' }}</td>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Jarak CBD</td> <td style="padding: 2px; vertical-align: top;">Jarak CBD</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jarak_cbd_point'] ?? '-' }} m <td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jarak_cbd_point'] ?? '-' }}
({{ $lingkungan['nama_cbd_point'] ?? '-' }})</td> ({{ $lingkungan['nama_cbd_point'] ?? '-' }})</td>
</tr> </tr>
<tr> <tr>

View File

@@ -116,14 +116,18 @@
<td>Tusuk Sate</td> <td>Tusuk Sate</td>
<td>:</td> <td>:</td>
<td> <td>
{{ $forminspeksi['tanah']['tusuk_sate'] == 'yes' ? 'Ya' : 'Tidak' }} {{ isset($forminspeksi['tanah']['tusuk_sate']) && $forminspeksi['tanah']['tusuk_sate']['Ya'] ? 'Ya' : 'Tidak' }}
@if (isset($forminspeksi['tanah']['tusuk_sate']) && $forminspeksi['tanah']['tusuk_sate']['Ya'])
{{ isset($forminspeksi['tanah']['tusuk_sate_ya']) ? ' (' . $forminspeksi['tanah']['tusuk_sate_ya'] . ')' : '' }}
@endif
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Lockland</td> <td>Lockland</td>
<td>:</td> <td>:</td>
<td> <td>
{{ $forminspeksi['tanah']['lockland'] == 'yes' ? 'Ya' : 'Tidak' }} {{ isset($forminspeksi['tanah']['lockland']) && $forminspeksi['tanah']['lockland'] == 'yes' ? 'Ya' : 'Tidak' }}
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -39,20 +39,57 @@
@endphp @endphp
<form id="formInspeksi" method="POST" enctype="multipart/form-data" class="grid gap-5"> <form id="formInspeksi" method="POST" enctype="multipart/form-data" class="grid gap-5">
@csrf @csrf
@foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan)
@php
$formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true);
$jenisAset = $dokumen->jenisJaminan->name;
@endphp
@if (isset($formKategori) && $formKategori)
@php
$kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori];
$kategoriUnik = array_unique($kategoriArray);
@endphp
<input type="hidden" name="action" value="{{ implode(',', $kategoriUnik) }}">
<input type="hidden" name="type" value="{{ implode(',', $kategoriUnik) }}">
@endif
@endif
@endforeach
<input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi ?? '' }}"> <input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi ?? '' }}">
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id ?? '' }}"> <input type="hidden" name="permohonan_id" value="{{ $permohonan->id ?? '' }}">
<input type="hidden" name="dokument_id" value="{{ request('documentId') }}"> <input type="hidden" name="dokument_id" value="{{ request('documentId') }}">
<input type="hidden" name="action" value="callReport">
<input type="hidden" name="type" value="callReport">
@include('lpj::assetsku.includenya') @include('lpj::assetsku.includenya')
{{-- @include('lpj::surveyor.components.header') {{-- @include('lpj::surveyor.components.header')
@include('lpj::surveyor.components.callReport') --}} @include('lpj::surveyor.components.callReport') --}}
@php
$paparan = $permohonan->status === 'proses-paparan' ? 'Paparan' : 'Pelaporan';
@endphp
<div class="card"> <div class="card">
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
<h3 class="card-title uppercase"> <h3 class="card-title uppercase">
CALL Report CALL Report
</h3> </h3>
@php
use Illuminate\Support\Facades\Route;
@endphp
<div class="flex items-center gap-2">
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Route::currentRouteName('otorisator.show'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => $paparan]) }}"
class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
@elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor']) && Route::currentRouteName('penilai.show'))
<a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
@endif
</div>
</div> </div>
<div class="card-body grid gap-5"> <div class="card-body grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@@ -214,40 +251,81 @@
@include('lpj::component.detail-jaminan', ['status' => true]) @include('lpj::component.detail-jaminan', ['status' => true])
</div> </div>
</div> </div>
<div class="w-full grid grid-cols-1 lg:grid-cols-2 gap-4">
<!-- Bagian Nilai KJPP -->
<div class="card border border-agi-100 w-full bg-white rounded-lg shadow-md"> <div class="card border border-agi-100 w-full bg-white rounded-lg shadow-md">
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
<h1 class="text-md font-medium text-gray-900 uppercase">Nilai Likuidasi</h1> <h1 class="text-md font-medium text-gray-900 uppercase">Nilai KJPP</h1>
</div> </div>
<div class="card-body grid gap-5 w-full"> <div class="card-body grid gap-5 w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="Lelang" class="form-label max-w-56">Lelang ke </label> <label for="lelang-1" class="form-label max-w-56">Lelang ke </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" id="lelang" name="lelang" class="input w-full" <input type="text" id="lelang-1" name="lelang_kjpp" class="input w-full"
placeholder="Masukkan Lelang" value="{{ $callReport['lelang'] ?? old('lelang') }}"> placeholder="Masukkan Lelang" value="{{ $callReport['lelang_kjpp'] ?? '' }}">
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="penilai" class="form-label max-w-56">Nilai Pasar Wajar (NPW)</label> <label for="nilai-pasar-1" class="form-label max-w-56">Nilai Pasar Wajar (NPW)</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" id="nilai-pasar" name="nilai_pasar" <input type="text" id="nilai-pasar-1" name="nilai_pasar_kjpp"
class="input w-full nilai-pasar currency-format" placeholder="Masukkan likuidasi" class="input w-full nilai-pasar currency-format" placeholder="Masukkan likuidasi" value="{{ $callReport['nilai_pasar_kjpp'] ?? '' }}">
value="{{ $callReport['nilai_pasar'] ?? old('likuidasi') }}">
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="likuidasi_nilai_1" class="form-label max-w-56">Nilai Likuidasi(%)</label> <label for="likuidasi-1" class="form-label max-w-56">Nilai Likuidasi(%)</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" id="likuidasi" name="likuidasi" class="input w-full likuidasi" <input type="text" id="likuidasi-1" name="persentase_likuidasi_kjpp" class="input w-full likuidasi"
placeholder="Masukkan likuidasi dalam bentuk persen" onkeyup="calculateTotal(this)" value="{{ $callReport['persentase_likuidasi'] ?? old('likuidasi') }}"> placeholder="Masukkan likuidasi dalam bentuk persen" onkeyup="calculateTotal(this)"
data-group="1" value="{{ $callReport['persentase_likuidasi_kjpp'] ?? '' }}">
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="total-likuidasi" class="form-label max-w-56">Total Nilai Likuidasi <label for="total-likuidasi-1" class="form-label max-w-56">Total Nilai Likuidasi (NL)</label>
(NL)</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" id="total-likuidasi" name="likuidasi_nilai_1" <input type="text" id="total-likuidasi-1" name="hasil_nilai_likuidasi_kjpp"
class="input w-full total-likuidasi currency-format" placeholder="Masukkan likuidasi" value="{{ $callReport['hasil_nilai_likuidasi'] ?? old('likuidasi') }}"> class="input w-full total-likuidasi currency-format" placeholder="Hasil perhitungan" value="{{ $callReport['hasil_nilai_likuidasi_kjpp'] ?? '' }}">
</div>
</div>
</div>
</div>
<!-- Bagian Nilai Internal -->
<div class="card border border-agi-100 w-full bg-white rounded-lg shadow-md">
<div class="card-header bg-agi-50">
<h1 class="text-md font-medium text-gray-900 uppercase">Nilai Internal</h1>
</div>
<div class="card-body grid gap-5 w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="lelang-2" class="form-label max-w-56">Lelang ke </label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="lelang-2" name="lelang_internal" class="input w-full"
placeholder="Masukkan Lelang" value="{{ $callReport['lelang_internal'] ?? '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="nilai-pasar-2" class="form-label max-w-56">Nilai Pasar Wajar (NPW)</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="nilai-pasar-2" name="nilai_pasar_internal"
class="input w-full nilai-pasar currency-format" placeholder="Masukkan likuidasi" value="{{ $callReport['nilai_pasar_internal'] ?? '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="likuidasi-2" class="form-label max-w-56">Nilai Likuidasi(%)</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="likuidasi-2" name="persentase_likuidasi_internal" class="input w-full likuidasi"
placeholder="Masukkan likuidasi dalam bentuk persen" onkeyup="calculateTotal(this)"
data-group="2" value="{{ $callReport['persentase_likuidasi_internal'] ?? '' }}">
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="total-likuidasi-2" class="form-label max-w-56">Total Nilai Likuidasi (NL)</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" id="total-likuidasi-2" name="hasil_nilai_likuidasi_internal"
class="input w-full total-likuidasi currency-format" placeholder="Hasil perhitungan" value="{{ $callReport['hasil_nilai_likuidasi_internal'] ?? '' }}">
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -278,9 +356,8 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label for="penilai" class="form-label max-w-56">Pihak KJPP</label> <label for="penilai" class="form-label max-w-56">Pihak KJPP</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" id="penilai" name="pihak_kjjpp" <input type="text" id="penilai" name="pihak_kjjpp" class="input w-full "
class="input w-full " value="{{ $callReport['pihak_kjjpp'] ?? ($forminspeksi['signature']['kjjp']['name'] ?? '') }}"
value="{{ $forminspeksi['signature']['kjjp']['name'] ?? $callReport['pihak_kjjpp'] ?? '' }}"
placeholder="Masukkan Nama KJPP"> placeholder="Masukkan Nama KJPP">
</div> </div>
</div> </div>
@@ -332,10 +409,10 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Faktor Positif</label> <label class="form-label max-w-56">Faktor Positif</label>
<div id="fakta-positif-container" class="flex flex-wrap items-baseline w-full"> <div id="fakta-positif-container" class="flex flex-wrap items-baseline w-full">
@if (!empty($callReport['fakta']['fakta_positif'])) @if (!empty($forminspeksi['fakta']['fakta_positif']))
@foreach ($callReport['fakta']['fakta_positif'] as $index => $positif) @foreach ($forminspeksi['fakta']['fakta_positif'] as $index => $positif)
<div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_positif[]" rows="3">{{ old("fakta_positif.$index", $positif) }}</textarea> <textarea class="textarea mt-2" name="fakta_positif[]" rows="10">{{ old("fakta_positif.$index", $positif) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" <button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;"> style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
@@ -344,7 +421,7 @@
@endforeach @endforeach
@else @else
<div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_positif[]" rows="3">{{ old('fakta_positif.0', '') }}</textarea> <textarea class="textarea mt-2" name="fakta_positif[]" rows="10">{{ old('fakta_positif.0', '') }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" <button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;"> style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
@@ -361,10 +438,10 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Faktor Negatif</label> <label class="form-label max-w-56">Faktor Negatif</label>
<div id="fakta-negatif-container" class="flex flex-wrap items-baseline w-full"> <div id="fakta-negatif-container" class="flex flex-wrap items-baseline w-full">
@if (!empty($callReport['fakta']['fakta_negatif'])) @if (!empty($forminspeksi['fakta']['fakta_negatif']))
@foreach ($callReport['fakta']['fakta_negatif'] as $index => $negatif) @foreach ($forminspeksi['fakta']['fakta_negatif'] as $index => $negatif)
<div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_negatif[]" rows="3">{{ old("fakta_negatif.$index", $negatif) }}</textarea> <textarea class="textarea mt-2" name="fakta_negatif[]" rows="10">{{ old("fakta_negatif.$index", $negatif) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" <button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;"> style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
@@ -373,7 +450,7 @@
@endforeach @endforeach
@else @else
<div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_negatif[]" rows="3">{{ old('fakta_negatif.0', $callReport['fakta']['fakta_negatif'][0] ?? '') }}</textarea> <textarea class="textarea mt-2" name="fakta_negatif[]" rows="10">{{ old('fakta_negatif.0', $forminspeksi['fakta']['fakta_negatif'][0] ?? '') }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" <button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;"> style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
@@ -387,22 +464,64 @@
</button> </button>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 " style="margin-top: 20px ">
<label class="form-label lg:form-label max-w-56 ">Catatan yang Perlu Diperhatikan
</label>
<div class="w-full">
<div id="keterangan-container" class="flex items-baseline flex-wrap gap-2.5 w-full">
@if (!empty($forminspeksi['fakta']['keterangan']) && is_array($forminspeksi['fakta']['keterangan']))
@foreach ($forminspeksi['fakta']['keterangan'] as $index => $item)
<div class="keterangan flex items-center gap-2 mt-2 textarea-group w-full">
<textarea name="keterangan[]" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="10">{{ old("keterangan.$index", $item) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;">
<i class="ki-outline ki-trash"></i>
</button>
</div>
@endforeach
@else
<div class="keterangan flex items-center gap-2 mt-2 textarea-group w-full">
<textarea name="keterangan[]" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="10"></textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;">
<i class="ki-outline ki-trash"></i>
</button>
<em id="error-keterangan" class="alert text-danger text-sm"></em>
</div>
@endif
</div>
<button type="button" onclick="addClonableItem('keterangan-container', 'keterangan')"
class="btn btn-primary btn-sm mt-5 ">
<i class="ki-outline ki-plus"></i>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px"> <div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
<button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()"> <button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()">
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>
<span id="saveButtonText">Save</span> <span id="saveButtonText">Save</span>
</button> </button>
@endif
@if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal']))
<a class="btn btn-info" <a class="btn btn-info"
href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1"> href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1">
LAMPIRAN FOTO DAN DOKUMEN LAMPIRAN FOTO DAN DOKUMEN
</a> </a>
<a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jaminanId')]) }}"
class="btn btn-light">
<i class="ki-filled ki-printer"></i> Hasil Inspeksi
</a>
<a class="btn btn-primary" <a class="btn btn-primary"
onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', '{{ request('inspeksiId') }}', {{ request('jaminanId') }}, )"> onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', '{{ request('inspeksiId') }}', {{ request('jaminanId') }}, )">
<i class="ki-filled ki-printer"></i> Print <i class="ki-filled ki-printer"></i> Print Laporan
</a> </a>
@endif @endif
</div> </div>
@@ -411,7 +530,7 @@
@endsection @endsection
@push('scripts') @push('scripts')
<script type="text/javascript"> <script type="text/javascript">
const callReports = @json($callReport); const callReports = @json($forminspeksi);
console.log('callReport', callReports) console.log('callReport', callReports)
@@ -424,42 +543,41 @@
perihal: "", perihal: "",
pihak_kjjpp: "", pihak_kjjpp: "",
dari: "", dari: "",
lelang: "", lelang_kjpp: "",
fakta: { nilai_pasar_kjpp: "",
fakta_positif: [], persentase_likuidasi_kjpp: "",
fakta_negatif: [] hasil_nilai_likuidasi_kjpp: "",
}, lelang_internal: "",
nilai_pasar: "", nilai_pasar_internal: "",
persentase_likuidasi: "", persentase_likuidasi_internal: "",
hasil_nilai_likuidasi: "" hasil_nilai_likuidasi_internal: "",
}; };
// Ambil fakta positif
document.querySelectorAll('textarea[name="fakta_positif[]"]').forEach(textarea => {
if (textarea.value.trim() !== "") {
jsonData.fakta.fakta_positif.push(textarea.value.trim());
}
});
// Ambil fakta negatif
document.querySelectorAll('textarea[name="fakta_negatif[]"]').forEach(textarea => {
if (textarea.value.trim() !== "") {
jsonData.fakta.fakta_negatif.push(textarea.value.trim());
}
});
jsonData.perihal = document.querySelector('input[name="perihal"]')?.value.trim() || ""; jsonData.perihal = document.querySelector('input[name="perihal"]')?.value.trim() || "";
jsonData.pihak_kjjpp = document.querySelector('input[name="pihak_kjjpp"]')?.value.trim() || "";
jsonData.dari = document.querySelector('input[name="dari"]')?.value.trim() || ""; jsonData.dari = document.querySelector('input[name="dari"]')?.value.trim() || "";
jsonData.tanggal = document.querySelector('input[name="tanggal"]')?.value.trim() || ""; jsonData.tanggal = document.querySelector('input[name="tanggal"]')?.value.trim() || "";
jsonData.kepada = document.querySelector('input[name="kepada"]')?.value.trim() || ""; jsonData.kepada = document.querySelector('input[name="kepada"]')?.value.trim() || "";
jsonData.nomor_laporan = document.querySelector('input[name="nomor_laporan"]')?.value.trim() || ""; jsonData.nomor_laporan = document.querySelector('input[name="nomor_laporan"]')?.value.trim() || "";
jsonData.lelang = document.querySelector('input[name="lelang"]')?.value.trim() || ""; jsonData.lelang_kjpp = document.querySelector('input[name="lelang_kjpp"]')?.value.trim() || "";
// Ambil nilai lainnya // Ambil nilai lainnya
jsonData.nilai_pasar = cleanCurrencyValue(document.querySelector('input[name="nilai_pasar"]')?.value.trim() || ""); jsonData.nilai_pasar_kjpp = cleanCurrencyValue(document.querySelector('input[name="nilai_pasar_kjpp"]')?.value.trim() ||
jsonData.persentase_likuidasi = cleanCurrencyValue(document.querySelector('input[name="likuidasi"]')?.value.trim() || ""); "");
jsonData.hasil_nilai_likuidasi = cleanCurrencyValue(document.querySelector('input[name="likuidasi_nilai_1"]')?.value.trim() || ""); jsonData.persentase_likuidasi_kjpp = cleanCurrencyValue(document.querySelector('input[name="persentase_likuidasi_kjpp"]')?.value
.trim() || "");
jsonData.hasil_nilai_likuidasi_kjpp = cleanCurrencyValue(document.querySelector('input[name="hasil_nilai_likuidasi_kjpp"]')
?.value.trim() || "");
jsonData.lelang_internal = document.querySelector('input[name="lelang_internal"]')?.value.trim() || "";
jsonData.nilai_pasar_internal = cleanCurrencyValue(document.querySelector('input[name="nilai_pasar_internal"]')?.value.trim() ||
"");
jsonData.persentase_likuidasi_internal = cleanCurrencyValue(document.querySelector('input[name="persentase_likuidasi_internal"]')?.value
.trim() || "");
jsonData.hasil_nilai_likuidasi_internal = cleanCurrencyValue(document.querySelector('input[name="hasil_nilai_likuidasi_internal"]')
?.value.trim() || "");
return jsonData; return jsonData;
} }
@@ -472,6 +590,24 @@
const permohonanId = {{ $permohonan->id }}; const permohonanId = {{ $permohonan->id }};
const documentId = urlParams.get('documentId'); const documentId = urlParams.get('documentId');
const inspeksiId = urlParams.get('inspeksiId'); const inspeksiId = urlParams.get('inspeksiId');
const faktaPositif = Array.from(document.querySelectorAll('[name="fakta_positif[]"]'))
.map(textarea => textarea.value.trim())
.filter(value => value !== '');
const faktaNegatif = Array.from(document.querySelectorAll('[name="fakta_negatif[]"]'))
.map(textarea => textarea.value.trim())
.filter(value => value !== '');
const keterangan = Array.from(document.querySelectorAll('[name="keterangan[]"]'))
.map(textarea => textarea.value.trim())
.filter(value => value !== '');
const action = Array.from(document.querySelectorAll('input[name="action"]'))
.map(input => input.value)
.join(',') || "";
const type = Array.from(document.querySelectorAll('input[name="type"]'))
.map(input => input.value)
.join(',') || "";
const requestUrl = const requestUrl =
`{{ route('penilai.storeCallReport') }}?permohonan_id=${permohonanId}&inspeksi_id=${inspeksiId}&dokument_id=${documentId}`; `{{ route('penilai.storeCallReport') }}?permohonan_id=${permohonanId}&inspeksi_id=${inspeksiId}&dokument_id=${documentId}`;
@@ -485,6 +621,11 @@
dokument_id: documentId, dokument_id: documentId,
inspeksi_id: inspeksiId, inspeksi_id: inspeksiId,
data: jsonData, data: jsonData,
fakta_positif: faktaPositif,
fakta_negatif: faktaNegatif,
action: action,
type: type,
keterangan: keterangan
}), }),
contentType: 'application/json', contentType: 'application/json',
headers: { headers: {
@@ -531,10 +672,14 @@
} }
</script> </script>
<script> <script>
function calculateTotal() { function calculateTotal(event) {
let nilaiPasarInput = document.getElementById('nilai-pasar'); const group = event.dataset.group;
let nilaiLikuidasi = document.getElementById('likuidasi');
let totalLikuidasi = document.getElementById('total-likuidasi'); // Ambil elemen-elemen terkait berdasarkan group
const nilaiPasarInput = document.querySelector(`#nilai-pasar-${group}`);
const nilaiLikuidasi = document.querySelector(`#likuidasi-${group}`);
const totalLikuidasi = document.querySelector(`#total-likuidasi-${group}`);
const cleanNilaiPasar = cleanCurrencyValue(nilaiPasarInput.value); const cleanNilaiPasar = cleanCurrencyValue(nilaiPasarInput.value);
let cleanLikuidasi = cleanCurrencyValue(nilaiLikuidasi.value); let cleanLikuidasi = cleanCurrencyValue(nilaiLikuidasi.value);

View File

@@ -13,72 +13,103 @@
@foreach ($groupedPhotos as $category => $photos) @foreach ($groupedPhotos as $category => $photos)
<div class="mt-5"> <div class="mt-5">
<h2 class="text-gray-800 font-bold text-xl mb-3">{{ $category ?? 'Tanpa Kategori' }}</h2> <h2 class="text-gray-800 font-bold text-xl mb-3">{{ $category ?? 'Tanpa Kategori' }}</h2>
<div class="grid gap-5"> <div class="card border rounded-lg shadow-lg p-4">
@php <!-- Carousel Container -->
$groupedBySubcategory = $photos->groupBy('sub'); <div class="relative w-full overflow-hidden">
@endphp <div class="flex transition-transform duration-500 ease-in-out" id="carousel-{{ $category }}">
<span class="absolute top-0 right-2 text-white">
@if ($groupedBySubcategory->isEmpty()) <i class="ki-filled ki-maximize"></i>
</span>
@foreach ($photos as $index => $item) @foreach ($photos as $index => $item)
<div class="flex items-center justify-between"> <div class="min-w-full flex flex-col items-center hover:cursor-pointer"
<div class="grid gap-5"> onclick="openPreview('{{ asset('storage/' . $item['path']) }}', '{{ $item['name'] }}', '{{ $item['description'] }}')">
<h3 class="text-gray-600 font-semibold text-lg">
{{ $item['name'] ?? 'Foto - ' . ($index + 1) }} <div class="w-full overflow-hidden rounded-md" style="height: 500px;">
</h3>
<div class="flex items-center">
@if (isset($item['path'])) @if (isset($item['path']))
<img src="{{ asset('storage/' . $item['path']) }}" alt="Gambar {{ $index + 1 }}" <img src="{{ asset('storage/' . $item['path']) }}"
class="w-full h-auto object-cover rounded-md"> alt="Gambar {{ $index + 1 }}" class="w-full h-full object-cover">
@else @else
<p class="text-gray-500">Gambar tidak tersedia</p> <p class="text-gray-500">Gambar tidak tersedia</p>
@endif @endif
</div> </div>
<p class="text-gray-500 text-sm">{{ $item['description'] ?? '-' }}</p> <h3 class="text-gray-600 font-semibold text-lg mt-3">
</div>
</div>
@endforeach
@else
<!-- Jika ada subkategori, tampilkan berdasarkan subkategori -->
@foreach ($groupedBySubcategory as $subcategory => $subPhotos)
<div class="mb-4">
<!-- Judul Subkategori -->
<h4 class="text-gray-700 font-semibold text-lg mb-2">
@if ($subcategory)
{{ $subcategory }}
@endif
</h4>
<div class="grid gap-5">
@foreach ($subPhotos as $index => $item)
<div class="flex items-center justify-between">
<div class="grid gap-5">
<h3 class="text-gray-600 font-semibold text-lg">
{{ $item['name'] ?? 'Foto - ' . ($index + 1) }} {{ $item['name'] ?? 'Foto - ' . ($index + 1) }}
</h3> </h3>
<div class="flex items-center"> <p class="text-gray-500 text-sm mt-1">{{ $item['description'] ?? '-' }}</p>
@if (isset($item['path']))
<img src="{{ asset('storage/' . $item['path']) }}" alt="Gambar {{ $index + 1 }}"
class="w-full h-auto object-cover rounded-md">
@else
<p class="text-gray-500">Gambar tidak tersedia</p>
@endif
</div>
<p class="text-gray-500 text-sm">{{ $item['description'] ?? '-' }}</p>
</div>
</div> </div>
@endforeach @endforeach
</div> </div>
<!-- Navigation Buttons -->
<button
class="absolute top-1/2 left-0 transform -translate-y-1/2 bg-gray-800 text-white rounded-full p-2 focus:outline-none"
onclick="prevSlide('{{ $category }}')">
<i class="ki-outline ki-left-square"></i>
</button>
<button
class="absolute top-1/2 right-0 transform -translate-y-1/2 bg-gray-800 text-white rounded-full p-2 focus:outline-none"
onclick="nextSlide('{{ $category }}')">
<i class="ki-outline ki-right-square"></i>
</button>
</div> </div>
@endforeach
@endif
</div> </div>
</div> </div>
@endforeach @endforeach
@endif @endif
@endisset @endisset
<script>
let currentIndex = {};
function nextSlide(category) {
if (!currentIndex[category]) currentIndex[category] = 0;
const carousel = document.getElementById(`carousel-${category}`);
const totalSlides = carousel.children.length;
currentIndex[category] = (currentIndex[category] + 1) % totalSlides;
carousel.style.transform = `translateX(-${currentIndex[category] * 100}%)`;
}
function prevSlide(category) {
if (!currentIndex[category]) currentIndex[category] = 0;
const carousel = document.getElementById(`carousel-${category}`);
const totalSlides = carousel.children.length;
currentIndex[category] = (currentIndex[category] - 1 + totalSlides) % totalSlides;
carousel.style.transform = `translateX(-${currentIndex[category] * 100}%)`;
}
function openPreview(imagePath, name, description) {
const previewModal = document.createElement('div');
previewModal.className = 'fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50';
previewModal.innerHTML = `
<div class="relative">
<h3 class="text-white font-semibold text-lg mt-3 text-center">${name}</h3>
<img src="${imagePath}" class="max-w-full max-h-screen object-contain">
<button class="absolute top-2 right-2 bg-red-500 text-white rounded-full p-2"
onclick="closePreview(this)">×</button>
<p class="text-white text-sm mt-1">${description}</p>
</div>
`;
document.body.appendChild(previewModal);
}
function closePreview(button) {
const modal = button.closest('div.fixed');
if (modal) {
modal.remove();
}
}
</script>
@php @php
$fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat']; $fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat', 'foto_sentuh_tanahku'];
if (($key = array_search('foto_tempat', $fotoTypes)) !== false) { if (($key = array_search('foto_tempat', $fotoTypes)) !== false) {
unset($fotoTypes[$key]); unset($fotoTypes[$key]);
array_unshift($fotoTypes, 'foto_tempat'); array_unshift($fotoTypes, 'foto_tempat');

View File

@@ -13,6 +13,7 @@
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
font-size: 12px; font-size: 12px;
} }
/** Define the header rules **/ /** Define the header rules **/
@page { @page {
margin-top: 100px; margin-top: 100px;
@@ -88,7 +89,11 @@
border: 1px solid #000; border: 1px solid #000;
} }
.no-break {
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
</style> </style>
</head> </head>
@@ -97,7 +102,7 @@
<table style="width: 100%; border: none;"> <table style="width: 100%; border: none;">
<tr> <tr>
<td style="width: 20%; text-align: left;" class="header-left"> <td style="width: 20%; text-align: left;" class="header-left">
@include('lpj::component.logo-bag') @include('lpj::component.logo-bag', ['width' => 150, 'height' => 40])
</td> </td>
<td style="text-align: right;"> <td style="text-align: right;">
<div style=""> <div style="">
@@ -109,4 +114,3 @@
</tr> </tr>
</table> </table>
</header> </header>

View File

@@ -23,10 +23,24 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Jenis Properti</label> <label class="form-label max-w-56">Jenis Properti</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['jenis_aset'] }}</span> <span>{{ $item['jenis_aset'] ?? '' }}</span>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Alamat Lokasi</label>
<div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['address'] ?? '' }}</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Status Hak Tanah</label>
<div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['hak_properti'] ?? '' }}</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Harga Penawaran</label> <label class="form-label max-w-56">Harga Penawaran</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@@ -34,6 +48,12 @@
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Indikasi Harga Transaksi</label>
<div class="flex flex-wrap items-baseline w-full">
<span>{{ isset($item['harga_diskon']) ? formatRupiah($item['harga_diskon']) : '' }}</span>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Penjual (HP)</label> <label class="form-label max-w-56">Penjual (HP)</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@@ -44,14 +64,14 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Ditawarkan sejak</label> <label class="form-label max-w-56">Ditawarkan sejak</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['penawaran'] }}</span> <span>{{ $item['penawaran'] ?? '' }}</span>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">LT</label> <label class="form-label max-w-56">LT</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['luas_tanah'] }} </span> <span>{{ $item['luas_tanah'] ?? '' }} </span>
<sup> m2</sup> <sup> m2</sup>
</div> </div>
</div> </div>
@@ -59,7 +79,7 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">LB</label> <label class="form-label max-w-56">LB</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['luas_bangunan'] }} </span> <span>{{ $item['luas_bangunan'] ?? '' }} </span>
<sup> m2</sup> <sup> m2</sup>
</div> </div>
</div> </div>
@@ -67,7 +87,7 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Titik Koordinat</label> <label class="form-label max-w-56">Titik Koordinat</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<span>{{ $item['kordinat_lat'] }} , {{ $item['kordinat_lng'] }}</span> <span>{{ $item['kordinat_lat'] ?? '' }} , {{ $item['kordinat_lng'] ?? '' }}</span>
</div> </div>
</div> </div>

View File

@@ -44,10 +44,12 @@
</div> </div>
</div> </div>
<div class="flex card-footer justify-end gap-5"> <div class="flex card-footer justify-end gap-5">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
<button type="button" class="btn btn-primary" id="saveButton" onclick="saveLpjSederhanadanStandard()"> <button type="button" class="btn btn-primary" id="saveButton" onclick="saveLpjSederhanadanStandard()">
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>
<span id="saveButtonText">Save</span> <span id="saveButtonText">Save</span>
</button> </button>
@endif
@if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator']))
<a class="btn btn-info" <a class="btn btn-info"
href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1"> href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1">

View File

@@ -292,14 +292,16 @@
{{-- @include('lpj::penilai.components.foto-lampiran') --}} {{-- @include('lpj::penilai.components.foto-lampiran') --}}
<div class="flex card-footer justify-end gap-5"> <div class="flex card-footer justify-end gap-5">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
<a class="btn btn-primary" onclick="saveMemo()"> <a class="btn btn-primary" onclick="saveMemo()">
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>
SAVE Simpan
</a> </a>
@if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal'])) @endif
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']))
<a class="btn btn-info" <a class="btn btn-info"
href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1"> href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1">
LAMPIRAN FOTO DAN DOKUMEN Lampiran Foto dan Dokument
</a> </a>
<a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jaminanId')]) }}" <a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jaminanId')]) }}"
class="btn btn-light"> class="btn btn-light">
@@ -307,7 +309,7 @@
</a> </a>
<a class="btn btn-success" <a class="btn btn-success"
onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', '{{ request('inspeksiId') }}', {{ request('jaminanId') }}, )"> onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', '{{ request('inspeksiId') }}', {{ request('jaminanId') }}, )">
<i class="ki-filled ki-printer"></i> Print <i class="ki-filled ki-printer"></i> Cetak Laporan
</a> </a>
@endif @endif
</div> </div>

View File

@@ -225,23 +225,22 @@
</td> </td>
</tr> </tr>
</table> </table>
@isset($report['fakta']['fakta_positif'])
<table style="margin: 5px 0; border-collapse: collapse; width: 100%;"> <table style="margin: 5px 0; border-collapse: collapse; width: 100%;">
<tr> <tr>
<td style=""> <td style="">
<h6 style="text-transform: uppercase; margin: 0; ">Faktor positif</h2> <h6 style="text-transform: uppercase; margin: 0; ">Faktor Positif</h2>
</td> </td>
</tr> </tr>
<tr> <tr>
@foreach ($report['fakta']['fakta_positif'] as $key => $item) @isset($forminspeksi['fakta']['fakta_positif'])
@foreach ($forminspeksi['fakta']['fakta_positif'] as $key => $item)
<tr> <tr>
<td>{{ $item }}</td> <td>{!! nl2br(e($item)) !!}</td>
</tr> </tr>
@endforeach @endforeach
@endisset
</tr> </tr>
</table> </table>
@endisset
@isset($report['fakta']['fakta_negatif'])
<table style="margin: 5px 0; border-collapse: collapse; width: 100%;"> <table style="margin: 5px 0; border-collapse: collapse; width: 100%;">
<tr> <tr>
<td style=""> <td style="">
@@ -249,25 +248,26 @@
</td> </td>
</tr> </tr>
<tr> <tr>
@foreach ($report['fakta']['fakta_negatif'] as $key => $item) @isset($forminspeksi['fakta']['fakta_negatif'])
@foreach ($forminspeksi['fakta']['fakta_negatif'] as $key => $item)
<tr> <tr>
<td>{{ $item }}</td> <td>{!! nl2br(e($item)) !!}</td>
</tr> </tr>
@endforeach @endforeach
@endisset
</tr> </tr>
</table> </table>
@endisset
<table style="margin: 5px 0; border-collapse: collapse; width: 100%;"> <table style="margin: 5px 0; border-collapse: collapse; width: 100%;">
<tr> <tr>
<td style=""> <td style="">
<h6 style="text-transform: uppercase; margin: 0; ">3. Catatan Yang Perlu Diperhatikan</h6> <h6 style="text-transform: uppercase; margin: 0; ">Catatan Yang Perlu Diperhatikan</h6>
</td> </td>
</tr> </tr>
<tr> <tr>
@isset($report['kesimpulan_saran']) @isset($forminspeksi['fakta']['keterangan'])
@foreach ($report['kesimpulan_saran'] as $key => $item) @foreach ($forminspeksi['fakta']['keterangan'] as $key => $item)
<tr> <tr>
<td> {{ $item }}</td> <td>{!! nl2br(e($item)) !!}</td>
</tr> </tr>
@endforeach @endforeach
@endisset @endisset

View File

@@ -134,14 +134,13 @@ $data = rtrim($data, ', ');
@if (@isset($dokumen)) @if (@isset($dokumen))
@foreach ($dokumen->detail as $detail) @foreach ($dokumen->detail as $detail)
<tr>
@if (isset($detail->dokumen_jaminan)) @if (isset($detail->dokumen_jaminan))
<tr>
<td style="width: 20%; padding: 2px;"> <td style="width: 20%; padding: 2px;">
{{ $detail->name ?? '' }} {{ $detail->name ?? '' }}
</td> </td>
<td style="width: 1%; padding: 2px;">:</td> <td style="width: 1%; padding: 2px;">:</td>
<td style="width: 79%; padding: 2px;"> <td style="width: 79%; padding: 2px;">
@if (isset($detail->dokumen_jaminan))
@php @php
$dokumen_jaminan = is_string($detail->dokumen_jaminan) $dokumen_jaminan = is_string($detail->dokumen_jaminan)
? json_decode($detail->dokumen_jaminan, true) ? json_decode($detail->dokumen_jaminan, true)
@@ -153,9 +152,7 @@ $data = rtrim($data, ', ');
$dokumen_nomor = is_string($detail->dokumen_nomor) $dokumen_nomor = is_string($detail->dokumen_nomor)
? json_decode($detail->dokumen_nomor, true) ? json_decode($detail->dokumen_nomor, true)
: []; : [];
$dokumen_nomor = is_array($dokumen_nomor) $dokumen_nomor = is_array($dokumen_nomor) ? $dokumen_nomor : [$detail->dokumen_nomor];
? $dokumen_nomor
: [$detail->dokumen_nomor];
@endphp @endphp
@foreach ($dokumen_jaminan as $index => $dokumen) @foreach ($dokumen_jaminan as $index => $dokumen)
@@ -165,31 +162,36 @@ $data = rtrim($data, ', ');
@endif @endif
</div> </div>
@endforeach @endforeach
@endif
</td> </td>
@endif
</tr> </tr>
@endif
<tr>
@if (isset($detail->details)) @if (isset($detail->details))
@if (json_decode($detail->details)) @php
@foreach (json_decode($detail->details) as $key => $value) $detailItems = json_decode($detail->details, true);
@endphp
@if (is_array($detailItems))
@foreach ($detailItems as $key => $value)
@if (!is_null($value) && $value !== '') @if (!is_null($value) && $value !== '')
<tr>
<td style="width: 20%; padding: 2px;"> <td style="width: 20%; padding: 2px;">
{{ ucwords(str_replace('_', ' ', $key)) ?? '' }}</td> {{ ucwords(str_replace('_', ' ', $key)) ?? '' }}
</td>
<td style="width: 1%; padding: 2px;">:</td> <td style="width: 1%; padding: 2px;">:</td>
<td style="width: 79%; padding: 2px;">{{ $value }} <td style="width: 79%; padding: 2px;">
{{ $value }}
@if ($key == 'luas_bangunan' || $key == 'luas_tanah') @if ($key == 'luas_bangunan' || $key == 'luas_tanah')
<sup>m2</sup> <sup>m2</sup>
@endif @endif
</td> </td>
@endif
@endforeach
@endif
@endif
</tr> </tr>
@endif
@endforeach @endforeach
@endif @endif
@endif
@endforeach
@endif
@if (isset($forminspeksi['perizinan']) && is_array($forminspeksi['perizinan']) && count($forminspeksi['perizinan']) > 0) @if (isset($forminspeksi['perizinan']) && is_array($forminspeksi['perizinan']) && count($forminspeksi['perizinan']) > 0)
@foreach ($forminspeksi['perizinan'] as $perizinan) @foreach ($forminspeksi['perizinan'] as $perizinan)
@@ -414,6 +416,17 @@ $data = rtrim($data, ', ');
</table> </table>
@endisset @endisset
@isset($forminspeksi['properti_sejenis'])
<h2 style="text-transform: uppercase;">PROPERTI SEJENIS</h2>
<table>
<tr>
<td>
{{ $forminspeksi['properti_sejenis'] ?? '' }}
</td>
</tr>
</table>
@endisset
@if (isset($forminspeksi['fakta']) && is_array($forminspeksi['fakta'])) @if (isset($forminspeksi['fakta']) && is_array($forminspeksi['fakta']))
<h2 style="text-transform: uppercase;">ATURAN TATA KOTA</h2> <h2 style="text-transform: uppercase;">ATURAN TATA KOTA</h2>
<table> <table>
@@ -434,8 +447,13 @@ $data = rtrim($data, ', ');
@if (isset($forminspeksi['fakta']) && is_array($forminspeksi['fakta'])) @if (isset($forminspeksi['fakta']) && is_array($forminspeksi['fakta']))
@foreach ($informasi as $key) @foreach ($informasi as $key)
@if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-') @if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-')
<p> - {{ ucfirst(str_replace('_', ' ', $key)) }}: @php
{{ $forminspeksi['fakta'][$key] }}</p> $displayKey = ucfirst(str_replace('_', ' ', $key));
if (strlen($key) == 3) {
$displayKey = strtoupper($key);
}
@endphp
<p> - {{ $displayKey }}: {{ $forminspeksi['fakta'][$key] }}</p>
@endif @endif
@endforeach @endforeach
@endif @endif

View File

@@ -166,14 +166,11 @@
@if (@isset($dokumen)) @if (@isset($dokumen))
@foreach ($dokumen->detail as $detail) @foreach ($dokumen->detail as $detail)
<tr>
@if (isset($detail->dokumen_jaminan)) @if (isset($detail->dokumen_jaminan))
<td style=" padding: 2px; vertical-align: top;"> <tr>
{{ $detail->name ?? '' }} <td style="padding: 2px; vertical-align: top;">{{ $detail->name ?? '' }}</td>
</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
@if (isset($detail->dokumen_jaminan))
@php @php
$dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan)) $dokumen_jaminan = is_array(json_decode($detail->dokumen_jaminan))
? json_decode($detail->dokumen_jaminan) ? json_decode($detail->dokumen_jaminan)
@@ -184,7 +181,6 @@
? [$detail->dokumen_nomor] ? [$detail->dokumen_nomor]
: []); : []);
@endphp @endphp
@foreach ($dokumen_jaminan as $index => $dokumen) @foreach ($dokumen_jaminan as $index => $dokumen)
<div> <div>
@if (!empty($dokumen_nomor[$index])) @if (!empty($dokumen_nomor[$index]))
@@ -192,35 +188,34 @@
@endif @endif
</div> </div>
@endforeach @endforeach
@endif
</td> </td>
@endif
</tr> </tr>
@endif
<tr> @if (isset($detail->details) && json_decode($detail->details))
@if (isset($detail->details))
@if (json_decode($detail->details))
@foreach (json_decode($detail->details) as $key => $value) @foreach (json_decode($detail->details) as $key => $value)
@if (!is_null($value) && $value !== '') @if (!is_null($value) && $value !== '')
<tr>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ ucwords(str_replace('_', ' ', $key)) ?? '' }}</td> {{ ucwords(str_replace('_', ' ', $key)) ?? '' }}
</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $value }} <td style="padding: 2px; vertical-align: top;">
{{ $value }}
@if ($key == 'luas_bangunan' || $key == 'luas_tanah') @if ($key == 'luas_bangunan' || $key == 'luas_tanah')
<sup>m2</sup> <sup>m2</sup>
@endif @endif
</td> </td>
</tr>
@endif @endif
@endforeach @endforeach
@endif @endif
@endif
</tr>
@endforeach @endforeach
@endif @endif
@if (isset($forminspeksi['asset']['nomor_nib'])) @if (isset($forminspeksi['asset']['nomor_nib']))
<tr> <tr>
<td style=" padding: 2px; vertical-align: top;">Nomor NIB</td>
<td style=" padding: 2px; vertical-align: top;">:</td> <td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;"> <td style=" padding: 2px; vertical-align: top;">
{{ $forminspeksi['asset']['nomor_nib'] ?? '' }}</td> {{ $forminspeksi['asset']['nomor_nib'] ?? '' }}</td>
@@ -247,6 +242,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td>
<table> <table>
<tr> <tr>
@@ -741,121 +737,23 @@
</tr> </tr>
</table> </table>
<div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td style=" border: 1px solid #000;"> <td style=" border: 1px solid #000;">
D. ASURANSI D. INFORMASI HARGA
</td> </td>
</tr> </tr>
@if (!empty($lpjData['asuransi_luas_bangunan']))
<tr>
<td>
<table border="1" style="width: 100%; border-collapse: collapse; margin-bottom: 10px;">
<tr>
<td style="border: 1px solid #000; padding: 4px;">Luas Bangunan</td>
<td style="border: 1px solid #000; padding: 4px;">Harga</td>
<td style="border: 1px solid #000; padding: 4px;">Nilai Pasar Wajar (Rp)</td>
</tr>
<tr>
<td style="border: 1px solid #000; padding: 4px;">
{{ $lpjData['asuransi_luas_bangunan'] ?? '' }}</td>
<td style="border: 1px solid #000; padding: 4px;">
{{ formatRupiah($lpjData['asuransi_nilai_1']) ?? '' }}</td>
<td style="border: 1px solid #000; padding: 4px;">
{{ formatRupiah($lpjData['asuransi_nilai_2']) ?? '' }}</td>
</tr>
</table> </table>
</td> @include('lpj::penilai.components.print-pembanding')
</tr> </div>
@else <div class="no-break">
<tr>
<td>Tidak Ada</td>
</tr>
@endif
</table>
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td style=" border: 1px solid #000;"> <td style="border: 1px solid #000; "> <strong>E. INFORMASI NILAI</strong>
E. INFORMASI HARGA
</td> </td>
</tr> </tr>
</table> </table>
<table style="width: 100%;">
<tr>
<td style="vertical-align: top;">Informasi data pembanding</td>
<td>:</td>
<td>
@php
$exportData = [];
if (isset($dataPembanding['data_pembanding'])) {
foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) {
$exportData['pembanding' . ($index + 1)] = $pembanding;
}
}
$fields = [
'jenis_aset' => 'Jenis properti',
'harga' => 'Harga Penawaran',
'telepon' => 'Penjual (HP)',
'penawaran' => 'Ditawarkan Sejak',
'luas_tanah' => 'Luas Tanah',
'luas_bangunan' => 'Luas Bangunan',
'kordinat' => 'Titik Kordinat',
];
@endphp
@foreach ($exportData as $index => $data)
<table style="width: 100%; margin-bottom: 15px; border-bottom: 1px solid #ddd;">
<tr>
<td style="font-weight: bold; padding-bottom: 8px;">
Pembanding {{ substr($index, -1) }}
</td>
</tr>
@foreach ($fields as $key => $label)
<tr>
<td style="width: 33%;">{{ $label }}</td>
<td style="width: 5%;">:</td>
<td style="width: 62%;">
@if ($key == 'luas_tanah' || $key == 'luas_bangunan')
{{ $data[$key] ?? '-' }}
@elseif($key == 'harga' || $key == 'harga_diskon')
Rp. {{ $data[$key] ?? 0 }}
@elseif($key == 'kordinat')
@php
$lat = $data['kordinat_lat'] ?? null;
$lng = $data['kordinat_lng'] ?? null;
@endphp
@if ($lat && $lng)
{{ $lat }},{{ $lng }}
@else
-
@endif
@else
{{ $data[$key] ?? '-' }}
@endif
</td>
</tr>
@endforeach
</table>
@endforeach
</td>
</tr>
</table>
<table style="width: 100%">
<tr>
<td style="border: 1px solid #000; "> <strong>F. INFORMASI NILAI</strong>
</td>
</tr>
</table>
<table style="width: 100%;"> <table style="width: 100%;">
<tr> <tr>
<td style="padding: 8px; width: 100%;"> <td style="padding: 8px; width: 100%;">
@@ -942,11 +840,12 @@
</td> </td>
</tr> </tr>
</table> </table>
</div>
<div class="no-break">
<table style="width: 100%;"> <table style="width: 100%;">
<tr> <tr>
<td style="border: 1px solid #000;"> <td style="border: 1px solid #000;">
G. ANALISA FAKTA F. ANALISA FAKTA
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -1009,8 +908,13 @@
@foreach ($informasi as $key) @foreach ($informasi as $key)
@if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-') @if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-')
<p> - {{ ucfirst(str_replace('_', ' ', $key)) }}: @php
{{ $forminspeksi['fakta'][$key] }}</p> $displayKey = ucfirst(str_replace('_', ' ', $key));
if (strlen($key) == 3) {
$displayKey = strtoupper($key);
}
@endphp
<p> - {{ $displayKey }}: {{ $forminspeksi['fakta'][$key] }}</p>
@endif @endif
@endforeach @endforeach
@@ -1163,7 +1067,7 @@
</table> </table>
</tr> </tr>
</table> </table>
</div>
<div class="page-break"></div> <div class="page-break"></div>
<table style="width: 100%; border-collapse: collapse; border: 1px solid #000;"> <table style="width: 100%; border-collapse: collapse; border: 1px solid #000;">
<tr> <tr>
@@ -1191,7 +1095,7 @@
</div> </div>
<div class="photo-container"> <div class="photo-container">
@php @php
$fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat']; $fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat', 'foto_sentuh_tanahku'];
// Memindahkan foto_tempat ke depan jika ada // Memindahkan foto_tempat ke depan jika ada
if (($key = array_search('foto_tempat', $fotoTypes)) !== false) { if (($key = array_search('foto_tempat', $fotoTypes)) !== false) {
unset($fotoTypes[$key]); unset($fotoTypes[$key]);

View File

@@ -87,7 +87,7 @@
</td> </td>
</tr> </tr>
</table> </table>
<div class="no-break">
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -109,12 +109,15 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="width: 25%; padding: 2px; vertical-align: top;">Pihak Bank selain Apraisal</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Pihak Bank selain Appraisal</td>
<td style="width: 1%; vertical-align: top;">:</td> <td style="width: 1%; vertical-align: top;">:</td>
<td style="vertical-align: top;">{{ $forminspeksi['asset']['pihak_bank'] ?? '' }} <td style="vertical-align: top;">{{ $forminspeksi['asset']['pihak_bank'] ?? '' }}
</td> </td>
</tr> </tr>
</table> </table>
</div>
<div class="no-break">
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -149,6 +152,9 @@
<td>{{ $alamat['province_code'] ?? '' }}</td> <td>{{ $alamat['province_code'] ?? '' }}</td>
</tr> </tr>
</table> </table>
</div>
<div class="no-break">
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -211,6 +217,9 @@
@endforeach @endforeach
@endif @endif
</table> </table>
</div>
<div class="no-break">
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -231,7 +240,7 @@
? $forminspeksi['asset']['hub_cadeb']['tidak sesuai'] ? $forminspeksi['asset']['hub_cadeb']['tidak sesuai']
: $forminspeksi['asset']['hub_cadeb']['sesuai']; : $forminspeksi['asset']['hub_cadeb']['sesuai'];
@endphp @endphp
<td style="width:25%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitu</td> <td style="width:25%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitur</td>
<td style="width:1%; padding: 2px; vertical-align: top;">:</td> <td style="width:1%; padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td> <td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td>
</tr> </tr>
@@ -253,8 +262,9 @@
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td> <td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td>
</tr> </tr>
</table> </table>
</div>
<div class="no-break">
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan) @if ($dokumen->jenisJaminan)
@php @php
@@ -274,7 +284,8 @@
@endif @endif
@endif @endif
@endforeach @endforeach
</div>
<div class="no-break">
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -282,67 +293,10 @@
</td> </td>
</tr> </tr>
</table> </table>
<table style="width: 100%; "> @include('lpj::penilai.components.print-pembanding')
<tr> </div>
<td style="width:25%; vertical-align: top;">Informasi data pembanding</td>
<td style="width:1%; vertical-align: top;">:</td>
<td style="vertical-align: top;">
@php
$exportData = [];
if (isset($dataPembanding['data_pembanding'])) {
foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) {
$exportData['pembanding' . ($index + 1)] = $pembanding;
}
}
$fields = [ <div class="no-break">
'jenis_aset' => 'Jenis properti',
'harga' => 'Harga Penawaran',
'telepon' => 'Penjual (HP)',
'penawaran' => 'Ditawarkan Sejak',
'luas_tanah' => 'Luas Tanah',
'luas_bangunan' => 'Luas Bangunan',
'kordinat' => 'Titik Kordinat',
];
@endphp
@foreach ($exportData as $index => $data)
<table style="width: 100%; margin-bottom: 15px; border-bottom: 1px solid #ddd;">
<tr>
<td style="font-weight: bold; padding-bottom: 8px;">
Pembanding {{ substr($index, -1) }}
</td>
</tr>
@foreach ($fields as $key => $label)
<tr>
<td style="width: 33%;">{{ $label }}</td>
<td style="width: 5%;">:</td>
<td style="width: 62%;">
@if ($key == 'luas_tanah' || $key == 'luas_bangunan')
{{ $data[$key] ?? '-' }}
@elseif($key == 'harga' || $key == 'harga_diskon')
{{ formatRupiah($data[$key]) ?? 0 }}
@elseif($key == 'kordinat')
@php
$lat = $data['kordinat_lat'] ?? null;
$lng = $data['kordinat_lng'] ?? null;
@endphp
@if ($lat && $lng)
{{ $lat }},{{ $lng }}
@else
-
@endif
@else
{{ $data[$key] ?? '-' }}
@endif
</td>
</tr>
@endforeach
</table>
@endforeach
</td>
</tr>
</table>
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -438,6 +392,7 @@
</td> </td>
</tr> </tr>
</table> </table>
</div>
@php @php
$keterangan = $lpjData['keterangan_penilai'] ?? ''; $keterangan = $lpjData['keterangan_penilai'] ?? '';
if (is_array($keterangan)) { if (is_array($keterangan)) {
@@ -458,6 +413,7 @@
</tr> </tr>
</table> </table>
@endif @endif
<div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td>Demikian laporan penilai jaminan ini di buat secara objektif, tanpa adanya pengaruh baik intern <td>Demikian laporan penilai jaminan ini di buat secara objektif, tanpa adanya pengaruh baik intern
@@ -470,7 +426,9 @@
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
$penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first(); $penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first();
$imagePathPenilai = storage_path('app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign); $imagePathPenilai = storage_path(
'app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign,
);
$soUser = User::where('id', $senior_officer->id)->first(); $soUser = User::where('id', $senior_officer->id)->first();
$imagePathSo = storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign); $imagePathSo = storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign);
@@ -551,40 +509,7 @@
@endif @endif
</tr> </tr>
</table> </table>
</div>
<table style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
NILAI ASURANSI
</td>
</tr>
</table>
<table>
@if (!empty($lpjData['asuransi_luas_bangunan']))
<tr>
<td width="25%">Luas Bangunan</td>
<td style="">
{{ $lpjData['asuransi_luas_bangunan'] ?? '' }}</td>
</tr>
<tr>
<td style="">Harga</td>
<td style="">Rp.
{{ $lpjData['asuransi_nilai_1'] ?? '' }}</td>
</tr>
<tr>
<td style="">Nilai Pasar Wajar (Rp)</td>
<td style="">Rp.
{{ $lpjData['asuransi_nilai_2'] ?? '' }}</td>
</tr>
@else
<tr>
<td>Tidak Ada</td>
</tr>
@endif
</table>
<hr /> <hr />
<table style="width: 100%; "> <table style="width: 100%; ">
<div style="margin-top: 20px;"> <div style="margin-top: 20px;">
@@ -637,7 +562,7 @@
</table> </table>
<div class="photo-container"> <div class="photo-container">
@php @php
$fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat']; $fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat','foto_sentuh_tanahku'];
// Memindahkan foto_tempat ke depan jika ada // Memindahkan foto_tempat ke depan jika ada
if (($key = array_search('foto_tempat', $fotoTypes)) !== false) { if (($key = array_search('foto_tempat', $fotoTypes)) !== false) {
unset($fotoTypes[$key]); unset($fotoTypes[$key]);
@@ -645,7 +570,8 @@
} }
// Filter fotoTypes untuk memastikan hanya yang memiliki imagePath valid // Filter fotoTypes untuk memastikan hanya yang memiliki imagePath valid
$validPhotoTypes = array_filter($fotoTypes, function ($type) use ($forminspeksi) { $validPhotoTypes = array_filter($fotoTypes, function ($type) use ($forminspeksi) {
return isset($forminspeksi[$type]) && file_exists(storage_path('app/public/' . $forminspeksi[$type])); return isset($forminspeksi[$type]) &&
file_exists(storage_path('app/public/' . $forminspeksi[$type]));
}); });
@endphp @endphp
@@ -656,7 +582,8 @@
$type = reset($validPhotoTypes); // Ambil elemen pertama $type = reset($validPhotoTypes); // Ambil elemen pertama
$imagePath = $forminspeksi[$type] ?? null; $imagePath = $forminspeksi[$type] ?? null;
@endphp @endphp
<td style="width: 100%; vertical-align: top; text-align: center" colspan="2" class="photo-item border"> <td style="width: 100%; vertical-align: top; text-align: center" colspan="2"
class="photo-item border">
<p style="margin: 0; font-size: 10px; text-align: center;"> <p style="margin: 0; font-size: 10px; text-align: center;">
{{ Str::title(str_replace('_', ' ', $type)) }} {{ Str::title(str_replace('_', ' ', $type)) }}
</p> </p>
@@ -676,8 +603,9 @@
{{ Str::title(str_replace('_', ' ', $type)) }} {{ Str::title(str_replace('_', ' ', $type)) }}
</p> </p>
@if ($imagePath && file_exists(storage_path('app/public/' . $imagePath))) @if ($imagePath && file_exists(storage_path('app/public/' . $imagePath)))
<img src="{{ storage_path('app/public/' . $imagePath) }}" alt="{{ $imagePath }}" <img src="{{ storage_path('app/public/' . $imagePath) }}"
class="photo-image" style="width: 100%; max-width: 300px;"> alt="{{ $imagePath }}" class="photo-image"
style="width: 100%; max-width: 300px;">
@endif @endif
</td> </td>
@endisset @endisset

View File

@@ -0,0 +1,64 @@
<table style="width: 100%; ">
<tr>
<td style="width:25%; vertical-align: top;">Informasi data pembanding</td>
<td style="width:1%; vertical-align: top;">:</td>
<td style="vertical-align: top;">
@php
$exportData = [];
if (isset($dataPembanding['data_pembanding'])) {
foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) {
$exportData['pembanding' . ($index + 1)] = $pembanding;
}
}
$fields = [
'jenis_aset' => 'Jenis properti',
'hak_properti' => 'Status Hak Tanah',
'address' => 'Alamat Lokasi',
'harga' => 'Harga Penawaran',
'harga_diskon' => 'Indikasi Harga Transaksi',
'telepon' => 'Penjual (HP)',
'penawaran' => 'Ditawarkan Sejak',
'luas_tanah' => 'Luas Tanah',
'luas_bangunan' => 'Luas Bangunan',
'kordinat' => 'Titik Kordinat',
];
@endphp
@foreach ($exportData as $index => $data)
<table style="width: 100%; margin-bottom: 15px; border-bottom: 1px solid #ddd;">
<tr>
<td style="font-weight: bold; padding-bottom: 8px;">
Pembanding {{ substr($index, -1) }}
</td>
</tr>
@foreach ($fields as $key => $label)
<tr>
<td style="width: 33%;">{{ $label }}</td>
<td style="width: 5%;">:</td>
<td style="width: 62%;">
@if ($key == 'luas_tanah' || $key == 'luas_bangunan')
{{ $data[$key] ?? '-' }}
@elseif($key == 'harga' || $key == 'harga_diskon')
{{ formatRupiah($data[$key]) ?? 0 }}
@elseif($key == 'kordinat')
@php
$lat = $data['kordinat_lat'] ?? null;
$lng = $data['kordinat_lng'] ?? null;
@endphp
@if ($lat && $lng)
{{ $lat }},{{ $lng }}
@else
-
@endif
@else
{{ $data[$key] ?? '-' }}
@endif
</td>
</tr>
@endforeach
</table>
@endforeach
</td>
</tr>
</table>

View File

@@ -178,8 +178,8 @@
</td> </td>
</tr> </tr>
<tr> <tr>
@isset($resumeData['fakta']['fakta_positif']) @isset($forminspeksi['fakta']['fakta_positif'])
@foreach ($resumeData['fakta']['fakta_positif'] as $key => $item) @foreach ($forminspeksi['fakta']['fakta_positif'] as $key => $item)
<tr> <tr>
<td>{!! nl2br(e($item)) !!}</td> <td>{!! nl2br(e($item)) !!}</td>
</tr> </tr>
@@ -195,8 +195,8 @@
</td> </td>
</tr> </tr>
<tr> <tr>
@isset($resumeData['fakta']['fakta_negatif']) @isset($forminspeksi['fakta']['fakta_negatif'])
@foreach ($resumeData['fakta']['fakta_negatif'] as $key => $item) @foreach ($forminspeksi['fakta']['fakta_negatif'] as $key => $item)
<tr> <tr>
<td>{!! nl2br(e($item)) !!}</td> <td>{!! nl2br(e($item)) !!}</td>
</tr> </tr>
@@ -231,7 +231,7 @@
<td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Tanah</td> <td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Tanah</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Bangunan</td> <td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Bangunan</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Pasar Wajar</td> <td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Pasar Wajar</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Likuidasi {{ isset($item['likuidasi']) ? '('. $item['likuidasi'] . ' %)' : '-' }}</td>
</tr> </tr>
<tr> <tr>
<td style="border: 1px solid #000; padding: 4px; text-align: center">{{ $item['sertifikat'] ?? '' }} <td style="border: 1px solid #000; padding: 4px; text-align: center">{{ $item['sertifikat'] ?? '' }}
@@ -242,54 +242,19 @@
{{ isset($item['luas_bangunan']) ? $item['luas_bangunan'] . ' m²' : '-' }}</td> {{ isset($item['luas_bangunan']) ? $item['luas_bangunan'] . ' m²' : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center"> <td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['nilai']) ? formatRupiah($item['nilai']) : '-' }}</td> {{ isset($item['nilai']) ? formatRupiah($item['nilai']) : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['total_likuidasi']) ? formatRupiah($item['total_likuidasi']) : '-' }}</td>
</tr> </tr>
@endforeach @endforeach
</table> </table>
@if (!empty($resumeData['sesuai_imb']))
<table style="margin: 5px 0; border-collapse: collapse; width: 100%;">
<tr>
<td style="">
<h6 style="text-transform: uppercase; margin: 0; ">2. Sesuai IMB</h6>
</td>
</tr>
</table>
<table border="1" style="width: 100%; border-collapse: collapse; margin-bottom: 10px;">
@foreach ($resumeData['sesuai_imb'] as $item)
<tr>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Sertifikat</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Tanah</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Bangunan</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Pasar Wajar</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Likuidasi {{ isset($item['likuidasi']) ? '('. $item['likuidasi'] . ' %)' : '-' }}</td>
</tr>
<tr>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ $item['sertifikat'] ?? '' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['luas_tanah']) ? $item['luas_tanah'] . ' m²' : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['luas_bangunan']) ? $item['luas_bangunan'] . ' m²' : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['nilai']) ? formatRupiah($item['nilai']) : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['total_likuidasi']) ? formatRupiah($item['total_likuidasi']) : '-' }}</td>
</tr>
@endforeach
</table>
@endif
@if (!empty($resumeData['tambahan'])) @if (!empty($resumeData['tambahan']))
@foreach ($resumeData['tambahan'] as $index => $item) @foreach ($resumeData['tambahan'] as $index => $item)
<table style="margin: 5px 0; border-collapse: collapse; width: 100%;"> <table style="margin: 5px 0; border-collapse: collapse; width: 100%;">
<tr> <tr>
<td style=""> <td style="">
<h6 style="text-transform: uppercase; margin: 0; "> <h6 style="text-transform: uppercase; margin: 0; ">
{{ $index + 3 }}. {{ $item['tambahan_nama_kesimpulan'] ?? '-' }} {{ $index + 2 }}. {{ $item['tambahan_nama_kesimpulan'] ?? '-' }}
</h6> </h6>
</td> </td>
</tr> </tr>
@@ -301,7 +266,7 @@
<td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Tanah</td> <td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Tanah</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Bangunan</td> <td style="border: 1px solid #000; padding: 4px; text-align: center">Luas Bangunan</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Pasar Wajar</td> <td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Pasar Wajar</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">Nilai Likuidasi {{ isset($item['likuidasi']) ? '('. $item['likuidasi'] . ' %)' : '' }}</td>
</tr> </tr>
<tr> <tr>
<td style="border: 1px solid #000; padding: 4px; text-align: center"> <td style="border: 1px solid #000; padding: 4px; text-align: center">
@@ -312,8 +277,7 @@
{{ isset($item['luas_bangunan']) ? $item['luas_bangunan'] . ' m²' : '-' }}</td> {{ isset($item['luas_bangunan']) ? $item['luas_bangunan'] . ' m²' : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center"> <td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['nilai']) ? formatRupiah($item['nilai']) : '-' }}</td> {{ isset($item['nilai']) ? formatRupiah($item['nilai']) : '-' }}</td>
<td style="border: 1px solid #000; padding: 4px; text-align: center">
{{ isset($item['total_likuidasi']) ? formatRupiah($item['total_likuidasi']) : '-' }}</td>
</tr> </tr>
</table> </table>
@endforeach @endforeach
@@ -326,9 +290,14 @@
<h6 style="text-transform: uppercase; margin: 0; ">lain lain</h2> <h6 style="text-transform: uppercase; margin: 0; ">lain lain</h2>
</td> </td>
</tr> </tr>
@isset($forminspeksi['fakta']['keterangan'])
@foreach ($forminspeksi['fakta']['keterangan'] as $key => $item)
<tr> <tr>
<td>{!! nl2br(e($resumeData['keterangan'] ?? '')) !!}</td> <td>{!! nl2br(e($item)) !!}</td>
</tr> </tr>
@endforeach
@endisset
</table> </table>
<table style="width: 100%"> <table style="width: 100%">
@@ -363,101 +332,8 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Demikian Kami Sampaikan, atas perhatiannya kami ucapkan terimakasih</td> <td>Resume ini sudah di setujui</td>
</tr> </tr>
<table style="width: 100%;">
<tr>
<td>
<table style="width: 100%; border-collapse: collapse; text-align: center;">
@php
use Modules\Usermanagement\Models\User;
$penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first();
$imagePathPenilai = storage_path(
'app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign,
);
$soUser = User::where('id', $senior_officer->id)->first();
$imagePathSo = storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign);
$imagePathEO = storage_path(
'app/public/signatures/' .
User::role('EO Appraisal')->first()->id .
'/' .
User::role('EO Appraisal')->first()->sign,
);
$imagePathDD = storage_path(
'app/public/signatures/' .
User::role('DD Appraisal')->first()->id .
'/' .
User::role('DD Appraisal')->first()->sign,
);
@endphp
<tr>
<td style=" padding: 4px;height: 50px">
@if (file_exists($imagePathPenilai))
<img src="{{ $imagePathPenilai }}" alt="{{ $imagePathPenilai }}" width="80px">
@endif
</td>
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;height: 50px">
@if (file_exists($imagePathSo))
<img src="{{ $imagePathSo }}" alt="{{ $imagePathSo }}" width="80px">
@endif
</td>
@endif
@if ($permohonan->approval_eo != null)
<td style=" padding: 4px;height: 50px">
@if (file_exists($imagePathEO))
<img src="{{ $imagePathEO }}" alt="{{ $imagePathEO }}" width="80px">
@endif
</td>
@endif
@if ($permohonan->approval_dd != null)
<td style=" padding: 4px;height: 50px">
@if (file_exists($imagePathDD))
<img src="{{ $imagePathDD }}" alt="{{ $imagePathDD }}" width="80px">
@endif
</td>
@endif
</tr>
<tr>
<td style=" padding: 4px;">{{ $penilai->userPenilaiTeam->name ?? '' }}</br>
<span>
{{ ucwords(strtolower('PENILAI')) }}
</span>
</td>
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;">
{{ $senior_officer->name ?? '' }}</br>
<span>
{{ ucwords(strtolower('SENIOR OFFICER')) }}
</span>
</td>
@endif
@if ($permohonan->approval_eo != null)
<td style=" padding: 4px;">
{{ User::role('EO Appraisal')->first()->name ?? '' }}</br>
<span>
{{ ucwords(strtolower('EXECUTIVE OFFICER')) }}
</span>
</td>
@endif
@if ($permohonan->approval_dd != null)
<td style=" padding: 4px;">
{{ User::role('DD Appraisal')->first()->name ?? '' }}</br>
<span>
{{ ucwords(strtolower('DEPUTY DIRECTOR')) }}
</span>
</td>
@endif
</tr>
</table>
</td>
</tr>
</table>
</table> </table>
<div class="page-break"></div> <div class="page-break"></div>

View File

@@ -65,6 +65,7 @@
</div> </div>
</div> </div>
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px"> <div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
<button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()"> <button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()">
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>
<span id="saveButtonText">Save</span> <span id="saveButtonText">Save</span>
@@ -73,6 +74,7 @@
</div> </div>
</button> </button>
@endif
@if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator']))
<a class="btn btn-info" <a class="btn btn-info"
href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1"> href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1">

View File

@@ -21,9 +21,30 @@
} }
</style> </style>
@include('lpj::assetsku.includenya') @include('lpj::assetsku.includenya')
@php
$paparan = $permohonan->status === 'proses-paparan' ? 'Paparan' : 'Pelaporan';
@endphp
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto "> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto ">
<form id="formResume" method="POST" class="w-full grid gap-5"> <form id="formResume" method="POST" class="w-full grid gap-5">
@csrf @csrf
@foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan)
@php
$formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true);
$jenisAset = $dokumen->jenisJaminan->name;
@endphp
@if (isset($formKategori) && $formKategori)
@php
$kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori];
$kategoriUnik = array_unique($kategoriArray);
@endphp
<input type="hidden" name="action" value="{{ implode(',', $kategoriUnik) }}">
<input type="hidden" name="type" value="{{ implode(',', $kategoriUnik) }}">
@endif
@endif
@endforeach
<div class="card"> <div class="card">
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
<h3 class="card-title uppercase"> <h3 class="card-title uppercase">
@@ -36,7 +57,7 @@
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Route::currentRouteName('otorisator.show')) Route::currentRouteName('otorisator.show'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => 'Pelaporan']) }}" <a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => $paparan]) }}"
class="btn btn-xs btn-info"> class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@@ -119,10 +140,10 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Faktor Positif</label> <label class="form-label max-w-56">Faktor Positif</label>
<div id="fakta-positif-container" class="flex flex-wrap items-baseline w-full"> <div id="fakta-positif-container" class="flex flex-wrap items-baseline w-full">
@if (!empty($resumeData['fakta']['fakta_positif'])) @if (!empty($forminspeksi['fakta']['fakta_positif']))
@foreach ($resumeData['fakta']['fakta_positif'] as $index => $positif) @foreach ($forminspeksi['fakta']['fakta_positif'] as $index => $positif)
<div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_positif[]" rows="3">{{ old("fakta_positif.$index", $positif) }}</textarea> <textarea class="textarea mt-2" name="fakta_positif[]" rows="10">{{ old("fakta_positif.$index", $positif) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" <button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;"> style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
@@ -131,7 +152,7 @@
@endforeach @endforeach
@else @else
<div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_positif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_positif[]" rows="3">{{ old('fakta_positif.0', '') }}</textarea> <textarea class="textarea mt-2" name="fakta_positif[]" rows="10">{{ old('fakta_positif.0', '') }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" style="display: none;"> <button class="btn btn-danger btn-sm remove-btn" type="button" style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
</button> </button>
@@ -147,10 +168,10 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Faktor Negatif</label> <label class="form-label max-w-56">Faktor Negatif</label>
<div id="fakta-negatif-container" class="flex flex-wrap items-baseline w-full"> <div id="fakta-negatif-container" class="flex flex-wrap items-baseline w-full">
@if (!empty($resumeData['fakta']['fakta_negatif'])) @if (!empty($forminspeksi['fakta']['fakta_negatif']))
@foreach ($resumeData['fakta']['fakta_negatif'] as $index => $negatif) @foreach ($forminspeksi['fakta']['fakta_negatif'] as $index => $negatif)
<div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_negatif[]" rows="3">{{ old("fakta_negatif.$index", $negatif) }}</textarea> <textarea class="textarea mt-2" name="fakta_negatif[]" rows="10">{{ old("fakta_negatif.$index", $negatif) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" <button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;"> style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
@@ -159,7 +180,7 @@
@endforeach @endforeach
@else @else
<div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full"> <div class="fakta_negatif flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="fakta_negatif[]" rows="3">{{ old('fakta_negatif.0', $resumeData['fakta']['fakta_negatif'][0] ?? '') }}</textarea> <textarea class="textarea mt-2" name="fakta_negatif[]" rows="10">{{ old('fakta_negatif.0', $forminspeksi['fakta']['fakta_negatif'][0] ?? '') }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" style="display: none;"> <button class="btn btn-danger btn-sm remove-btn" type="button" style="display: none;">
<i class="ki-outline ki-trash"></i> <i class="ki-outline ki-trash"></i>
</button> </button>
@@ -194,8 +215,7 @@
<th class="text-center">Luas Tanah</th> <th class="text-center">Luas Tanah</th>
<th class="text-center">Luas Bangunan</th> <th class="text-center">Luas Bangunan</th>
<th class="text-center">Nilai Pasar Wajar</th> <th class="text-center">Nilai Pasar Wajar</th>
<th class="text-center">Nilai Likuidasi(%)</th>
<th class="text-center">Total Nilai Likuidasi</th>
</tr> </tr>
</thead> </thead>
</thead> </thead>
@@ -217,18 +237,9 @@
<td class="text-center"> <td class="text-center">
<input type="text" name="fisik_nilai[]" <input type="text" name="fisik_nilai[]"
class="input currency-format nilai-pasar" class="input currency-format nilai-pasar"
value="{{ $item['nilai'] }}" onkeyup="calculateTotal(this)"> value="{{ $item['nilai'] }}">
</td>
<td class="text-center">
<input type="text" name="likuidasi[]" class="input likuidasi"
value="{{ $item['likuidasi'] ?? 0 }}"
onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="total_nilai_likuidasi[]"
class="input currency-format total-likuidasi"
value="{{ $item['total_likuidasi'] ?? 0 }}" readonly>
</td> </td>
</tr> </tr>
@endforeach @endforeach
@else @else
@@ -276,101 +287,9 @@
class="input number-format" value="{{ $luas_bangunan }}"></td> class="input number-format" value="{{ $luas_bangunan }}"></td>
<td class="text-center"> <td class="text-center">
<input type="text" name="fisik_nilai[]" <input type="text" name="fisik_nilai[]"
class="input currency-format nilai-pasar" class="input currency-format nilai-pasar">
onkeyup="calculateTotal(this)">
</td> </td>
<td class="text-center">
<input type="text" name="likuidasi[]" class="input likuidasi"
onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="total_nilai_likuidasi[]"
class="input currency-format total-likuidasi" readonly>
</td>
</tr>
@endif
</tbody>
</table>
</div>
</div>
<div class="gird gap-5">
<label class="form-label max-w-56">SESUAI IMB</label>
<div class="flex flex-wrap items-baseline w-full">
<table
class="table table-auto table-border align-middle text-gray-700 font-medium text-sm mt-5">
<thead>
<tr>
<th class="text-center">Sertipikat</th>
<th class="text-center">Luas Tanah</th>
<th class="text-center">Luas Bangunan</th>
<th class="text-center">Nilai Pasar Wajar</th>
<th class="text-center">Nilai Likuidasi (%)</th>
<th class="text-center">Total Nilai Likuidasi</th>
</tr>
</thead>
</thead>
<tbody>
@if (!empty($resumeData['fisik']))
@foreach ($resumeData['fisik'] as $item)
<tr>
<td class="text-center">
<input type="text" name="sesuai_sertifikat[]"
class="input number-format" value="{{ $item['sertifikat'] }}">
</td>
<td class="text-center">
<input type="text" name="sesuai_luas_tanah[]"
class="input number-format" value="{{ $item['luas_tanah'] }}">
</td>
<td class="text-center">
<input type="text" name="sesuai_luas_bangunan[]"
class="input number-format" value="{{ $item['luas_bangunan'] }}">
</td>
<td class="text-center">
<input type="text" name="sesuai_nilai[]"
class="input currency-format nilai-pasar"
value="{{ $item['nilai'] }}" onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="sesuai_likuidasi[]"
class="input likuidasi" value="{{ $item['likuidasi'] ?? '' }}"
onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="sesuai_total_likuidasi[]"
class="input currency-format total-likuidasi"
value="{{ $item['total_likuidasi'] ?? 0 }}">
</td>
</tr>
@endforeach
@else
<tr>
<td class="text-center">
<input type="text" name="sesuai_sertifikat[]"
class="input number-format">
</td>
<td class="text-center">
<input type="text" name="sesuai_luas_tanah[]"
class="input number-format">
</td>
<td class="text-center">
<input type="text" name="sesuai_luas_bangunan[]"
class="input number-format">
</td>
<td class="text-center">
<input type="text" name="sesuai_nilai[]" class="input currency-format"
onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="sesuai_likuidasi[]" class="input likuidasi"
value="{{ $item['likuidasi'] ?? 0 }}" onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="sesuai_total_likuidasi[]"
class="input currency-format total-likudasi"
value="{{ $item['total_likuidasi'] ?? 0 }}">
</td>
</tr> </tr>
@endif @endif
</tbody> </tbody>
@@ -398,8 +317,7 @@
<th class="text-center">Luas Tanah</th> <th class="text-center">Luas Tanah</th>
<th class="text-center">Luas Bangunan</th> <th class="text-center">Luas Bangunan</th>
<th class="text-center">Nilai Pasar Wajar</th> <th class="text-center">Nilai Pasar Wajar</th>
<th class="text-center">Nilai Likuidasi (%)</th>
<th class="text-center">Total Nilai Likuidasi</th>
</tr> </tr>
</thead> </thead>
</thead> </thead>
@@ -421,18 +339,9 @@
<td class="text-center"> <td class="text-center">
<input type="text" name="tambahan_nilai[]" <input type="text" name="tambahan_nilai[]"
class="input currency-format nilai-pasar" class="input currency-format nilai-pasar"
value="{{ $item['nilai'] }}" onkeyup="calculateTotal(this)"> value="{{ $item['nilai'] }}">
</td>
<td class="text-center">
<input type="text" name="tambahan_nilai_likuidasi[]"
class="input likuidasi " value="{{ $item['likuidasi'] ?? 0 }}"
onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="tambahan_total_likuidasi[]"
class="input currency-format total-likuidasi"
value="{{ $item['total_likuidasi'] ?? 0 }}">
</td> </td>
</tr> </tr>
</tbody> </tbody>
@@ -441,8 +350,8 @@
</div> </div>
@endforeach @endforeach
@endif @endif
<div id="kesimpulans" class="grid gap-5 w-full"></div> <div id="kesimpulan" class="grid gap-5 w-full"></div>
<div> <div class="">
<button type="button" class="btn btn-primary btn-sm mt-5" onclick="tambahKesimpulanNilai()"> <button type="button" class="btn btn-primary btn-sm mt-5" onclick="tambahKesimpulanNilai()">
<i class="ki-outline ki-plus"></i> <i class="ki-outline ki-plus"></i>
Kesimpulan Nilai Kesimpulan Nilai
@@ -450,13 +359,37 @@
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 " style="margin-top: 20px "> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 " style="margin-top: 20px ">
<label class="form-label lg:form-label max-w-56 ">Catatan yang Perlu Diperhatikan <label class="form-label lg:form-label max-w-56 ">Catatan yang Perlu Diperhatikan
</label> </label>
<div class="input-group w-full flex gap-2"> <div class="w-full">
<textarea name="keterangan" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="3">{{ old('keterangan', $resumeData['keterangan'] ?? '') }}</textarea> <div id="keterangan-container" class="flex items-baseline flex-wrap gap-2.5 w-full">
@if (!empty($forminspeksi['fakta']['keterangan']) && is_array($forminspeksi['fakta']['keterangan']))
@foreach ($forminspeksi['fakta']['keterangan'] as $index => $item)
<div class="keterangan flex items-center gap-2 mt-2 textarea-group w-full">
<textarea name="keterangan[]" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="10">{{ old("keterangan.$index", $item) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;">
<i class="ki-outline ki-trash"></i>
</button>
</div>
@endforeach
@else
<div class="keterangan flex items-center gap-2 mt-2 textarea-group w-full">
<textarea name="keterangan[]" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="10"></textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button"
style="display: none;">
<i class="ki-outline ki-trash"></i>
</button>
<em id="error-keterangan" class="alert text-danger text-sm"></em>
</div>
@endif
</div>
<button type="button" onclick="addClonableItem('keterangan-container', 'keterangan')"
class="btn btn-primary btn-sm mt-5 ">
<i class="ki-outline ki-plus"></i>
</button>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
@@ -482,16 +415,20 @@
YANG BERLAKU, APABILA LEWAT MAKA HARUS DILAKUKAN ORDER ULANG SESUAI PROSEDUR YANG YANG BERLAKU, APABILA LEWAT MAKA HARUS DILAKUKAN ORDER ULANG SESUAI PROSEDUR YANG
BERLAKU BERLAKU
</li> </li>
<li>Apabila sudah melewati 6 bulan, maka harus penilaian ulang kembali <li class="uppercase">Apabila sudah melewati 6 bulan, maka harus penilaian ulang kembali
</li> </li>
</ol> </ol>
</div> </div>
</div> </div>
<div class="flex card-footer justify-end gap-5"> <div class="flex card-footer justify-end gap-5">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
<button type="button" class="btn btn-primary" onclick="saveResume()"> <button type="button" class="btn btn-primary" onclick="saveResume()">
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>
Save</button> Save</button>
@endif
@if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator']))
<a class="btn btn-info" <a class="btn btn-info"
href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1"> href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&inspeksiId={{ request('inspeksiId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1">
@@ -519,7 +456,7 @@
let counter = 3; let counter = 3;
function tambahKesimpulanNilai() { function tambahKesimpulanNilai() {
const kesimpulan = document.getElementById('kesimpulans'); const kesimpulan = document.getElementById('kesimpulan');
kesimpulan.innerHTML += ` kesimpulan.innerHTML += `
<div class="grid gap-5 w-full mt-5" id="kesimpulan-${counter}"> <div class="grid gap-5 w-full mt-5" id="kesimpulan-${counter}">
@@ -541,8 +478,7 @@
<th class="text-center">Luas Tanah</th> <th class="text-center">Luas Tanah</th>
<th class="text-center">Luas Bangunan</th> <th class="text-center">Luas Bangunan</th>
<th class="text-center">Nilai Pasar Wajar</th> <th class="text-center">Nilai Pasar Wajar</th>
<th class="text-center">Nilai Likuidasi (%)</th>
<th class="text-center">Total Nilai Likuidasi</th>
<th class="text-center">Aksi</th> <th class="text-center">Aksi</th>
</tr> </tr>
</thead> </thead>
@@ -564,15 +500,8 @@
<input type="text" name="tambahan_nilai[]" <input type="text" name="tambahan_nilai[]"
class="input currency-format nilai-pasar"> class="input currency-format nilai-pasar">
</td> </td>
<td class="text-center">
<input type="text" name="tambahan_nilai_likuidasi[]"
class="input likuidasi"
onkeyup="calculateTotal(this)">
</td>
<td class="text-center">
<input type="text" name="tambahan_total_likuidasi[]"
class="input currency-format total-likuidasi" >
</td>
<td class="text-center"> <td class="text-center">
<button type="button" class="btn btn-danger" onclick="deleteRow(this)">Delete</button> <button type="button" class="btn btn-danger" onclick="deleteRow(this)">Delete</button>
</td> </td>
@@ -617,12 +546,29 @@
const formElement = document.querySelector('form'); const formElement = document.querySelector('form');
const jsonData = formToJson(formElement); const jsonData = formToJson(formElement);
console.log('Data dalam format JSON:', JSON.stringify(formElement, null, 2)); console.log('Data dalam format JSON:', JSON.stringify(jsonData, null, 2));
const urlParams = new URLSearchParams(window.location.search); // Mengambil query parameters dari URL const urlParams = new URLSearchParams(window.location.search); // Mengambil query parameters dari URL
const permohonanId = urlParams.get('permohonanId'); const permohonanId = urlParams.get('permohonanId');
const documentId = urlParams.get('documentId'); const documentId = urlParams.get('documentId');
const inspeksiId = urlParams.get('inspeksiId'); const inspeksiId = urlParams.get('inspeksiId');
const faktaPositif = Array.from(document.querySelectorAll('[name="fakta_positif[]"]'))
.map(textarea => textarea.value.trim())
.filter(value => value !== '');
const faktaNegatif = Array.from(document.querySelectorAll('[name="fakta_negatif[]"]'))
.map(textarea => textarea.value.trim())
.filter(value => value !== '');
const keterangan = Array.from(document.querySelectorAll('[name="keterangan[]"]'))
.map(textarea => textarea.value.trim())
.filter(value => value !== '');
const action = Array.from(document.querySelectorAll('input[name="action"]'))
.map(input => input.value)
.join(',') || "";
const type = Array.from(document.querySelectorAll('input[name="type"]'))
.map(input => input.value)
.join(',') || "";
const requestUrl = const requestUrl =
`{{ route('penilai.storeResume') }}`; `{{ route('penilai.storeResume') }}`;
@@ -633,9 +579,15 @@
type: 'POST', type: 'POST',
data: JSON.stringify({ data: JSON.stringify({
permohonan_id: permohonanId, permohonan_id: permohonanId,
document_id: documentId, dokument_id: documentId,
inspeksi_id: inspeksiId, inspeksi_id: inspeksiId,
resume: jsonData, resume: jsonData,
fakta_positif: faktaPositif,
fakta_negatif: faktaNegatif,
action: action,
type: type,
keterangan: keterangan
}), }),
contentType: 'application/json', contentType: 'application/json',
@@ -687,58 +639,25 @@
const formData = new FormData(formElement); const formData = new FormData(formElement);
const jsonData = { const jsonData = {
tanggal_resume: "", tanggal_resume: "",
fakta: {
fakta_positif: [],
fakta_negatif: []
},
fisik: [], fisik: [],
sesuai_imb: [], tambahan: []
tambahan: [],
keterangan: ""
}; };
// Ambil fakta positif
document.querySelectorAll('textarea[name="fakta_positif[]"]').forEach(textarea => {
jsonData.fakta.fakta_positif.push(textarea.value);
});
// Ambil fakta negatif
document.querySelectorAll('textarea[name="fakta_negatif[]"]').forEach(textarea => {
jsonData.fakta.fakta_negatif.push(textarea.value);
});
// Ambil data fisik // Ambil data fisik
document.querySelectorAll('table tbody tr').forEach(row => { document.querySelectorAll('table tbody tr').forEach(row => {
const fisikData = { const fisikData = {
sertifikat: row.querySelector('input[name="fisik_sertifikat[]"]')?.value || "", sertifikat: row.querySelector('input[name="fisik_sertifikat[]"]')?.value || "",
luas_tanah: row.querySelector('input[name="fisik_luas_tanah[]"]')?.value || "", luas_tanah: row.querySelector('input[name="fisik_luas_tanah[]"]')?.value || "",
luas_bangunan: row.querySelector('input[name="fisik_luas_bangunan[]"]')?.value || "", luas_bangunan: row.querySelector('input[name="fisik_luas_bangunan[]"]')?.value || "",
nilai: cleanCurrencyValue(row.querySelector('input[name="fisik_nilai[]"]')?.value || ""), nilai: cleanCurrencyValue(row.querySelector('input[name="fisik_nilai[]"]')?.value || "")
likuidasi: row.querySelector('input[name="likuidasi[]"]')?.value || "",
total_likuidasi: cleanCurrencyValue(row.querySelector(
'input[name="total_nilai_likuidasi[]"]')?.value || "")
}; };
if (fisikData.sertifikat) { if (fisikData.sertifikat) {
jsonData.fisik.push(fisikData); jsonData.fisik.push(fisikData);
} }
}); });
// Ambil data sesuai IMB
document.querySelectorAll('table tbody tr').forEach(row => {
const imbData = {
sertifikat: row.querySelector('input[name="sesuai_sertifikat[]"]')?.value || "",
luas_tanah: row.querySelector('input[name="sesuai_luas_tanah[]"]')?.value || "",
luas_bangunan: row.querySelector('input[name="sesuai_luas_bangunan[]"]')?.value || "",
nilai: cleanCurrencyValue(row.querySelector('input[name="sesuai_nilai[]"]')?.value || ""),
likuidasi: row.querySelector('input[name="sesuai_likuidasi[]"]')?.value || "",
total_likuidasi: cleanCurrencyValue(row.querySelector(
'input[name="sesuai_total_likuidasi[]"]')?.value || "")
};
if (imbData.sertifikat) {
jsonData.sesuai_imb.push(imbData);
}
});
document.querySelectorAll('#kesimpulan > div').forEach(row => { document.querySelectorAll('#kesimpulan > div').forEach(row => {
const imbData = { const imbData = {
@@ -747,10 +666,7 @@
sertifikat: row.querySelector('input[name="tambahan_sertifikat[]"]')?.value || "", sertifikat: row.querySelector('input[name="tambahan_sertifikat[]"]')?.value || "",
luas_tanah: row.querySelector('input[name="tambahan_luas_tanah[]"]')?.value || "", luas_tanah: row.querySelector('input[name="tambahan_luas_tanah[]"]')?.value || "",
luas_bangunan: row.querySelector('input[name="tambahan_luas_bangunan[]"]')?.value || "", luas_bangunan: row.querySelector('input[name="tambahan_luas_bangunan[]"]')?.value || "",
nilai: cleanCurrencyValue(row.querySelector('input[name="tambahan_nilai[]"]')?.value || ""), nilai: cleanCurrencyValue(row.querySelector('input[name="tambahan_nilai[]"]')?.value || "")
likuidasi: row.querySelector('input[name="tambahan_nilai_likuidasi[]"]')?.value || "",
total_likuidasi: cleanCurrencyValue(row.querySelector(
'input[name="tambahan_total_likuidasi[]"]')?.value || "")
}; };
console.log(imbData); console.log(imbData);
if (imbData.sertifikat) { if (imbData.sertifikat) {
@@ -758,10 +674,6 @@
} }
}); });
// Ambil keterangan
const keterangan = formElement.querySelector('textarea[name="keterangan"]')?.value || "";
jsonData.keterangan = keterangan;
const tanggal_resume = formElement.querySelector('input[name="tanggal_resume"]')?.value || ""; const tanggal_resume = formElement.querySelector('input[name="tanggal_resume"]')?.value || "";
jsonData.tanggal_resume = tanggal_resume; jsonData.tanggal_resume = tanggal_resume;
@@ -781,40 +693,4 @@
} }
}); });
}); });
function calculateTotal(element) {
const row = element.closest('tr');
const nilaiPasarInput = row.querySelector('.nilai-pasar');
let likuidasiInput = row.querySelector('.likuidasi');
const totalLikuidasiInput = row.querySelector('.total-likuidasi');
const cleanNilaiPasar = cleanCurrencyValue(nilaiPasarInput.value);
let cleanLikuidasi = cleanCurrencyValue(likuidasiInput.value);
// Batasi likuidasi maksimal hingga 100
cleanLikuidasi = Math.min(parseFloat(cleanLikuidasi) || 0, 100);
// Format nilai likuidasi dengan simbol %
likuidasiInput.value = cleanLikuidasi;
// Konversi ke angka untuk perhitungan
const nilaiPasar = parseFloat(cleanNilaiPasar) || 0;
const likuidasi = cleanLikuidasi / 100; // Konversi persentase ke desimal
// Hitung total likuidasi
const totalLikuidasi = nilaiPasar * likuidasi;
// Tampilkan hasil dengan format yang benar
totalLikuidasiInput.value = formatCurrency(totalLikuidasi.toString());
}
</script> </script>

View File

@@ -191,7 +191,7 @@
actions: { actions: {
title: 'Action', title: 'Action',
render: (item, data) => { render: (item, data) => {
if (data.status === 'survey-completed' || data.status === 'proses-laporan' || data.status === 'paparan' || data.status === 'proses-paparan' || data.status === 'paparan') { if (data.status === 'survey-completed' || data.status === 'proses-laporan' || data.status === 'paparan' || data.status === 'proses-paparan' || data.status === 'paparan' || data.status == 'revisi-laporan' || data.status === 'done') {
return ` return `
<div class="flex flex-nowrap justify-center gap-1.5"> <div class="flex flex-nowrap justify-center gap-1.5">
<a class="btn btn-sm btn-outline btn-info" href="penilai/${data.id}/show"> <a class="btn btn-sm btn-outline btn-info" href="penilai/${data.id}/show">

View File

@@ -38,14 +38,14 @@
<div class="card-body "> <div class="card-body ">
<div class="w-full grid gap-5 "> <div class="w-full grid gap-5 ">
<!-- Preview Container --> <!-- Preview Container -->
<div class="preview-container-{{ $index }}"> <div class="preview-container-{{ $index }}" class="flex items-center">
@if (isset($denah['foto_denah'])) @if (isset($denah['foto_denah']))
@php @php
$fileExtension = pathinfo($denah['foto_denah'], PATHINFO_EXTENSION); $fileExtension = pathinfo($denah['foto_denah'], PATHINFO_EXTENSION);
@endphp @endphp
@if (in_array($fileExtension, ['jpg', 'jpeg', 'png'])) @if (in_array($fileExtension, ['jpg', 'jpeg', 'png']))
<img src="{{ asset('storage/' . $denah['foto_denah']) }}" style="max-width: 30rem;"> <img src="{{ asset('storage/' . $denah['foto_denah']) }}" class="max-w-full max-h-screen object-contain">
@elseif($fileExtension === 'pdf') @elseif($fileExtension === 'pdf')
<embed src="{{ asset('storage/' . $denah['foto_denah']) }}" type="application/pdf" <embed src="{{ asset('storage/' . $denah['foto_denah']) }}" type="application/pdf"
width="100%" height="500px"> width="100%" height="500px">
@@ -82,6 +82,7 @@
</div> </div>
@endif @endif
@if ($penilai && $penilai->kertas_kerja)
<div class="card"> <div class="card">
<div class="card-header bg-agi-50 uppercase"> <div class="card-header bg-agi-50 uppercase">
Kertas Kerja Kertas Kerja
@@ -108,5 +109,6 @@
@endif @endif
</div> </div>
</div> </div>
@endif
</div> </div>
@endsection @endsection

View File

@@ -10,7 +10,7 @@
<div class="card border border-agi-100 pb-2.5"> <div class="card border border-agi-100 pb-2.5">
<div class="card-header bg-agi-50" id="basic_settings"> <div class="card-header bg-agi-50" id="basic_settings">
<h3 class="card-title"> <h3 class="card-title">
Detail Penilai Detail Penilaian
</h3> </h3>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<a href="{{ route('penilai.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> <a href="{{ route('penilai.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i>
@@ -188,6 +188,21 @@
</p> </p>
</div> </div>
</div> </div>
@if ($permohonan->status == 'revisi-laporan')
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Catatan Revisi
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ $permohonan->keterangan ?? '' }}
</p>
</div>
</div>
@endif
</div> </div>
@php @php
$inspeksiId = null; $inspeksiId = null;
@@ -316,7 +331,6 @@
PRINT OUT PRINT OUT
</a> </a>
</div> </div>
</div> </div>
</div> </div>
@endforeach @endforeach
@@ -324,7 +338,14 @@
<a class="btn btn-success" onclick="savePenilai()"> <a class="btn btn-success" onclick="savePenilai()">
REPORT REPORT
</a> </a>
<a class="btn btn-warning" onclick="revisiSurveyor('{{ $permohonan->id }}', '{{$permohonan->debiture->name }}', '{{$permohonan->nomor_registrasi }}')">
REVISI
</a>
</div> </div>
</div> </div>
@@ -626,6 +647,55 @@
}); });
} }
function revisiSurveyor(dataId, debitur, noreg) {
Swal.fire({
title: 'Apakah Anda yakin?',
text: `Untuk melakukan Revisi nomor registrasi ${noreg} atas nama debiture ${debitur} !`,
icon: 'warning',
input: 'textarea',
inputLabel: 'Keterangan',
inputPlaceholder: 'Masukkan keterangan...',
inputAttributes: {
'aria-label': 'Masukkan keterangan'
},
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Ya, Lanjutkan!',
cancelButtonText: 'Batal',
}).then((result) => {
if (result.isConfirmed) {
const userMessage = result.value || '';
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
});
$.ajax({
url: `/penilai/revisi-surveyor/${dataId}`,
type: 'PUT',
data: {
message: userMessage
},
success: (response) => {
Swal.fire('Berhasil!', response.message , 'success').then(
() => {
window.location.href =
'{{ route('penilai.index') }}';
});
console.log(response);
},
error: (error) => {
console.error('Error:', error);
Swal.fire('Gagal!', 'Terjadi kesalahan saat melakukan Revisi.',
'error');
}
});
}
});
}
</script> </script>
@include('lpj::surveyor.js.utils') @include('lpj::surveyor.js.utils')

View File

@@ -6,8 +6,7 @@
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card border border-agi-100 pb-2.5"> <div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10"
<div class="min-w-full card-grid" data-datatable="false" data-datatable-page-size="10"
data-datatable-state-save="false" id="permohonan-table" data-datatable-state-save="false" id="permohonan-table"
data-api-url="{{ route('otorisator.datatables', ['otorisator' => $header]) }}"> data-api-url="{{ route('otorisator.datatables', ['otorisator' => $header]) }}">
<div class="flex-wrap py-5 card-header bg-agi-50"> <div class="flex-wrap py-5 card-header bg-agi-50">
@@ -20,6 +19,22 @@
<input placeholder="Search Penilaian" id="search" type="text" value=""> <input placeholder="Search Penilaian" id="search" type="text" value="">
</label> </label>
</div> </div>
@if ($header == 'Pelaporan')
<div class="flex">
<select class="select select-sm w-28" id="region">
<option value="">
Pilih Region
</option>
@foreach ($regions as $region)
<option value="{{ $region->name }}">
{{ $region->name }}
</option>
@endforeach
</select>
</div>
@endif
<div class="flex flex-wrap gap-2.5"> <div class="flex flex-wrap gap-2.5">
<div class="h-[24px] border border-r-gray-200"></div> <div class="h-[24px] border border-r-gray-200"></div>
<a class="btn btn-sm btn-light" href="{{ route('permohonan.export') }}"> Export to Excel </a> <a class="btn btn-sm btn-light" href="{{ route('permohonan.export') }}"> Export to Excel </a>
@@ -29,7 +44,7 @@
<div class="card-body"> <div class="card-body">
<div class="scrollable-x-auto"> <div class="scrollable-x-auto">
<table class="table text-sm font-medium text-gray-700 align-middle table-auto table-border" <table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm"
data-datatable-table="true"> data-datatable-table="true">
<thead> <thead>
<tr> <tr>
@@ -112,7 +127,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection
@@ -290,6 +304,12 @@
dataTable.search(searchValue, true); dataTable.search(searchValue, true);
}); });
const regionSelect = document.getElementById('region');
regionSelect.addEventListener('change', function() {
const selectedRegion = this.value;
dataTable.search(selectedRegion, true);
});
</script> </script>
<script> <script>
@@ -325,7 +345,9 @@
message: userMessage // Kirim pesan sebagai bagian dari data message: userMessage // Kirim pesan sebagai bagian dari data
}, },
success: (response) => { success: (response) => {
Swal.fire('Berhasil!', 'Data berhasil diotorisasi. Menunggu Approval EO dan atau DD', 'success').then(() => { Swal.fire('Berhasil!',
'Data berhasil diotorisasi. Menunggu Approval EO dan atau DD',
'success').then(() => {
window.location.reload(); window.location.reload();
}); });
console.log(response); console.log(response);

View File

@@ -134,14 +134,12 @@
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }} Otorisator {{ $header ?? '' }}
</button> </button>
<button class="btn btn-warning" onclick="revisiLaporan({{ $permohonan->id }})">
<i class="ki-filled ki-arrow-circle-right"></i> Revisi
</button>
@endif @endif
@if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) &&
$permohonan->approval_so && $permohonan->approval_so &&
$permohonan->approval_eo == null) $permohonan->approval_eo == null &&
in_array($permohonan->nilai_plafond_id, [1, 2]))
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary"> <button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }} Otorisator {{ $header ?? '' }}
@@ -157,24 +155,45 @@
Otorisator {{ $header ?? '' }} Otorisator {{ $header ?? '' }}
</button> </button>
@endif @endif
@elseif($dataHeader == 'paparan') @elseif($dataHeader == 'paparan')
@if ($permohonan->penilai->file_paparan) @if ($permohonan->penilai->file_paparan)
<span class="btn btn-success" <span class="btn btn-success btn-outline"
onclick="viewPDF('{{ Storage::url($permohonan->penilai->file_paparan) }}')"><i onclick="viewPDF('{{ Storage::url($permohonan->penilai->file_paparan) }}')"><i
class="ki-filled ki-eye mr-2"></i>Lihat Data Paparan</span> class="ki-filled ki-eye mr-2"></i>Lihat Data Paparan</span>
@endif @endif
@if ($permohonan->penilai->kertas_kerja)
<span class="btn btn-warning btn-outline"
onclick="viewPDF('{{ Storage::url($permohonan->penilai->kertas_kerja) }}')"><i
class="ki-filled ki-eye mr-2"></i>Lihat Kertas Kerja</span>
@endif
<a class="btn btn-success"
href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&inspeksiId={{ $inspeksiId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}">
Lihat resume
</a>
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $authorization->approve_so == null) @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $authorization->approve_so == null)
<button onclick="otorisatorData({{ $authorization->id }},'SO')" type="button" class="btn btn-primary"> <button onclick="otorisatorData({{ $authorization->id }},'SO')" type="button"
class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }} Otorisator {{ $header ?? '' }}
</button> </button>
@endif @endif
@if(Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && $authorization->approve_eo == null)
$authorization->approve_so && <button onclick="otorisatorData({{ $authorization->id }},'EO')" type="button"
$authorization->approve_dd == null) class="btn btn-primary">
<button onclick="otorisatorData({{ $authorization->id }},'DD')" type="button" class="btn btn-primary"> <i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }}
</button>
@endif
@if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && $authorization->approve_dd == null)
<button onclick="otorisatorData({{ $authorization->id }},'DD')" type="button"
class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }} Otorisator {{ $header ?? '' }}
</button> </button>
@@ -187,210 +206,143 @@
@push('scripts') @push('scripts')
<script> <script>
const handleRejection = (dataId) => {
Swal.fire({
title: 'Masukkan alasan penolakan:',
input: 'textarea',
inputPlaceholder: 'Tuliskan alasan...',
showCancelButton: true,
confirmButtonColor: '#f39c12',
cancelButtonColor: '#d33',
confirmButtonText: 'Kirim',
cancelButtonText: 'Batal',
preConfirm: (alasan) => {
if (!alasan) {
Swal.showValidationMessage('Alasan harus diisi!');
return false;
}
return alasan;
}
}).then((rejectResult) => {
if (rejectResult.isConfirmed) {
handleAjaxRequest(
`/otorisator/revisi/${dataId}`, {
message: rejectResult.value
},
'Data berhasil ditolak.',
'Terjadi kesalahan saat melakukan penolakan.'
);
}
});
};
const showSwalConfirmation = (
title, text, html, confirmText, denyText, cancelText, preConfirm, icon = 'question'
) => {
return Swal.fire({
title: title,
text: text,
html: html,
icon: icon,
focusConfirm: false,
preConfirm: preConfirm,
showCancelButton: true,
showDenyButton: !!denyText,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
denyButtonColor: '#f39c12',
confirmButtonText: confirmText,
denyButtonText: denyText,
cancelButtonText: cancelText,
});
};
const handleAjaxRequest = (url, data, successMessage, errorMessage) => {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
});
$.ajax({
url: url,
type: 'POST',
data: data,
success: () => {
Swal.fire('Berhasil!', successMessage, 'success').then(() => {
const dataHeader = @json($header);
const redirectUrl = `/otorisator/${dataHeader.toLowerCase()}`;
window.location.href = redirectUrl;
});
},
error: (error) => {
console.error('Error:', error);
Swal.fire('Gagal!', errorMessage, 'error');
}
});
};
function otorisatorData(dataId, role = '') { function otorisatorData(dataId, role = '') {
const dataHeader = @json($header); const dataHeader = @json($header);
if(dataHeader == 'Paparan'){ const isPaparanSO = dataHeader === 'Paparan' && role === 'SO';
if(role == 'SO'){
Swal.fire({ const swalHtml = isPaparanSO ? `
title: 'Apakah Anda yakin?', <div class="text-left space-y-4">
text: `Untuk melakukan otorisator ${dataHeader}!`, <p class="text-gray-700 text-center">Untuk melakukan otorisasi ${dataHeader}!</p>
icon: 'warning', <div>
html: ` <label for="swal-keterangan" class="block text-sm font-medium text-gray-700 mb-1">Keterangan</label>
<input id="swal-keterangan" class="swal2-input input" placeholder="Keterangan"> <input id="swal-keterangan" class="input" placeholder="Masukkan Keterangan">
<input id="swal-tanggal-paparan" class="swal2-input input" type="date" placeholder="Tanggal paparan"> </div>
`, <div>
focusConfirm: false, <label for="swal-tanggal-paparan" class="block text-sm font-medium text-gray-700 mb-1">Tanggal Paparan</label>
preConfirm: () => { <input id="swal-tanggal-paparan" class="input" type="date" placeholder="Tanggal paparan">
const keterangan = document.getElementById('swal-keterangan').value; </div>
</div>` : '';
showSwalConfirmation(
'Apakah Anda yakin?',
`Untuk melakukan otorisasi ${dataHeader}!`,
swalHtml,
'Ya, Lanjutkan!',
'Tolak',
'Batal',
() => {
if (isPaparanSO) {
const message = document.getElementById('swal-keterangan')?.value;
const tanggalPaparan = document.getElementById('swal-tanggal-paparan').value; const tanggalPaparan = document.getElementById('swal-tanggal-paparan').value;
if (!keterangan || !tanggalPaparan) { if (!message || !tanggalPaparan) {
Swal.showValidationMessage('Keterangan atau Tanggal Paparan Harus diisi!'); Swal.showValidationMessage('Keterangan dan Tanggal Paparan harus diisi!');
return false; return false;
} }
return { keterangan, tanggalPaparan }; return {
message,
tanggalPaparan
};
} else {
return {
message: 'Ya, lanjutkan.'
};
}
}, },
showCancelButton: true, 'question'
confirmButtonColor: '#3085d6', ).then((result) => {
cancelButtonColor: '#d33',
confirmButtonText: 'Ya, Lanjutkan!',
cancelButtonText: 'Batal',
}).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
const keterangan = result.value.keterangan || ''; const requestData = isPaparanSO ? {
const tanggalPaparan = result.value.tanggalPaparan || ''; message: result.value.message,
tanggalPaparan: result.value.tanggalPaparan
} : {
message: result.value.message
};
$.ajaxSetup({ handleAjaxRequest(
headers: { `/otorisator/otorisator/${dataId}/${dataHeader}`,
'X-CSRF-TOKEN': '{{ csrf_token() }}' requestData,
},
});
$.ajax({
url: `/otorisator/otorisator/${dataId}/${dataHeader}`,
type: 'POST',
data: {
message: keterangan,
tanggalPaparan: tanggalPaparan
},
success: (response) => {
Swal.fire('Berhasil!',
'Data berhasil diotorisasi.', 'Data berhasil diotorisasi.',
'success').then(() => { 'Terjadi kesalahan saat melakukan otorisasi.'
window.location.reload(); );
}); } else if (result.isDenied) {
console.log(response); handleRejection(dataId);
},
error: (error) => {
console.error('Error:', error);
Swal.fire('Gagal!', 'Terjadi kesalahan saat melakukan otorisator.',
'error');
}
});
}
});
}else{
Swal.fire({
title: 'Apakah Yakin?',
text: `Pastikan bahwa paparan sudah dilakukan!`,
icon: 'warning',
input: 'textarea',
inputLabel: 'Keterangan',
inputPlaceholder: 'Masukkan keterangan...',
inputAttributes: {
'aria-label': 'Masukkan keterangan'
},
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Ya, Lanjutkan!',
cancelButtonText: 'Batal',
}).then((result) => {
if (result.isConfirmed) {
const userMessage = result.value || ''; // Ambil pesan dari textarea
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
});
$.ajax({
url: `/otorisator/otorisator/${dataId}/${dataHeader}`,
type: 'POST',
data: {
message: userMessage
},
success: (response) => {
Swal.fire('Berhasil!',
'Data berhasil diotorisasi',
'success').then(() => {
window.location.reload();
});
console.log(response);
},
error: (error) => {
console.error('Error:', error);
Swal.fire('Gagal!', 'Terjadi kesalahan saat melakukan otorisator.',
'error');
}
});
}
});
}
}else{
Swal.fire({
title: 'Apakah Anda yakin?',
text: `Untuk melakukan otorisator ${dataHeader}!`,
icon: 'warning',
input: 'textarea',
inputLabel: 'Keterangan',
inputPlaceholder: 'Masukkan keterangan...',
inputAttributes: {
'aria-label': 'Masukkan keterangan'
},
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Ya, Lanjutkan!',
cancelButtonText: 'Batal',
}).then((result) => {
if (result.isConfirmed) {
const userMessage = result.value || ''; // Ambil pesan dari textarea
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
});
$.ajax({
url: `/otorisator/otorisator/${dataId}/${dataHeader}`,
type: 'POST',
data: {
message: userMessage
},
success: (response) => {
Swal.fire('Berhasil!',
'Data berhasil diotorisasi. Menunggu Approval EO dan atau DD',
'success').then(() => {
window.location.reload();
});
console.log(response);
},
error: (error) => {
console.error('Error:', error);
Swal.fire('Gagal!', 'Terjadi kesalahan saat melakukan otorisator.',
'error');
}
});
}
});
}
}
function revisiLaporan(dataId) {
const dataHeader = @json($header);
Swal.fire({
title: 'Apakah Anda yakin?',
text: `Untuk melakukan Revisi ${dataHeader}!`,
icon: 'warning',
input: 'textarea',
inputLabel: 'Keterangan',
inputPlaceholder: 'Masukkan keterangan...',
inputAttributes: {
'aria-label': 'Masukkan keterangan'
},
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Ya, Lanjutkan!',
cancelButtonText: 'Batal',
}).then((result) => {
if (result.isConfirmed) {
const userMessage = result.value || '';
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
});
$.ajax({
url: `/otorisator/revisi/${dataId}`,
type: 'POST',
data: {
message: userMessage
},
success: (response) => {
Swal.fire('Berhasil!', 'Data berhasil Revisi Laporan', 'success').then(
() => {
window.location.href =
'{{ route('otorisator.pelaporan.index') }}';
});
console.log(response);
},
error: (error) => {
console.error('Error:', error);
Swal.fire('Gagal!', 'Terjadi kesalahan saat melakukan Revisi.',
'error');
}
});
} }
}); });
} }

View File

@@ -5,8 +5,8 @@
@endsection @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full card grid gap-5 lg:gap-7.5 mx-auto">
<div class="card border border-agi-100 pb-2.5">
<div class="min-w-full card-grid" data-datatable="false" data-datatable-page-size="10" <div class="min-w-full card-grid" data-datatable="false" data-datatable-page-size="10"
data-datatable-state-save="false" id="permohonan-table" data-datatable-state-save="false" id="permohonan-table"
data-api-url="{{ route('otorisator.datatables', ['otorisator' => $header]) }}"> data-api-url="{{ route('otorisator.datatables', ['otorisator' => $header]) }}">
@@ -82,6 +82,10 @@
<span class="sort"> <span class="sort-label"> Approval SO </span> <span class="sort"> <span class="sort-label"> Approval SO </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="approval_eo">
<span class="sort"> <span class="sort-label"> Approval EO </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="approval_dd"> <th class="min-w-[150px]" data-datatable-column="approval_dd">
<span class="sort"> <span class="sort-label"> Approval DD </span> <span class="sort"> <span class="sort-label"> Approval DD </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
@@ -108,7 +112,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
@endsection @endsection
@@ -251,6 +255,15 @@
return ''; return '';
}, },
}, },
approval_eo: {
title: 'Approval EO',
render: (item, data) => {
if (data.approve_eo) {
return `${data.approve_eo.name} | ${window.formatTanggalIndonesia(data.approval_eo_at)}`;
}
return '';
},
},
approval_dd: { approval_dd: {
title: 'Approval DD', title: 'Approval DD',
render: (item, data) => { render: (item, data) => {

View File

@@ -206,7 +206,14 @@
if (data.status === 'proses-survey' || data.status == 'rejected-reschedule') { if (data.status === 'proses-survey' || data.status == 'rejected-reschedule') {
actionHtml += ` actionHtml += `
<a onclick="surveyorRescheduleJadwalSurvey(${data.id},${data.penilaian.id},'${data.nomor_registrasi}', '${data.debiture.name}', '${data.penilaian.waktu_penilaian}', ${JSON.stringify(data.penilaian.rejected_note)})" class="delete btn btn-sm btn-outline btn-light" title="Reschedule Jadwal Survey"> <a onclick="surveyorRescheduleJadwalSurvey(
${data.id},
${data.penilaian.id},
${data.nomor_registrasi},
${data.debiture.name},
${data.penilaian.waktu_penilaian},
${JSON.stringify(data.penilaian.rejected_note)}
)" class="delete btn btn-sm btn-outline btn-light" title="Reschedule Jadwal Survey">
<i class="ki-filled ki-calendar-remove"></i> <i class="ki-filled ki-calendar-remove"></i>
</a>`; </a>`;
} }

View File

@@ -90,9 +90,9 @@
</tr> </tr>
@php @php
$i=1; $i=1;
$totalAsset = count($data->debiture->documents); $totalAsset = count($data->dokumenjaminan);
@endphp @endphp
@foreach ($data->debiture->documents as $dokumen) @foreach ($data->dokumenjaminan as $dokumen)
<tr valign="top"> <tr valign="top">
<td>Lokasi Jaminan {{ $totalAsset >1 ? $i : '' }}</td> <td>Lokasi Jaminan {{ $totalAsset >1 ? $i : '' }}</td>
<td>:</td> <td>:</td>
@@ -125,6 +125,8 @@
@if(!$shouldExclude) @if(!$shouldExclude)
@php $details = $dokumen_jaminans->detail; @endphp @php $details = $dokumen_jaminans->detail; @endphp
@foreach ($details as $index => $detail) @foreach ($details as $index => $detail)
@if($detail->dokumen_jaminan)
{{ $detail->name }}
@php @php
$shouldExcludeNomor = false; $shouldExcludeNomor = false;
foreach ($excludedDocuments as $excludedDoc) { foreach ($excludedDocuments as $excludedDoc) {
@@ -136,11 +138,14 @@
@endphp @endphp
@if(!$shouldExcludeNomor) @if(!$shouldExcludeNomor)
@if($detail->dokumen_nomor) @if($detail->dokumen_nomor)
@foreach(json_decode($detail->dokumen_nomor) as $item) {{ " | " }}
{{ $item }}<br> @foreach(json_decode($detail->dokumen_nomor) as $key => $item)
{{ $item }}{{ $key < count(json_decode($detail->dokumen_nomor)) - 1 ? ',' : '' }}
@endforeach @endforeach
@endif @endif
@endif @endif
<br>
@endif
@endforeach @endforeach
@endif @endif
@endif @endif

View File

@@ -106,10 +106,9 @@
</tr> </tr>
@php @php
$i=1; $i=1;
$totalAsset = count($data->debiture->documents); $totalAsset = count($data->dokumenjaminan);
@endphp @endphp
@foreach ($data->dokumenjaminan as $dokumen)
@foreach ($data->debiture->documents as $dokumen)
<tr valign="top"> <tr valign="top">
<td>Lokasi Jaminan {{ $totalAsset >1 ? $i : '' }}</td> <td>Lokasi Jaminan {{ $totalAsset >1 ? $i : '' }}</td>
<td>:</td> <td>:</td>
@@ -142,6 +141,8 @@
@if(!$shouldExclude) @if(!$shouldExclude)
@php $details = $dokumen_jaminans->detail; @endphp @php $details = $dokumen_jaminans->detail; @endphp
@foreach ($details as $index => $detail) @foreach ($details as $index => $detail)
@if($detail->dokumen_jaminan)
{{ $detail->name }}
@php @php
$shouldExcludeNomor = false; $shouldExcludeNomor = false;
foreach ($excludedDocuments as $excludedDoc) { foreach ($excludedDocuments as $excludedDoc) {
@@ -153,11 +154,14 @@
@endphp @endphp
@if(!$shouldExcludeNomor) @if(!$shouldExcludeNomor)
@if($detail->dokumen_nomor) @if($detail->dokumen_nomor)
@foreach(json_decode($detail->dokumen_nomor) as $item) {{ " | " }}
{{ $item }}<br> @foreach(json_decode($detail->dokumen_nomor) as $key => $item)
{{ $item }}{{ $key < count(json_decode($detail->dokumen_nomor)) - 1 ? ',' : '' }}
@endforeach @endforeach
@endif @endif
@endif @endif
<br>
@endif
@endforeach @endforeach
@endif @endif
@endif @endif

View File

@@ -7,7 +7,7 @@
<div class="card-body"> <div class="card-body">
<div class="grid gap-5"> <div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Luas Bangunan</label> <label class="form-label max-w-56">Luas Bangunan(IMB)</label>
<div class="mt-2"> <div class="mt-2">
@if (isset($permohonan->documents)) @if (isset($permohonan->documents))

View File

@@ -16,14 +16,15 @@
$dokumentName = null; $dokumentName = null;
@endphp @endphp
<form id="dataPembandingForm" method="POST" enctype="multipart/form-data"> <form id="dataPembandingForm" method="POST" enctype="multipart/form-data" class="grid gap-5">
@csrf @csrf
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}"> <input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
<input type="hidden" name="type" value="tanah"> <input type="hidden" name="type" value="tanah">
<input type="hidden" name="dokument_id" value="{{ request('dokument') }}"> <input type="hidden" name="dokument_id" value="{{ request('dokument') }}">
<input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}"> <input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}">
<div class="card"> <div class="card">
@foreach ($permohonan->documents as $dokumen) <div class="card-body">
@foreach ($permohonan->debiture->documents as $dokumen)
@if ($dokumen->jenisJaminan) @if ($dokumen->jenisJaminan)
@php @php
$dokumentName = $dokumen->jenisJaminan->name; $dokumentName = $dokumen->jenisJaminan->name;
@@ -38,6 +39,26 @@
@endif @endif
@endif @endif
@endforeach @endforeach
</div>
</div>
<div class="card">
<div class="card-body ">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin: 20px">
<label class="form-label lg:form-label max-w-56 ">Catatan yang Perlu Diperhatikan
</label>
<div class="w-full">
<div id="keterangan-container" class="flex items-baseline flex-wrap gap-2.5 w-full">
<div class="keterangan flex items-center gap-2 mt-2 textarea-group w-full">
<textarea name="keterangan" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="10">{{ $comparisons['keterangan'] ?? old('keterangan') }}</textarea>
<em id="error-keterangan" class="alert text-danger text-sm"></em>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer"> <div class="card-footer">
<div class="flex justify-end gap-2"> <div class="flex justify-end gap-2">
<button type="button" onclick="submitData()" class="btn btn-primary"> <button type="button" onclick="submitData()" class="btn btn-primary">
@@ -46,7 +67,6 @@
</button> </button>
</div> </div>
</div> </div>
</div>
</form> </form>
</div> </div>
</div> </div>
@@ -170,7 +190,7 @@
'total_pembanding[]': currentData.total, 'total_pembanding[]': currentData.total,
'diskon_pembanding[]': currentData.diskon, 'diskon_pembanding[]': currentData.diskon,
'telepon_pembanding[]': currentData.telepon, 'telepon_pembanding[]': currentData.telepon,
'penawaran_pembanding[]': currentData.penawaran, 'penawaran_pembanding[]': currentData.penawaran
} : { } : {
'jenis_aset_pembanding[]': currentData.jenis_aset, 'jenis_aset_pembanding[]': currentData.jenis_aset,
'luas_tanah_pembanding[]': currentData.luas_tanah, 'luas_tanah_pembanding[]': currentData.luas_tanah,
@@ -191,6 +211,8 @@
'hak_properti_pembanding[]': currentData.hak_properti, 'hak_properti_pembanding[]': currentData.hak_properti,
'telepon_pembanding[]': currentData.telepon, 'telepon_pembanding[]': currentData.telepon,
'penawaran_pembanding[]': currentData.penawaran, 'penawaran_pembanding[]': currentData.penawaran,
'tanggal_pembanding[]': currentData.tanggal
}; };
Object.entries(inputs).forEach(([name, value]) => { Object.entries(inputs).forEach(([name, value]) => {
@@ -358,6 +380,8 @@
handleDistrictChange(this); handleDistrictChange(this);
}; };
} }
} }
if (input.type !== 'file' && input.tagName !== 'SELECT') { if (input.type !== 'file' && input.tagName !== 'SELECT') {

View File

@@ -6,7 +6,6 @@
@section('content') @section('content')
<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" /> <link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
{{-- <link rel="stylesheet" href="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.css" /> --}}
<style> <style>
.dropzone { .dropzone {
border: 2px dashed #3498db; border: 2px dashed #3498db;
@@ -234,8 +233,8 @@
<div class="flex gap-2.5"> <div class="flex gap-2.5">
<button id="saveEditDataButton" type="button" class="btn btn-primary" <button id="saveEditDataButton" type="button" class="btn btn-primary"
onclick="saveEditedFoto()">Simpan</button> onclick="saveEditedFoto()">Simpan</button>
{{-- <button type="button" class="btn btn-light" data-modal-toggle="#modal_10" <button type="button" class="btn btn-light" data-modal-toggle="#modal_10"
data-drawer-dismiss="true" onclick="openEditPhotoModal(file)">Edit Foto</button> --}} data-drawer-dismiss="true">Edit Foto</button>
<button type="button" class="btn btn-danger" data-drawer-dismiss="true">Batal</button> <button type="button" class="btn btn-danger" data-drawer-dismiss="true">Batal</button>
</div> </div>
</form> </form>
@@ -244,7 +243,7 @@
<div class="modal" data-modal="true" id="modal_10"> <div class="modal" data-modal="true" id="modal_10">
<div class="modal-content modal-overlay"> <div class="modal-content modal-overlay">
<div class="modal-header"> {{-- <div class="modal-header">
<h3 class="modal-title"> <h3 class="modal-title">
Edit Foto Edit Foto
</h3> </h3>
@@ -252,9 +251,9 @@
<i class="ki-outline ki-cross"> <i class="ki-outline ki-cross">
</i> </i>
</button> </button>
</div> </div> --}}
<div class="modal-body scrollable-y-auto"> <div class="modal-body scrollable-y-auto">
<div id="tui-image-editor"></div> <div id="editor_container" class="w-full h-full"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -266,7 +265,6 @@
@include('lpj::surveyor.js.fotojs') @include('lpj::surveyor.js.fotojs')
@include('lpj::surveyor.js.utils') @include('lpj::surveyor.js.utils')
@push('scripts') @push('scripts')
{{-- <script src="https://uicdn.toast.com/tui-image-editor/latest/tui-image-editor.js"></script> --}}
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script> <script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
<script> <script>
let jsonDataContoh = @json($formFoto); let jsonDataContoh = @json($formFoto);
@@ -283,11 +281,14 @@
console.error(`Dropzone element not found: ${selector}`); console.error(`Dropzone element not found: ${selector}`);
return null; return null;
} }
const processedFiles = new Set();
// Track files that are already on the server
const existingFiles = new Set();
myDropzone = new Dropzone(selector, { myDropzone = new Dropzone(selector, {
url: "{{ route('surveyor.storeFoto') }}", url: "{{ route('surveyor.storeFoto') }}",
paramName: paramName, paramName: paramName,
maxFilesize: 30,
acceptedFiles: 'image/*', acceptedFiles: 'image/*',
uploadMultiple: false, uploadMultiple: false,
parallelUploads: 1, parallelUploads: 1,
@@ -305,15 +306,51 @@
nomor_registrasi: '{{ $permohonan->nomor_registrasi ?? '' }}', nomor_registrasi: '{{ $permohonan->nomor_registrasi ?? '' }}',
}, },
accept: function(file, done) {
// Generate a unique identifier for the file - use hash or content-based ID if possible
const fileId = file.name + '_' + file.size;
// If file is already being processed, reject it
if (processedFiles.has(fileId)) {
done('File sudah dalam antrian upload.');
return;
}
// Check if file already exists on server
if (existingFiles.has(file.name)) {
done('File dengan nama ini sudah ada.');
return;
}
// Add file to processed set
processedFiles.add(fileId);
done();
},
addedfiles: function(files) { addedfiles: function(files) {
uploadQueue += files.length; const validFiles = Array.from(files).filter(file => {
uploadBatch = Array.from(files); // Only count files that haven't been rejected
if (files.length > 0) showLoadingOverlay(); return !file.rejected;
});
uploadQueue += validFiles.length;
uploadBatch = validFiles;
if (validFiles.length > 0) showLoadingOverlay();
}, },
error: function(file, response) { error: function(file, response) {
handleUploadComplete(file, false, response.message); // Remove file from processed list on error
const fileId = file.name + '_' + file.size;
processedFiles.delete(fileId);
// Format error message
let errorMsg = typeof response === 'string' ? response :
(response.message || 'Gagal mengupload file');
handleUploadComplete(file, false, errorMsg);
}, },
success: function(file, response) { success: function(file, response) {
if (response.success) { if (response.success) {
const fileData = { const fileData = {
@@ -325,6 +362,9 @@
param_name: paramName param_name: paramName
}; };
// Add file to existing files set to prevent duplicates
existingFiles.add(file.name);
addEditAndDeleteButtons(file, fileData); addEditAndDeleteButtons(file, fileData);
handleUploadComplete(file, true); handleUploadComplete(file, true);
} else { } else {
@@ -333,10 +373,16 @@
}, },
init: function() { init: function() {
// var myDropzone = this; const dz = this;
loadExistingPhotos(this, paramName);
}
// Clear processed files when all uploads complete
this.on("queuecomplete", function() {
processedFiles.clear();
});
// Load existing photos
loadExistingPhotos(this, paramName, existingFiles);
}
}); });
return myDropzone; return myDropzone;
@@ -346,7 +392,7 @@
} }
} }
function loadExistingPhotos(dropzone, paramName) { function loadExistingPhotos(dropzone, paramName, existingFilesSet) {
showLoadingOverlay(); showLoadingOverlay();
$.ajax({ $.ajax({
@@ -369,6 +415,9 @@
originalPath: foto.path originalPath: foto.path
}; };
// Add to existing files set to prevent duplicates
existingFilesSet.add(foto.name);
dropzone.emit("addedfile", mockFile); dropzone.emit("addedfile", mockFile);
dropzone.emit("thumbnail", mockFile, foto.path); dropzone.emit("thumbnail", mockFile, foto.path);
dropzone.emit("complete", mockFile); dropzone.emit("complete", mockFile);
@@ -456,7 +505,6 @@
} }
} }
function hideLoadingOverlay() { function hideLoadingOverlay() {
const overlay = document.querySelector('.loading-overlay'); const overlay = document.querySelector('.loading-overlay');
if (overlay) overlay.style.display = 'none'; if (overlay) overlay.style.display = 'none';
@@ -481,7 +529,6 @@
}); });
} }
// Inisialisasi Dropzone untuk elemen awal dengan pengecekan // Inisialisasi Dropzone untuk elemen awal dengan pengecekan
function safeInitDropzone(selector, paramName) { function safeInitDropzone(selector, paramName) {
setTimeout(() => { setTimeout(() => {
@@ -494,7 +541,6 @@
// Inisialisasi dropzone untuk elemen awal // Inisialisasi dropzone untuk elemen awal
safeInitDropzone('#upload-dropzone', 'upload_foto'); safeInitDropzone('#upload-dropzone', 'upload_foto');
}); });
let fotoObjekJaminan = @json($fotoObjekJaminan); let fotoObjekJaminan = @json($fotoObjekJaminan);
@@ -541,35 +587,110 @@
} }
} }
document.addEventListener('DOMContentLoaded', function() {
// Create container for Filerobot editor
const editorContainer = document.createElement('div');
editorContainer.id = 'editor_container';
editorContainer.style.width = '100%';
editorContainer.style.height = '100%';
function openEditPhotoModal() { // Add container to modal body
const imageEditorContainer = document.getElementById('tui-image-editor'); const modalBody = document.querySelector('#modal_10 .modal-body');
modalBody.innerHTML = '';
modalBody.appendChild(editorContainer);
// Inisialisasi TUI Image Editor // Update the Edit Foto button event handler
const imageEditor = new tui.ImageEditor(imageEditorContainer, { const editFotoButton = document.querySelector('[data-modal-toggle="#modal_10"]');
includeUI: { if (editFotoButton) {
loadImage: { editFotoButton.addEventListener('click', function(e) {
path: file.dataURL, e.preventDefault();
name: 'Uploaded Photo' // Get the file path from hidden input
}, const filePath = document.getElementById('editDataFilePath').value;
theme: {
'common.bi.image': '', if (filePath) {
'common.bisize.width': '25px', openFilerobotEditor(filePath);
'common.bisize.height': '25px', } else {
'common.backgroundImage': 'none', alert('Tidak ada foto untuk diedit');
'common.backgroundColor': '#fff', }
'common.border': '1px solid #ccc' });
}, }
menu: ['crop', 'flip', 'rotate', 'draw', 'shape', 'icon', 'text', 'filter'],
initMenu: 'filter'
},
cssMaxWidth: 700,
cssMaxHeight: 500
}); });
// openModal('editPhotoModal');
function openFilerobotEditor(imagePath) {
// Get the editor container
const editorContainer = document.getElementById('editor_container');
if (!editorContainer) {
console.error('Editor container not found');
return;
}
// Configuration for the editor
const config = {
source: imagePath || '',
onSave: (editedImageObject, designState) => {
saveEditedImage(editedImageObject, document.getElementById('editDataFilePath').value);
window.FilerobotImageEditor.terminate();
},
annotationsCommon: {
fill: '#ff0000'
},
Text: {
text: 'Tambahkan teks...'
},
Rotate: {
angle: 90,
componentType: 'slider'
},
tabsIds: [
window.FilerobotImageEditor.TABS.ADJUST,
window.FilerobotImageEditor.TABS.FILTERS,
window.FilerobotImageEditor.TABS.FINETUNE,
window.FilerobotImageEditor.TABS.ANNOTATE,
window.FilerobotImageEditor.TABS.WATERMARK,
window.FilerobotImageEditor.TABS.RESIZE,
],
defaultTabId: window.FilerobotImageEditor.TABS.ADJUST,
Language: {
Save: 'Simpan',
Cancel: 'Batal',
Reset: 'Reset',
Edit: 'Edit',
Delete: 'Hapus'
}
};
// Initialize the Filerobot Image Editor
const filerobotImageEditor = new FilerobotImageEditor(
editorContainer,
config
);
filerobotImageEditor.render({
onClose: (closingReason) => {
console.log('Editor closed:', closingReason);
filerobotImageEditor.terminate();
let closeButton = document.getElementById('modal_10');
if (!closeButton) {
closeButton = document.createElement('button');
closeButton.setAttribute('data-modal-dismiss', 'true');
closeButton.setAttribute('type', 'button');
closeButton.setAttribute('class', 'btn btn-primary');
closeButton.setAttribute('data-modal-toggle', '#modal_10');
document.body.appendChild(closeButton);
} }
closeButton.click();
console.log('Modal closed via close button simulation');
}
});
}
window.addEditAndDeleteButtons = function(file, response) { window.addEditAndDeleteButtons = function(file, response) {
const filePreviewElement = file.previewElement; const filePreviewElement = file.previewElement;
@@ -646,8 +767,6 @@
filePreviewElement.appendChild(buttonContainer); filePreviewElement.appendChild(buttonContainer);
} }
async function saveEditedFoto() { async function saveEditedFoto() {
$.ajax({ $.ajax({
url: `{{ route('surveyor.updateFoto') }}`, url: `{{ route('surveyor.updateFoto') }}`,
@@ -688,6 +807,69 @@
} }
}); });
} }
function saveEditedImage(editedImageObject, originalFilePath) {
// Get the image data (base64 or canvas)
const imageData = editedImageObject.imageBase64 ||
(editedImageObject.imageCanvas ? editedImageObject.imageCanvas.toDataURL() : null);
if (!imageData) {
Swal.fire({
icon: 'error',
title: 'Gagal Menyimpan',
text: 'Tidak ada data gambar untuk disimpan',
});
return;
}
const formData = new FormData();
formData.append('edited_image', imageData);
formData.append('original_path', originalFilePath);
formData.forEach((value, key) => {
console.log(`${key}:`, value);
});
$.ajax({
url: `{{ route('surveyor.saveEditedImage') }}`,
type: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
data: {
edited_image: imageData,
original_path: originalFilePath,
nomor_registrasi: '{{ $permohonan->nomor_registrasi }}'
},
success: function(response) {
Swal.fire({
icon: 'success',
title: 'Perubahan Disimpan',
text: response.message,
confirmButtonText: 'OK'
}).then((response) => {
if (response.isConfirmed) {
window.location.reload();
}
});
},
error: function(xhr) {
const errorMessage = xhr.responseJSON?.message || 'Terjadi kesalahan';
Swal.fire({
icon: 'error',
title: 'Gagal Menyimpan',
text: errorMessage,
}).then((response) => {
if (response.isConfirmed) {
window.location.reload();
}
});
}
});
}
</script> </script>
@include('lpj::surveyor.js.camera-editor')
@endpush @endpush

View File

@@ -15,7 +15,6 @@
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@else @else
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Route::currentRouteName('otorisator.show')) Route::currentRouteName('otorisator.show'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => 'Pelaporan']) }}" <a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => 'Pelaporan']) }}"
@@ -23,11 +22,17 @@
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor']) && Route::currentRouteName('penilai.show')) @elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor']) && Route::currentRouteName('penilai.show'))
@if (Request::is('surveyor/inspeksi/*/create') && request()->has('dokument') && request()->has('jenis_jaminan'))
<a href="{{ route('surveyor.show', request()->get('dokument')) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
@else
<a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info"> <a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@endif @endif
@endif @endif
@endif
{{-- <a href="{{ route('surveyor.show', ['id' => request('inspeksi')]) }}" class="btn btn-xs btn-info"> {{-- <a href="{{ route('surveyor.show', ['id' => request('inspeksi')]) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> --}} </a> --}}
@@ -280,6 +285,15 @@
<div class="card-body w-full"> <div class="card-body w-full">
@include('lpj::component.detail-jaminan', ['status' => true]) @include('lpj::component.detail-jaminan', ['status' => true])
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full">
<label class="form-label font-medium max-w-56">Nomor NIB</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="nomor_nib" class="input w-full"
value="{{ isset($forminspeksi['asset']['nomor_nib']) ? $forminspeksi['asset']['nomor_nib'] : '' }}"
placeholder="Masukkan Nomor NIB">
</div>
</div>
<div class=" mx-auto rounded-lg overflow-hidden"> <div class=" mx-auto rounded-lg overflow-hidden">
<div class="py-4 "> <div class="py-4 ">
<h1 class="text-md font-medium text-gray-900">Hubungan cadeb/debitur dengan Pemilik Jaminan</h1> <h1 class="text-md font-medium text-gray-900">Hubungan cadeb/debitur dengan Pemilik Jaminan</h1>
@@ -325,7 +339,7 @@
@endphp @endphp
<select id="hub_cadeb_tidak_sesuai" class="input w-full" name="hub_cadeb_tidak_sesuai" <select id="hub_cadeb_tidak_sesuai" class="input w-full" name="hub_cadeb_tidak_sesuai"
style="{{ old('hub_cadeb_tidak_sesuai', $selectedData) ? '' : 'display: none;' }}"> style="{{ $statusKey != 'sesuai' ? '' : 'display: none;' }}">
<option value="">Select Hubungan Cadeb</option> <option value="">Select Hubungan Cadeb</option>
@if (isset($basicData['hubCadeb'])) @if (isset($basicData['hubCadeb']))
@foreach ($basicData['hubCadeb'] as $item) @foreach ($basicData['hubCadeb'] as $item)
@@ -389,7 +403,7 @@
<input id="hub_penghuni_tidak_sesuai" class="input" name="hub_penghuni_tidak_sesuai" <input id="hub_penghuni_tidak_sesuai" class="input" name="hub_penghuni_tidak_sesuai"
placeholder="Masukkan Hubungan penghuni jaminan" placeholder="Masukkan Hubungan penghuni jaminan"
value="{{ old('hub_penghuni_tidak_sesuai', isset($selectedData) ? $selectedData : '') }}" value="{{ old('hub_penghuni_tidak_sesuai', isset($selectedData) ? $selectedData : '') }}"
style="{{ old('hub_penghuni_tidak_sesuai', $selectedData ?? false) ? '' : 'display: none;' }}"> style="{{ $statusKey != 'sesuai' ? '' : 'display: none;' }}">
</div> </div>
<em id="error-hub_cadeb_penghuni" class="alert text-danger text-sm"></em> <em id="error-hub_cadeb_penghuni" class="alert text-danger text-sm"></em>
</div> </div>

View File

@@ -115,6 +115,28 @@
@endforeach @endforeach
@endif @endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
<span class="form-label">Sentuh Tanahku</span>
</label>
<div class="input-group w-full flex gap-2">
<input class="name_rute" type="hidden" name="name_rute" value="rute">
<div class="w-full">
<input id="inputGistaru" type="file" name="foto_sentuh_tanahku"
class="file-input file-input-bordered w-full"
accept=".jpg,.jpeg,.png,.gif,.bmp,.tiff,.tif,.webp,.svg"
onchange="previewImage(this, 'sentuh_tanahku-preview')">
<img id="sentuh_tanahku-preview"
src="{{ asset('storage/' . (isset($forminspeksi['foto_sentuh_tanahku']) ? $forminspeksi['foto_sentuh_tanahku'] : '')) }}"
alt="Foto Bhumi" class="mt-2 max-w-full h-auto"
style="{{ isset($forminspeksi['foto_sentuh_tanahku']) ? '' : 'display: none;' }} max-width: 30rem;" />
</div>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
@@ -194,6 +216,8 @@
</div> </div>
<!-- Upload Photo Button --> <!-- Upload Photo Button -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<label for="" class="form-label max-w-56 text-sm font-medium text-gray-700">Upload Peta</label> <label for="" class="form-label max-w-56 text-sm font-medium text-gray-700">Upload Peta</label>
<div class="w-full grid gap-5"> <div class="w-full grid gap-5">

View File

@@ -20,7 +20,7 @@
@include('lpj::surveyor.components.header') @include('lpj::surveyor.components.header')
@include('lpj::surveyor.components.rap') @include('lpj::surveyor.components.rap')
@else @else
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->debiture->documents as $dokumen)
@if ($dokumen->jenisJaminan) @if ($dokumen->jenisJaminan)
@php @php
$formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true); $formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true);
@@ -91,6 +91,8 @@
@push('scripts') @push('scripts')
<script src="https://cdn.jsdelivr.net/npm/signature_pad@4.1.7/dist/signature_pad.umd.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/signature_pad@4.1.7/dist/signature_pad.umd.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
const datas = @json($forminspeksi);
console.log(datas);
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const signaturePads = {}; const signaturePads = {};
const types = ['penilai', 'cabang', 'debitur', 'kjjp']; const types = ['penilai', 'cabang', 'debitur', 'kjjp'];
@@ -343,8 +345,6 @@
showLoadingSwal('Mengirim data ke server...'); showLoadingSwal('Mengirim data ke server...');
const form = document.querySelector('form'); const form = document.querySelector('form');
const formData = new FormData(form); const formData = new FormData(form);
console.log('Form data entries:', Array.from(formData.entries()));
$.ajax({ $.ajax({
url: '{{ route('surveyor.store') }}', url: '{{ route('surveyor.store') }}',
type: 'POST', type: 'POST',
@@ -364,8 +364,8 @@
confirmButtonText: 'OK' confirmButtonText: 'OK'
}).then((response) => { }).then((response) => {
if (response.isConfirmed) { if (response.isConfirmed) {
window.location.href = // window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}'; // '{{ route('surveyor.show', ['id' => $permohonan->id]) }}';
} }
}); });
} else { } else {
@@ -389,8 +389,6 @@
}); });
return; return;
} }
let errors = xhr.responseJSON?.errors; let errors = xhr.responseJSON?.errors;
$('.alert').text(''); $('.alert').text('');
if (errors) { if (errors) {

View File

@@ -352,7 +352,7 @@
<!-- Merupakan daerah --> <!-- Merupakan daerah -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Merupakan daerah</label> <label class="form-label max-w-56">Merupakan Daerah</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col items-start gap-4"> <div class="flex flex-col items-start gap-4">
@if (isset($basicData['merupakanDaerah'])) @if (isset($basicData['merupakanDaerah']))
@@ -373,7 +373,7 @@
<!-- Fasilitas Umum Sekitar --> <!-- Fasilitas Umum Sekitar -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Fasilitas Umum dekat Object</label> <label class="form-label max-w-56">Fasilitas Umum Dekat Objek</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col items-start gap-4"> <div class="flex flex-col items-start gap-4">
@if (isset($basicData['fasilitasObjek'])) @if (isset($basicData['fasilitasObjek']))

View File

@@ -17,7 +17,7 @@ video, canvas {
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">Ambil Foto</h3> <h3 class="modal-title">Ambil Foto</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true" id="closeModal"> <button type="button" class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true" id="closeModal">
<i class="ki-outline ki-cross"></i> <i class="ki-outline ki-cross"></i>
</button> </button>
</div> </div>

View File

@@ -138,7 +138,6 @@
} }
@endphp @endphp
@if (isset($inspectionData['bangunan']))
<tr> <tr>
<td class="px-4 py-2">Luas Bangunan ()</td> <td class="px-4 py-2">Luas Bangunan ()</td>
<td class="px-4 py-2"> <td class="px-4 py-2">
@@ -149,7 +148,7 @@
<input type="text" name="luas_bangunan_pembanding[]" class="input "> <input type="text" name="luas_bangunan_pembanding[]" class="input ">
</td> </td>
</tr> </tr>
@endif
<!-- Informasi Harga --> <!-- Informasi Harga -->
@@ -172,9 +171,20 @@
<td class="px-4 py-2"> <td class="px-4 py-2">
<input type="text" name="penawaran" class="input" <input type="text" name="penawaran" class="input"
value="{{ $inspectionData['asset']['penawaran'] ?? '' }}"> value="{{ $inspectionData['asset']['penawaran'] ?? '' }}">
{{-- <select class="input w-full" name="penawaran">
<option value="">Pilih</option>
<option value="Penawaran" {{ (isset($inspectionData['asset']['penawaran']) && $inspectionData['asset']['penawaran'] == 'Penawaran') ? 'selected' : '' }}>Penawaran</option>
<option value="Transaksi" {{ (isset($inspectionData['asset']['penawaran']) && $inspectionData['asset']['penawaran'] == 'Transaksi') ? 'selected' : '' }}>Transaksi</option>
</select> --}}
</td> </td>
<td class="px-4 py-2"> <td class="px-4 py-2">
<input type="text" name="penawaran_pembanding[]" class="input"> <input type="text" name="penawaran_pembanding[]" class="input">
{{-- <select class="input w-full" name="penawaran_pembanding[]">
<option value="">Pilih</option>
<option value="Penawaran" {{ (isset($inspectionData['penawaran']) && $inspectionData['penawaran'] == 'Penawaran') ? 'selected' : '' }}>Penawaran</option>
<option value="Transaksi" {{ (isset($inspectionData['penawaran']) && $inspectionData['penawaran'] == 'Transaksi') ? 'selected' : '' }}>Transaksi</option>
</select> --}}
</td> </td>
</tr> </tr>
@@ -211,6 +221,16 @@
</td> </td>
</tr> </tr>
<tr>
<td class="px-4 py-2">Tanggal Data</td>
<td class="px-4 py-2">
<input type="date" name="tanggal" class="input"
value="{{ $inspectionData['asset']['tanggal'] ?? '' }}">
</td>
<td class="px-4 py-2">
<input type="date" name="tanggal_pembanding[]" class="input">
</td>
</tr>
<!-- Lokasi --> <!-- Lokasi -->
<tr class="bg-gray-100"> <tr class="bg-gray-100">

View File

@@ -7,7 +7,7 @@
: 'sesuai'; : 'sesuai';
$luasBangunan = $forminspeksi['bangunan']['luas_tanah_bagunan'][$cekLuasBangunan] ?? null; $luasBangunan = $forminspeksi['bangunan']['luas_tanah_bagunan'][$cekLuasBangunan] ?? null;
@endphp @endphp
<td width="25%"><strong>Luas Tanah Bangunan</strong></td> <td width="25%"><strong>Luas Bangunan (IMB)</strong></td>
<td>{{ $luasBangunan }}</td> <td>{{ $luasBangunan }}</td>
</tr> </tr>
@@ -28,6 +28,7 @@
<input type="checkbox" <input type="checkbox"
{{ isset($forminspeksi['bangunan']['jenis_bangunan']) && in_array($item->name, $forminspeksi['bangunan']['jenis_bangunan']) ? 'checked' : '' }}> {{ isset($forminspeksi['bangunan']['jenis_bangunan']) && in_array($item->name, $forminspeksi['bangunan']['jenis_bangunan']) ? 'checked' : '' }}>
{{ $item->name }} {{ $item->name }}
</label> </label>
</td> </td>
@endforeach @endforeach
@@ -80,6 +81,18 @@
<input type="checkbox" name="sifat_bangunan[]" value="{{ $item->name }}" <input type="checkbox" name="sifat_bangunan[]" value="{{ $item->name }}"
{{ isset($forminspeksi['bangunan']['sifat_bangunan']) && in_array($item->name, $forminspeksi['bangunan']['sifat_bangunan']) ? 'checked' : '' }}> {{ isset($forminspeksi['bangunan']['sifat_bangunan']) && in_array($item->name, $forminspeksi['bangunan']['sifat_bangunan']) ? 'checked' : '' }}>
{{ $item->name }} {{ $item->name }}
@if (isset($forminspeksi['bangunan']['sifat_bangunan']) &&
in_array($item->name, $forminspeksi['bangunan']['sifat_bangunan']))
@php
$inputValues = isset($forminspeksi['bangunan']['sifat_bangunan_input'][$index])
? $forminspeksi['bangunan']['sifat_bangunan_input'][$index]
: null;
@endphp
@if ($inputValues)
<span class="label-checkbox"> - {{ $inputValues }}</span>
@endif
@endif
</label> </label>
</td> </td>
@endforeach @endforeach
@@ -90,7 +103,8 @@
</tr> </tr>
@if (isset($forminspeksi['bangunan']['spesifikasi_bangunan']) && count($forminspeksi['bangunan']['spesifikasi_bangunan']) > 0) @if (isset($forminspeksi['bangunan']['spesifikasi_bangunan']) &&
count($forminspeksi['bangunan']['spesifikasi_bangunan']) > 0)
@foreach ($forminspeksi['bangunan']['spesifikasi_bangunan'] as $bangunanIndex => $bangunan) @foreach ($forminspeksi['bangunan']['spesifikasi_bangunan'] as $bangunanIndex => $bangunan)
<tr> <tr>
<td colspan="2"><strong>Spesifikasi Bangunan {{ $bangunanIndex + 1 }}</strong></td> <td colspan="2"><strong>Spesifikasi Bangunan {{ $bangunanIndex + 1 }}</strong></td>
@@ -109,14 +123,20 @@
@php @php
$selectedValues = []; $selectedValues = [];
if (isset($bangunan['spek_kategori_bangunan'][$spesifikasi->name])) { if (isset($bangunan['spek_kategori_bangunan'][$spesifikasi->name])) {
$selectedValues = array_values($bangunan['spek_kategori_bangunan'][$spesifikasi->name]); $selectedValues = array_values(
$bangunan['spek_kategori_bangunan'][$spesifikasi->name],
);
} }
$lainnyaValue = $bangunan['spek_kategori_bangunan'][$spesifikasi->name]['lainnya'] ?? ''; $lainnyaValue =
$bangunan['spek_kategori_bangunan'][$spesifikasi->name][
'lainnya'
] ?? '';
@endphp @endphp
<td class="checkbox-item"> <td class="checkbox-item">
<label class="checkbox-label"> <label class="checkbox-label">
<input type="checkbox" class="checkbox-lainnya" style="margin-right: 3px;" <input type="checkbox" class="checkbox-lainnya"
style="margin-right: 3px;"
name="spesifikasi_bangunan[{{ $bangunanIndex }}][{{ $spesifikasi->name }}][]" name="spesifikasi_bangunan[{{ $bangunanIndex }}][{{ $spesifikasi->name }}][]"
value="{{ $kategori->name }}" value="{{ $kategori->name }}"
@if (in_array($kategori->name, $selectedValues)) checked @endif> @if (in_array($kategori->name, $selectedValues)) checked @endif>

View File

@@ -129,8 +129,13 @@
@foreach ($informasi as $key) @foreach ($informasi as $key)
@if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-') @if (isset($forminspeksi['fakta'][$key]) && $forminspeksi['fakta'][$key] !== '-')
<p> - {{ ucfirst(str_replace('_', ' ', $key)) }}: @php
{{ $forminspeksi['fakta'][$key] }}</p> $displayKey = ucfirst(str_replace('_', ' ', $key));
if (strlen($key) == 3) {
$displayKey = strtoupper($key);
}
@endphp
<p> - {{ $displayKey }}: {{ $forminspeksi['fakta'][$key] }}</p>
@endif @endif
@endforeach @endforeach
</td> </td>

View File

@@ -13,23 +13,23 @@
<table> <table>
<tr> <tr>
<td width="25%">Jarak Jalan Utama</td> <td width="25%">Jarak Jalan Utama</td>
<td>{{ $forminspeksi['lingkungan']['jarak_jalan_utama'] ?? 'Tidak Diketahui' }}</td> <td>{{ $forminspeksi['lingkungan']['jarak_jalan_utama'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td>Jalan Lingkungan</td> <td>Jalan Lingkungan</td>
<td>{{ $forminspeksi['lingkungan']['jarak_jalan_utama'] ?? 'Tidak Diketahui' }}</td> <td>{{ $forminspeksi['lingkungan']['jalan_linkungan'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td>Jarak CBD Point</td> <td>Jarak CBD Point</td>
<td>{{ $forminspeksi['lingkungan']['jarak_cbd_point'] ?? 'Tidak Diketahui' }}</td> <td>{{ $forminspeksi['lingkungan']['jarak_cbd_point'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td>Nama CBD Point</td> <td>Nama CBD Point</td>
<td>{{ $forminspeksi['lingkungan']['nama_cbd_point'] ?? 'Tidak Diketahui' }}</td> <td>{{ $forminspeksi['lingkungan']['nama_cbd_point'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td>Lebar Perkerasan Jalan</td> <td>Lebar Perkerasan Jalan</td>
<td>{{ $forminspeksi['lingkungan']['lebar_perkerasan_jalan'] ?? 'Tidak Diketahui' }}</td> <td>{{ $forminspeksi['lingkungan']['lebar_perkerasan_jalan'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td style="vertical-align: top;"><strong>Sarana Pelengkap</strong></td> <td style="vertical-align: top;"><strong>Sarana Pelengkap</strong></td>
@@ -191,6 +191,55 @@
</td> </td>
</tr> </tr>
<tr>
<td style="vertical-align: top;"><strong>Dekat Makam</strong></td>
<td>
<div class="checkbox-item">
<label class="checkbox-label">
<input type="radio" name="disekitar_lokasi" value="ya"
{{ ($forminspeksi['lingkungan']['dekat_makam'] ?? '') == 'ya' ? 'checked' : '' }}>
Ya
@if (($forminspeksi['lingkungan']['dekat_makam'] ?? '') == 'ya')
- Nama Makam:
{{ $forminspeksi['lingkungan']['nama_makam'] ?? '' }}
, Jarak Makam:
{{ $forminspeksi['lingkungan']['jarak_makam'] ?? '' }}
@endif
</label>
<label class="checkbox-label">
<input type="radio" name="disekitar_lokasi" value="tidak"
{{ ($forminspeksi['lingkungan']['dekat_makam'] ?? '') == 'tidak' ? 'checked' : '' }}>
Tidak
</label>
</div>
</td>
</tr>
<tr>
<td style="vertical-align: top;"><strong>Dekat TPS</strong></td>
<td>
<div class="checkbox-item">
<label class="checkbox-label">
<input type="radio" name="disekitar_lokasi" value="ya"
{{ ($forminspeksi['lingkungan']['dekat_tps'] ?? '') == 'ya' ? 'checked' : '' }}>
Ya
@if (($forminspeksi['lingkungan']['dekat_tps'] ?? '') == 'ya')
- Nama TPS:
{{ $forminspeksi['lingkungan']['nama_tps'] ?? '' }}
, Jarak TPS:
{{ $forminspeksi['lingkungan']['jarak_tps'] ?? '' }}
@endif
</label>
<label class="checkbox-label">
<input type="radio" name="disekitar_lokasi" value="tidak"
{{ ($forminspeksi['lingkungan']['dekat_tps'] ?? '') == 'tidak' ? 'checked' : '' }}>
Tidak
</label>
</div>
</td>
</tr>
<tr> <tr>
<td style="vertical-align: top;"><strong>Merupakan Daerah</strong></td> <td style="vertical-align: top;"><strong>Merupakan Daerah</strong></td>
<td> <td>

View File

@@ -193,6 +193,12 @@
.page-break { .page-break {
page-break-after: always; page-break-after: always;
} }
.no-break {
page-break-inside: avoid;
page-break-before: auto;
page-break-after: auto;
}
</style> </style>
</head> </head>
@@ -308,7 +314,13 @@
</tr> </tr>
<tr> <tr>
<td><strong>Nama Debiture/ Wakil Debiture</strong></td> <td><strong>Nama Debiture/ Wakil Debiture</strong></td>
<td>{{ $permohonan->debiture->name ?? '' }}</td> <td>{{ $permohonan->debiture->name ?? '' }}
@if (isset($forminspeksi['asset']['debitur_perwakilan']) && !empty($forminspeksi['asset']['debitur_perwakilan']))
@foreach ($forminspeksi['asset']['debitur_perwakilan'] as $key => $item)
/ {{ $item }}
@endforeach
@endif
</td>
<td><strong>Kunjungan Tanggal</strong></td> <td><strong>Kunjungan Tanggal</strong></td>
<td>{{ formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) }}</td> <td>{{ formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) }}</td>
</tr> </tr>
@@ -424,9 +436,11 @@
<table> <table>
@if (@isset($dokumen)) @if (@isset($dokumen))
@foreach ($dokumen->detail as $detail) @foreach ($dokumen->detail as $detail)
<tr>
@if (isset($detail->dokumen_jaminan)) @if (isset($detail->dokumen_jaminan))
<tr>
<td width="25%"><strong>{{ $detail->name ?? '' }}</strong></td> <td width="25%"><strong>{{ $detail->name ?? '' }}</strong></td>
</tr>
<tr>
<td> <td>
@if (isset($detail->dokumen_jaminan)) @if (isset($detail->dokumen_jaminan))
@php @php
@@ -449,27 +463,28 @@
@endforeach @endforeach
@endif @endif
</td> </td>
@endif
</tr> </tr>
@endif
<tr>
@if (isset($detail->details)) @if (isset($detail->details))
@if (json_decode($detail->details)) @if (json_decode($detail->details))
@foreach (json_decode($detail->details) as $key => $value) @foreach (json_decode($detail->details) as $key => $value)
@if (!is_null($value) && $value !== '') @if (!is_null($value) && $value !== '')
<td style=" padding: 2px;">{{ ucwords(str_replace('_', ' ', $key)) ?? '' }} <tr>
<td style="padding: 2px;">
{{ ucwords(str_replace('_', ' ', $key)) ?? '' }}
</td> </td>
<td style="padding: 2px;">
<td style=" padding: 2px;">{{ $value }} {{ $value }}
@if ($key == 'luas_bangunan' || $key == 'luas_tanah') @if ($key == 'luas_bangunan' || $key == 'luas_tanah')
<sup>m2</sup> <sup>m2</sup>
@endif @endif
</td> </td>
</tr>
@endif @endif
@endforeach @endforeach
@endif @endif
@endif @endif
</tr>
@endforeach @endforeach
@endif @endif
@@ -553,10 +568,12 @@
</table> </table>
</td> </td>
</tr> </tr>
@if (strtolower($permohonan->tujuanPenilaian->name) == 'rap') @if (strtolower($permohonan->tujuanPenilaian->name) == 'rap')
@include('lpj::surveyor.components.print-out.rap') @include('lpj::surveyor.components.print-out.rap')
@else @else
<tr> <tr>
<td style="text-align: center; border: 1px solid #000;"> <td style="text-align: center; border: 1px solid #000;">
E E
</td> </td>
@@ -597,7 +614,7 @@
</td> </td>
</tr> </tr>
@endIf @endIf
</div>
{{-- <tr> {{-- <tr>
<td style="text-align: center; border: 1px solid #000;"> <td style="text-align: center; border: 1px solid #000;">
G G

View File

@@ -373,12 +373,36 @@
</table> </table>
</td> </td>
</tr> </tr>
@endisset
@isset($forminspeksi['properti_sejenis'])
<tr>
<td style="text-align: center; border: 1px solid #000;">
P
</td>
<td style="text-align: center; border: 1px solid #000;">
PROPERTI SEJENIS
</td>
</tr>
<tr>
<td style="text-align: center; border: 1px solid #000;">
</td>
<td style=" border: 1px solid #000;">
<table>
<tr>
<td>
{{ $forminspeksi['properti_sejenis'] ?? '' }}
</td>
</tr>
</table>
</td>
</tr>
@endisset @endisset
@if (isset($forminspeksi['fakta']) && is_array($forminspeksi['fakta'])) @if (isset($forminspeksi['fakta']) && is_array($forminspeksi['fakta']))
<tr> <tr>
<td style="text-align: center; border: 1px solid #000;"> <td style="text-align: center; border: 1px solid #000;">
P Q
</td> </td>
<td style="text-align: center; border: 1px solid #000;"> <td style="text-align: center; border: 1px solid #000;">
ATURAN TATA KOTA ATURAN TATA KOTA
@@ -422,7 +446,7 @@
<tr> <tr>
<td style="text-align: center; border: 1px solid #000;"> <td style="text-align: center; border: 1px solid #000;">
P R
</td> </td>
<td style="text-align: center; border: 1px solid #000;"> <td style="text-align: center; border: 1px solid #000;">
CATATAN LAINNYA CATATAN LAINNYA

View File

@@ -123,13 +123,16 @@
<td><strong>Tusuk Sate</strong></td> <td><strong>Tusuk Sate</strong></td>
<td> <td>
<label> <label>
<input type="radio" name="tusuk_sate" value="yes" <input type="radio" name="tusuk_sate" value="Ya"
{{ $forminspeksi['tanah']['tusuk_sate'] == 'yes' ? 'checked' : '' }}> {{ isset($forminspeksi['tanah']['tusuk_sate']['Ya']) && $forminspeksi['tanah']['tusuk_sate']['Ya'] ? 'checked' : '' }}>
Ya Ya
@if (isset($forminspeksi['tanah']['tusuk_sate']) && $forminspeksi['tanah']['tusuk_sate']['Ya'])
{{ isset($forminspeksi['tanah']['tusuk_sate']['Ya']) ? ' (' . $forminspeksi['tanah']['tusuk_sate']['Ya'] . ')' : '' }}
@endif
</label> </label>
<label> <label>
<input type="radio" name="tusuk_sate" value="no" <input type="radio" name="tusuk_sate" value="Tidak"
{{ $forminspeksi['tanah']['tusuk_sate'] == 'no' ? 'checked' : '' }}> {{isset($forminspeksi['tanah']['tusuk_sate']['Tidak']) && $forminspeksi['tanah']['tusuk_sate']['Tidak'] ? 'checked' : '' }}>
Tidak Tidak
</label> </label>
</td> </td>
@@ -139,12 +142,12 @@
<td> <td>
<label> <label>
<input type="radio" name="lockland" value="yes" <input type="radio" name="lockland" value="yes"
{{ $forminspeksi['tanah']['lockland'] == 'yes' ? 'checked' : '' }}> {{ isset($forminspeksi['tanah']['lockland']) && $forminspeksi['tanah']['lockland'] == 'yes' ? 'checked' : '' }}>
Ya Ya
</label> </label>
<label> <label>
<input type="radio" name="lockland" value="no" <input type="radio" name="lockland" value="no"
{{ $forminspeksi['tanah']['lockland'] == 'no' ? 'checked' : '' }}> {{ isset($forminspeksi['tanah']['lockland']) && $forminspeksi['tanah']['lockland'] == 'no' ? 'checked' : '' }}>
Tidak Tidak
</label> </label>
</td> </td>

View File

@@ -693,4 +693,36 @@
</div> </div>
</div> </div>
<div class="card border border-agi-100 w-full rounded-lg shadow-md overflow-hidden">
<div class="card-header bg-agi-50">
<h3 class="card-title uppercase">
Properti Sejenis
</h3>
</div>
<div class="card-body">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<div id="fakta-positif-container" class="flex flex-wrap items-baseline w-full">
@if (!empty($forminspeksi['properti_sejenis']))
<div class="properti_sejenis flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="properti_sejenis" rows="10">{{ old('properti_sejenis', $forminspeksi['properti_sejenis']) }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" style="display: none;">
<i class="ki-outline ki-trash"></i>
</button>
</div>
@else
<div class="properti_sejenis flex items-center gap-2 mt-2 textarea-group w-full">
<textarea class="textarea mt-2" name="properti_sejenis" rows="10">{{ old('properti_sejenis') }}</textarea>
<button class="btn btn-danger btn-sm remove-btn" type="button" style="display: none;">
<i class="ki-outline ki-trash"></i>
</button>
</div>
@endif
</div>
</div>
</div>
</div>
@include('lpj::surveyor.components.informasi') @include('lpj::surveyor.components.informasi')

View File

@@ -85,10 +85,9 @@
<!-- Select dropdown untuk "Tidak Sesuai" --> <!-- Select dropdown untuk "Tidak Sesuai" -->
<div id="hadap_mata_angin_tidak_sesuai" class="flex items-baseline gap-2" <div id="hadap_mata_angin_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('hadap_mata_angin', isset($forminspeksi['tanah']['hadap_mata_angin']['tidak sesuai'])) ? '' : 'display: none;' }}"> style="{{ old('hadap_mata_angin', isset($forminspeksi['tanah']['hadap_mata_angin']['tidak sesuai'])) ? '' : 'display: none;' }}">
<select <select class="input w-full
class="input w-full id="
id=" hadap_mata_angin_tidak_sesuai" hadap_mata_angin_tidak_sesuai" name="hadap_mata_angin_tidak_sesuai">
name="hadap_mata_angin_tidak_sesuai">
@php @php
$statusKey = isset($forminspeksi['tanah']['hadap_mata_angin']['sesuai']) $statusKey = isset($forminspeksi['tanah']['hadap_mata_angin']['sesuai'])
? 'sesuai' ? 'sesuai'
@@ -273,13 +272,24 @@
<div class="flex-wrap items-stretch"> <div class="flex-wrap items-stretch">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2"> <div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-2.5 text-nowrap"> <label class="form-label flex items-center gap-2.5 text-nowrap">
<input type="radio" class="radio" name="tusuk_sate" value="yes" <input onclick="toggleFieldVisibility('tusuk_sate', 'tusuk_sate_ya', ['Ya'])"
{{ old('tusuk_sate') == 'yes' || (isset($forminspeksi['tanah']['tusuk_sate']) && $forminspeksi['tanah']['tusuk_sate'] == 'yes') ? 'checked' : '' }}> type="radio" class="radio" name="tusuk_sate" value="Ya"
{{ old('tusuk_sate') == 'Ya' || (isset($forminspeksi['tanah']['tusuk_sate']['Ya']) && $forminspeksi['tanah']['tusuk_sate']['Ya']) ? 'checked' : '' }}>
<span class="ml-2">Ya</span> <span class="ml-2">Ya</span>
@php
$statusKey = isset($forminspeksi['tanah']['tusuk_sate']['Ya']) ? 'Ya' : 'Tidak';
$selectedData = $forminspeksi['tanah']['tusuk_sate'][$statusKey] ?? null;
@endphp
<input id="tusuk_sate_ya" class="input" name="tusuk_sate_ya"
placeholder="Masukkan Tusuk Sate..."
value="{{ old('tusuk_sate_ya', isset($selectedData) ? $selectedData : '') }}"
style="{{ $statusKey == 'Ya' ? '' : 'display: none;' }}">
</label> </label>
<label class="form-label flex items-center gap-2.5 text-nowrap"> <label class="form-label flex items-center gap-2.5 text-nowrap">
<input type="radio" class="radio" name="tusuk_sate" value="no" <input onclick="toggleFieldVisibility('tusuk_sate', 'tusuk_sate_ya', ['Ya'])"
{{ old('tusuk_sate') == 'no' || (isset($forminspeksi['tanah']['tusuk_sate']) && $forminspeksi['tanah']['tusuk_sate'] == 'no') ? 'checked' : '' }}> type="radio" class="radio" name="tusuk_sate" value="Tidak"
{{ old('tusuk_sate') == 'Tidak' || (isset($forminspeksi['tanah']['tusuk_sate']['Tidak']) && $forminspeksi['tanah']['tusuk_sate']['Tidak']) ? 'checked' : '' }}>
<span class="ml-2">Tidak</span> <span class="ml-2">Tidak</span>
</label> </label>
</div> </div>

View File

@@ -22,6 +22,21 @@
@include('lpj::component.detail-jaminan',['backLink'=>'surveyor.index']) @include('lpj::component.detail-jaminan',['backLink'=>'surveyor.index'])
@if ($permohonan->status == 'revisi-survey')
<div class="card border border-agi-100 min-w-full">
<div class="card-header bg-agi-50" id="basic_settings">
<div class="card-title flex flex-row gap-1.5">
Catatan Revisi
</div>
</div>
<div class="card-body">
<p>{{ $permohonan->keterangan ?? '' }}</p>
</div>
</div>
@endif
<div class="card border border-agi-100 min-w-full"> <div class="card border border-agi-100 min-w-full">
<div class="card-header bg-agi-50" id="basic_settings"> <div class="card-header bg-agi-50" id="basic_settings">
<div class="card-title flex flex-row gap-1.5"> <div class="card-title flex flex-row gap-1.5">

View File

@@ -97,65 +97,13 @@
</div> </div>
</div> </div>
<div class="modal" data-modal="true" id="modal_jadwal">
<div class="modal-content modal-center-y max-w-[600px]">
<div class="modal-header">
<h3 class="modal-title">Kunjungan</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true">
<i class="ki-outline ki-cross"></i>
</button>
</div>
<div class="modal-body">
<form action="{{ route('surveyor.storeJadwal') }}" method="POST" enctype="multipart/form-data"
id="revisiForm">
@method('put')
@csrf
<input id="ids" type="hidden" name="id">
<div class="pl-1 grid gap-2.5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Tanggal Kunjungan</label>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('waktu_penilaian') border-danger bg-danger-light @enderror"
type="datetime-local" name="waktu_penilaian" value="">
@error('waktu_penilaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Catatan</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea id="deskripsi_penilaian"
class="textarea @error('deskripsi_penilaian') border-danger bg-danger-light @enderror" rows="3"
name="deskripsi_penilaian"></textarea>
@error('deskripsi_penilaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
<div class="modal-footer justify-end mt-2">
<div class="flex gap-4">
<button type="button" class="btn btn-light" data-modal-dismiss="true">Cancel</button>
<button id="btnSubmit" type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div> </div>
@endsection @endsection
@push('scripts') @push('scripts')
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script> <script>
function jadwal(id) {
document.getElementById('ids').value = id;
}
function surveyorFreeze(permohonanId, noReg, debitur) { function surveyorFreeze(permohonanId, noReg, debitur) {
Swal.fire({ Swal.fire({
@@ -329,11 +277,13 @@
}; };
// Melakukan AJAX request // Melakukan AJAX request
$.ajax({ $.ajax({
url: useURL, url: useURL,
type: "PUT", type: "PUT",
cache: false, cache: false,
data: input_data, data: input_data,
dataType: "json", dataType: "json",
success: function(response) { success: function(response) {
if (response.status === 'success') { if (response.status === 'success') {
@@ -352,6 +302,224 @@
} }
}); });
} }
function prosesJadwalSurvey(permohonanId) {
Swal.fire({
title: 'Apakah Anda Yakin?',
html: `
<div class="text-left space-y-4">
<p class="text-gray-700 text-center">Untuk membuat jadwal kunjungan, silahkan isi form berikut!</p>
<div>
<label for="tanggal_kunjungan" class="block text-sm font-medium text-gray-700 mb-1" style="text-align: start;">Tanggal Kunjungan <span class="text-danger">*</span></label>
<input type="date" id="tanggal_kunjungan" class="input" style="margin-top: 10px; width: 100%;" required>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1 mt-2" style="text-align: start;">Waktu Kunjungan (Format 24 Jam) <span class="text-danger">*</span></label>
<div style="display: flex; align-items: center; gap: 10px; margin-top: 10px;">
<div style="position: relative; flex: 1;">
<input type="text" id="jam_kunjungan" class="input" maxlength="2" style="width: 100%; text-align: center; padding-right: 30px;" placeholder="00">
<div style="position: absolute; right: 5px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column;">
<button type="button" id="jam_up" class="btn btn-xs btn-light" style="height: 12px; padding: 0 4px; font-size: 10px; margin-bottom: 2px;">▲</button>
<button type="button" id="jam_down" class="btn btn-xs btn-light" style="height: 12px; padding: 0 4px; font-size: 10px;">▼</button>
</div>
</div>
<span style="font-weight: bold;">:</span>
<div style="position: relative; flex: 1;">
<input type="text" id="menit_kunjungan" class="input" maxlength="2" style="width: 100%; text-align: center; padding-right: 30px;" placeholder="00">
<div style="position: absolute; right: 5px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column;">
<button type="button" id="menit_up" class="btn btn-xs btn-light" style="height: 12px; padding: 0 4px; font-size: 10px; margin-bottom: 2px;">▲</button>
<button type="button" id="menit_down" class="btn btn-xs btn-light" style="height: 12px; padding: 0 4px; font-size: 10px;">▼</button>
</div>
</div>
</div>
</div>
<div>
<label for="deskripsi-penilaian" class="block text-sm font-medium text-gray-700 mb-1 mt-2" style="text-align: start;">Keterangan <span class="text-danger">*</span> </label>
<textarea id="deskripsi-penilaian" class="textarea" placeholder="Masukkan keterangan" style="margin-top: 10px;" required></textarea>
</div>
</div>
`,
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Submit',
cancelButtonText: 'Batal',
didOpen: () => {
// Set default value ke waktu saat ini
const now = new Date();
const dateString = now.toISOString().slice(0, 10);
const hours = now.getHours();
const minutes = now.getMinutes();
// Set default values
document.getElementById('tanggal_kunjungan').value = dateString;
document.getElementById('jam_kunjungan').value = hours.toString().padStart(2, '0');
document.getElementById('menit_kunjungan').value = minutes.toString().padStart(2, '0');
// Handler untuk input jam
const jamInput = document.getElementById('jam_kunjungan');
const jamUp = document.getElementById('jam_up');
const jamDown = document.getElementById('jam_down');
// Validasi hanya angka untuk jam
jamInput.addEventListener('input', function(e) {
this.value = this.value.replace(/[^0-9]/g, '').substring(0, 2);
let value = parseInt(this.value, 10);
if (!isNaN(value)) {
if (value > 23) {
this.value = "00";
} else {
this.value = value.toString().padStart(2, '0');
}
}
});
jamInput.addEventListener('blur', function() {
if (this.value === "" || isNaN(parseInt(this.value, 10))) {
this.value = "00";
} else {
this.value = parseInt(this.value, 10).toString().padStart(2, '0');
}
});
// Button handlers untuk jam
jamUp.addEventListener('click', function() {
let value = parseInt(jamInput.value, 10);
if (isNaN(value)) value = 0;
value = (value + 1) % 24;
jamInput.value = value.toString().padStart(2, '0');
});
jamDown.addEventListener('click', function() {
let value = parseInt(jamInput.value, 10);
if (isNaN(value)) value = 0;
value = (value - 1 + 24) % 24;
jamInput.value = value.toString().padStart(2, '0');
});
// Handler untuk input menit
const menitInput = document.getElementById('menit_kunjungan');
const menitUp = document.getElementById('menit_up');
const menitDown = document.getElementById('menit_down');
// Validasi hanya angka untuk menit
menitInput.addEventListener('input', function(e) {
this.value = this.value.replace(/[^0-9]/g, '').substring(0, 2);
let value = parseInt(this.value, 10);
if (!isNaN(value)) {
if (value > 59) {
this.value = "00";
} else {
this.value = value.toString().padStart(2, '0');
}
}
});
menitInput.addEventListener('blur', function() {
if (this.value === "" || isNaN(parseInt(this.value, 10))) {
this.value = "00";
} else {
this.value = parseInt(this.value, 10).toString().padStart(2, '0');
}
});
// Button handlers untuk menit
menitUp.addEventListener('click', function() {
let value = parseInt(menitInput.value, 10);
if (isNaN(value)) value = 0;
value = (value + 1) % 60;
menitInput.value = value.toString().padStart(2, '0');
});
menitDown.addEventListener('click', function() {
let value = parseInt(menitInput.value, 10);
if (isNaN(value)) value = 0;
value = (value - 1 + 60) % 60;
menitInput.value = value.toString().padStart(2, '0');
});
},
preConfirm: () => {
// Ambil nilai input
const tanggalKunjungan = document.getElementById('tanggal_kunjungan').value;
let jamKunjungan = document.getElementById('jam_kunjungan').value;
let menitKunjungan = document.getElementById('menit_kunjungan').value;
const keteranganInspeksi = document.getElementById('deskripsi-penilaian').value;
// Validasi input: cek apakah input kosong
if (!tanggalKunjungan.trim()) {
Swal.showValidationMessage('Harap mengisi Tanggal Kunjungan.');
return false;
}
if (!jamKunjungan || !menitKunjungan) {
Swal.showValidationMessage('Harap mengisi Waktu Kunjungan.');
return false;
}
if (!keteranganInspeksi.trim()) {
Swal.showValidationMessage('Harap mengisi Keterangan.');
return false;
}
// Pastikan format 2 digit
jamKunjungan = parseInt(jamKunjungan, 10).toString().padStart(2, '0');
menitKunjungan = parseInt(menitKunjungan, 10).toString().padStart(2, '0');
// Gabungkan tanggal dan waktu dalam format ISO
const datetimeValue = `${tanggalKunjungan}T${jamKunjungan}:${menitKunjungan}`;
// Jika semua valid, kembalikan data
return {
tanggal: datetimeValue,
keterangan: keteranganInspeksi
};
}
}).then((result) => {
if (result.isConfirmed) {
const {
tanggal,
keterangan
} = result.value;
let token = "{{ csrf_token() }}";
let useURL = "/surveyor/store-jadwal/" + permohonanId;
let input_data = {
_token: token,
id: permohonanId,
waktu_penilaian: tanggal,
deskripsi_penilaian: keterangan
};
$.ajax({
url: useURL,
type: "POST",
cache: false,
data: input_data,
success: function(response) {
if (response.success) {
Swal.fire('Berhasil!', 'Berhasil membuat jadwal.', 'success').then(
() => {
window.location.reload();
});
} else {
Swal.fire('Error!', response.message, 'error');
}
},
error: function(response) {
const errorMessage = response.responseJSON?.message ||
'Terjadi kesalahan saat memproses data.';
Swal.fire('Error!', errorMessage, 'error');
}
});
}
});
}
</script> </script>
<script type="module"> <script type="module">
@@ -410,12 +578,10 @@
render: (item, data) => { render: (item, data) => {
let tooltip = ''; let tooltip = '';
if (data.status === 'revisi-laporan') { if (data.status === 'revisi-laporan' || data.status === 'revisi-survey') {
tooltip = data.keterangan || ''; tooltip = data.keterangan || '';
} else if (data.status === 'reschedule') { } else if (data.status === 'reschedule') {
tooltip = data.penilaian?.reschedule_note || ''; tooltip = data.penilaian?.reschedule_note || '';
} else {
tooltip = '';
} }
return ` return `
@@ -444,8 +610,7 @@
(data.penilaian.waktu_penilaian && data.penilaian.authorized_status == null)) { (data.penilaian.waktu_penilaian && data.penilaian.authorized_status == null)) {
actionHtml += ` actionHtml += `
<a class="btn btn-sm btn-icon btn-clear btn-primary" <a class="btn btn-sm btn-icon btn-clear btn-primary"
data-modal-toggle="#modal_jadwal" onclick="prosesJadwalSurvey(${data.penilaian.id})"
onclick="jadwal(${data.penilaian.id})"
title="Buat Jadwal Kunjungan"> title="Buat Jadwal Kunjungan">
<i class="ki-filled ki-calendar-edit"></i> <i class="ki-filled ki-calendar-edit"></i>
</a> </a>

View File

@@ -3,19 +3,7 @@
const ruteLainnyaDiv = document.getElementById("ruteLainnya"); const ruteLainnyaDiv = document.getElementById("ruteLainnya");
const lantaiLainnyaDiv = document.getElementById("lantaiLainnya"); const lantaiLainnyaDiv = document.getElementById("lantaiLainnya");
// Function to add delete event listeners to existing buttons
function addDeleteListeners(container) {
container.querySelectorAll(".delete-btn").forEach(button => {
button.addEventListener("click", function() {
this.closest(
".flex.items-baseline.flex-wrap.lg\\:flex-nowrap.gap-2\\.5.mb-5")
.remove();
});
});
}
// Add delete listeners to existing buttons
addDeleteListeners(ruteLainnyaDiv);
// Create new div for additional items // Create new div for additional items
function createNewDiv(container, inputName) { function createNewDiv(container, inputName) {
@@ -64,13 +52,8 @@
} }
// Event listener for adding more items // Event listener for adding more items
document.getElementById("btnAddMore").addEventListener("click", function() {
createNewDiv(ruteLainnyaDiv, "rute_lainnya");
});
document.getElementById("btnAddMoreObject").addEventListener("click", function() {
createNewDiv(lantaiLainnyaDiv, "lantai_lainnya");
});
function setupInputHandlers(containerId, buttonId, labelText, inputDataClass, buttonDeleteClass) { function setupInputHandlers(containerId, buttonId, labelText, inputDataClass, buttonDeleteClass) {
const addButton = document.getElementById(buttonId); const addButton = document.getElementById(buttonId);

View File

@@ -600,7 +600,7 @@
Breadcrumbs::for('penilai.show', function (BreadcrumbTrail $trail) { Breadcrumbs::for('penilai.show', function (BreadcrumbTrail $trail) {
$trail->parent('penilai'); $trail->parent('penilai');
$trail->push('Detail Penilai'); $trail->push('Detail Penilaian');
}); });
Breadcrumbs::for('penilai.edit', function (BreadcrumbTrail $trail) { Breadcrumbs::for('penilai.edit', function (BreadcrumbTrail $trail) {

View File

@@ -552,7 +552,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('{id}/show', [SurveyorController::class, 'show'])->name('show'); Route::get('{id}/show', [SurveyorController::class, 'show'])->name('show');
Route::post('store', [SurveyorController::class, 'store'])->name('store'); Route::post('store', [SurveyorController::class, 'store'])->name('store');
Route::post('storeDenah', [SurveyorController::class, 'storeDenah'])->name('storeDenah'); Route::post('storeDenah', [SurveyorController::class, 'storeDenah'])->name('storeDenah');
Route::put('storeJadwal', [SurveyorController::class, 'storeJadwal'])->name('storeJadwal'); Route::post('store-jadwal/{id}', [SurveyorController::class, 'storeJadwal'])->name('storeJadwal');
Route::post('storeFreeze/{id}', [SurveyorController::class, 'storeFreeze'])->name('storeFreeze'); Route::post('storeFreeze/{id}', [SurveyorController::class, 'storeFreeze'])->name('storeFreeze');
Route::post('storeFoto', [SurveyorController::class, 'storeFoto'])->name('storeFoto'); Route::post('storeFoto', [SurveyorController::class, 'storeFoto'])->name('storeFoto');
@@ -583,6 +583,7 @@ Route::middleware(['auth'])->group(function () {
Route::put('store-approve-reschedule/{id}', [SurveyorController::class, 'approveReschedule'])->name('approveReschedule'); Route::put('store-approve-reschedule/{id}', [SurveyorController::class, 'approveReschedule'])->name('approveReschedule');
Route::put('store-rejected-reschedule/{id}', [SurveyorController::class, 'rejectReschedule'])->name('rejectReschedule'); Route::put('store-rejected-reschedule/{id}', [SurveyorController::class, 'rejectReschedule'])->name('rejectReschedule');
Route::put('store-proses-survey/{id}', [SurveyorController::class, 'storeProsesSurvey'])->name('storeProsesSurvey'); Route::put('store-proses-survey/{id}', [SurveyorController::class, 'storeProsesSurvey'])->name('storeProsesSurvey');
Route::post('save-edited-image/', [SurveyorController::class, 'saveEditedImage'])->name('saveEditedImage');
}); });
@@ -616,6 +617,7 @@ Route::middleware(['auth'])->group(function () {
Route::post('storeMemo', [PenilaiController::class, 'storeMemo'])->name('storeMemo'); Route::post('storeMemo', [PenilaiController::class, 'storeMemo'])->name('storeMemo');
Route::post('storeRap', [PenilaiController::class, 'storeRap'])->name('storeRap'); Route::post('storeRap', [PenilaiController::class, 'storeRap'])->name('storeRap');
Route::post('storeLpjSederhanadanStandard', [PenilaiController::class, 'storeLpjSederhanadanStandard'])->name('storeLpjSederhanadanStandard'); Route::post('storeLpjSederhanadanStandard', [PenilaiController::class, 'storeLpjSederhanadanStandard'])->name('storeLpjSederhanadanStandard');
Route::put('revisi-surveyor/{id}', [PenilaiController::class, 'revisiSurveyor'])->name('revisiSurveyor');
}); });