diff --git a/app/Exports/BasicDataSurveyorExport.php b/app/Exports/BasicDataSurveyorExport.php new file mode 100644 index 0000000..3137429 --- /dev/null +++ b/app/Exports/BasicDataSurveyorExport.php @@ -0,0 +1,58 @@ +model = $model; + } + + public function collection() + { + return $this->model::all(); + } + + public function map($row) + : array + { + return [ + $row->id, + $row->code, + $row->name, + $row->created_at + ]; + } + + public function headings() + : array + { + return [ + 'ID', + 'Code', + 'Name', + 'Created At' + ]; + } + + public function columnFormats() + : array + { + return [ + 'A' => NumberFormat::FORMAT_NUMBER, + 'D' => NumberFormat::FORMAT_DATE_DATETIME + ]; + } + } diff --git a/app/Exports/KertasKerjaExport.php b/app/Exports/KertasKerjaExport.php new file mode 100644 index 0000000..c931d47 --- /dev/null +++ b/app/Exports/KertasKerjaExport.php @@ -0,0 +1,74 @@ +data = $data; + } + + public function collection() + { + return collect([ + [ + 'Pendekatan pasar', + 'Nama Pemilik Aset', + '', + ], + [ + 'Metode Perbandingan Data Pasar', + 'Nama Pemberi Tugas: ', + '', + '', + ], + [ + 'Tanggal Penilaian: ', + 'Lokasi: ', + '', + '', + ], + [ + 'No.', + 'Objek Penilaian', + 'Data Pembanding 1', + 'Data Pembanding 2', + 'Data Pembanding 3' + ], + ]); + } + + // Tambahkan method map() + public function map($row): array + { + return $row; + + } + + public function headings(): array + { + return []; + } + + public function columnFormats(): array + { + return [ + 'A' => NumberFormat::FORMAT_NUMBER, + 'C' => NumberFormat::FORMAT_NUMBER, + 'D' => NumberFormat::FORMAT_NUMBER, + 'F' => NumberFormat::FORMAT_NUMBER, + 'G' => NumberFormat::FORMAT_NUMBER, + 'P' => NumberFormat::FORMAT_DATE_DATETIME, + 'Q' => NumberFormat::FORMAT_DATE_DATETIME + ]; + } +} diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index ed09be5..c42bd71 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -5,6 +5,7 @@ use Modules\Lpj\Models\HolidayCalendar; use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Models\PenawaranTender; + use Modules\Lpj\Models\Penilaian; function formatTanggalIndonesia($date, $time = false) { @@ -118,22 +119,33 @@ $noUrutAkhirString = sprintf("%04s", 1); if($penawaran) { - $code_penawaran_last = substr ($maxCode, -4); - $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; - $year_now = Carbon::now()->year; - if ($year_now == $year_penawaran_last) { - $noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1)); + $isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric + $isNP = substr($maxCode, 0, 2); + if((8 == strlen($maxCode)) && ("NP"==$isNP) && (isNumeric($isNum))) + { + $code_penawaran_last = substr ($maxCode, -4); + $year_penawaran_last = Carbon::parse($penawaran->created_at)->year; + $year_now = Carbon::now()->year; + if ($year_now == $year_penawaran_last) { + $noUrutAkhirString = sprintf("%04s", abs($code_penawaran_last + 1)); + } + // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 0001 } - // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 0001 + } return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString; } - // generate last penawaran.no_spk + function isNumeric($str) + { + return ctype_digit($str); + } + + // generate last penawaran.no_spk function onLastnumberCodePenawaranSPK($jenis_laporan_code): string { - + // 20241124_001 ==> spk_no_core // XXX / PJ / JKT / MONTH-ROM / FR|SR / 2024 // 001 / PJ / JKT / XI / FR / 2024 @@ -148,18 +160,18 @@ { $no_spk_penawaran_last = substr ($maxCode, -3); $year_penawaran_last = substr ($maxCode, 0, 4); - + if($year_now == $year_penawaran_last) { - $noUrutAkhirString = sprintf("%03s", abs($no_spk_penawaran_last + 1)); + $noUrutAkhirString = sprintf("%03s", abs($no_spk_penawaran_last + 1)); } // jika ternyata tahun tdk sama (kurang dari tahun sekarang), maka nomor di set 001 } - + $month = onRomawi(Carbon::now()->month); - + $lastSPK = $noUrutAkhirString.' / PJ / JKT / '. $month .' / ' .$jenis_laporan_code.' / '.$year_now; - return $lastSPK; + return $lastSPK; } function onRomawi(int $bln): string @@ -203,7 +215,7 @@ break; } - + } function penyebut($nilai) { @@ -230,16 +242,16 @@ $temp = penyebut($nilai/1000000000) . " milyar" . penyebut(fmod($nilai,1000000000)); } else if ($nilai < 1000000000000000) { $temp = penyebut($nilai/1000000000000) . " trilyun" . penyebut(fmod($nilai,1000000000000)); - } + } return $temp; } - + function terbilang($nilai) { if($nilai<0) { $hasil = "minus ". trim(penyebut($nilai)); } else { $hasil = trim(penyebut($nilai)); - } + } return $hasil; } // andy add @@ -272,3 +284,10 @@ }, )->toArray(); } + + function countPermohonanForUser($userId) + { + return Penilaian::whereHas('userPenilai', function ($query) use ($userId) { + $query->where('user_id', $userId); + })->count(); + } diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index bfb447f..f1d79d8 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -33,48 +33,33 @@ class ActivityController extends Controller public function progres_activity() { - // Ambil user yang sedang login - $user = auth()->user(); - $roles = $user->load('roles'); + // Ambil user yang sedang login dengan roles + $user = auth()->user()->load('roles'); - // Inisialisasi regionId dan teamId sebagai null agar bisa dinamis - $regionId = null; - $teamId = null; + // Inisialisasi regionId dan teamId + $regionId = $teamId = null; - if ($roles->roles->pluck('name')->contains('senior-officer')) { - $userTeam = TeamsUsers::with('team') - ->where('user_id', $user->id) - ->first(); + if ($user->roles->pluck('name')->contains('senior-officer')) { + $userTeam = TeamsUsers::with('team')->firstWhere('user_id', $user->id); $regionId = $userTeam?->team->regions_id; $teamId = $userTeam?->teams_id; - } $teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions', 'user.roles']) ->whereHas('team', function ($q) use ($regionId, $teamId) { - if ($regionId) { - $q->where('regions_id', $regionId); - } - if ($teamId) { - $q->where('id', $teamId); // Hanya tim yang sama - } + $q->when($regionId, fn($q) => $q->where('regions_id', $regionId)) + ->when($teamId, fn($q) => $q->where('id', $teamId)); }) ->where('user_id', '!=', $user->id) - ->whereHas('user.roles', function ($query) { - // Filter hanya peran 'surveyor' atau 'surveyor-penilai' - $query->whereIn('name', ['surveyor', 'surveyor-penilai']); - }) + ->whereHas('user.roles', fn($q) => $q->whereIn('name', ['surveyor', 'surveyor-penilai'])) ->get(); - - - return view('lpj::activity.progres_activity.index', compact('teamsActivity')); } function updateTeamAssingment(Request $request) { - + try { $id = $request->input('id'); $user = PenilaianTeam::where('penilaian_id', $id)->get(); @@ -86,7 +71,7 @@ class ActivityController extends Controller } return redirect()->route('activity.progres.index')->with('success', 'Surveyor berhasil diganti'); } - + } catch (\Throwable $th) { return redirect()->route('activity.progres.index')->with('success', $th->getMessage()); } diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index 357d984..968d631 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -6,7 +6,9 @@ use Illuminate\Http\Request; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Inspeksi; use App\Http\Controllers\Controller; - +use Illuminate\Support\Facades\Auth; +use Maatwebsite\Excel\Facades\Excel; +use Modules\Lpj\Exports\KertasKerjaExport; class PenilaiController extends Controller { public $user; @@ -22,7 +24,8 @@ class PenilaiController extends Controller /** * Show the form for creating a new resource. */ - public function lampiran($id){ + public function lampiran($id) + { $permohonan = Permohonan::with('debiture.documents')->find($id); $jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id; @@ -36,7 +39,7 @@ class PenilaiController extends Controller return view('lpj::penilai.lampiran', compact('permohonan', 'formFoto')); - } + } public function create() { @@ -93,21 +96,26 @@ class PenilaiController extends Controller } // Retrieve data from the database - $query = Permohonan::query()->where('status', '=', 'done'); + $query = Permohonan::query(); // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); - $query->where(function ($q) use ($search) { - $q->where('nomor_registrasi', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('jenisfasilitasKredit', 'name', 'LIKE', '%' . $search . '%'); + $columns = ['nomor_registrasi', 'debiture.name', 'branch.name', 'user.name', 'tujuanPenilaian.name', 'jenisfasilitasKredit.name']; + + $query->where(function ($q) use ($search, $columns) { + foreach ($columns as $column) { + $q->orWhereRelation(explode('.', $column)[0], explode('.', $column)[1], 'LIKE', '%' . $search . '%'); + } }); } + // Apply whereHas to check penilai_id, role, and user_id specifically for 'penilai' role + $query->whereHas('penilaian.userPenilai', function ($q) { + $q->where('role', 'penilai') // Ensure the role is 'penilai' + ->where('user_id', 12); // Ganti dengan Auth::user()->id jika dinamis + }); + // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); @@ -122,7 +130,7 @@ class PenilaiController extends Controller if ($request->has('page') && $request->has('size')) { $page = $request->get('page'); $size = $request->get('size'); - $offset = ($page - 1) * $size; // Calculate the offset + $offset = ($page - 1) * $size; $query->skip($offset)->take($size); } @@ -131,13 +139,20 @@ class PenilaiController extends Controller $filteredRecords = $query->count(); // Get the data for the current page - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisfasilitasKredit'])->get(); + $data = $query->with([ + 'user', + 'debiture', + 'branch', + 'tujuanPenilaian', + 'jenisfasilitasKredit', + 'penilaian.userPenilai' // Ensure this relation is included + ])->get(); // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); // Calculate the current page number - $currentPage = 0 + 1; + $currentPage = $request->get('page', 1); // Return the response data as a JSON object return response()->json([ @@ -150,4 +165,134 @@ class PenilaiController extends Controller 'data' => $data, ]); } + + public function kertas_kerja() + { + $data = [ + [ + 'Pendekatan pasar', + 'Nama Pemilik Aset', + '', + ], + [ + 'Metode Perbandingan Data Pasar', + 'Nama Pemberi Tugas: ', + '', + '', + ], + [ + 'Tanggal Penilaian: ', + 'Lokasi: ', + '', + '', + ], + [ + 'No.', + 'Objek Penilaian', + 'Data Pembanding 1', + 'Data Pembanding 2', + 'Data Pembanding 3' + ],[ + '1', + 'Jenis Aset', + 'Pembanding 1', + 'Pembanding 1', + 'Pembanding 1' + ], + [ + '2', + 'Luas Tanah', + 'Pembanding 2', + 'Pembanding 2', + 'Pembanding 2' + ], + [ + '3', + 'Penawaran/Transaksi', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '4', + 'Harga penawaran/Transaksi', + '', + 'Pembanding 3', + 'Pembanding 3' + ],[ + '5', + 'Nomor Telepon', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '6', + 'Estimasi Harga Transaksi', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '7', + 'Nama Nara sumber', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '8', + 'Status Nara sumber', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '9', + 'Waktu Penawaran/Transaksi', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '10', + 'Titik GPS', + '', + 'Pembanding 3', + ], + [ + '11', + 'Alamat', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '12', + 'Jarak Pembanding dengan Objek (m)', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '13', + 'Estimasi Rangking Tanah', + '', + 'Pembanding 3', + 'Pembanding 3' + ], + [ + '14', + 'Estimasi Rangking Bangunan', + '', + 'Pembanding 3', + 'Pembanding 3' + ] + + ]; + return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx'); + } + + + } diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php index e0ebfa8..0d4c94a 100644 --- a/app/Http/Controllers/PenilaianController.php +++ b/app/Http/Controllers/PenilaianController.php @@ -298,10 +298,15 @@ class PenilaianController extends Controller $q->orWhere('status', 'LIKE', '%' . $search . '%'); }); } + $query->whereIn('status', ['registered', 'registrasi-final']); - $query->whereHas('region.teams.teamsUsers.user', function ($q) { - $q->where('id', Auth::user()->id); - }); + + // Filter berdasarkan role + if (Auth::user()->roles[0]->name !== 'administrator') { + $query->whereHas('region.teams.teamsUsers.user', function ($q) { + $q->where('id', Auth::user()->id); + }); + } if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); diff --git a/app/Http/Controllers/SpkController.php b/app/Http/Controllers/SpkController.php index 35faa19..9074567 100644 --- a/app/Http/Controllers/SpkController.php +++ b/app/Http/Controllers/SpkController.php @@ -84,7 +84,7 @@ use Illuminate\Support\Facades\Auth; if ($obj->tanggal_permohonan) { $data[$i]->tanggal_permohonan = Carbon::parse($obj->tanggal_permohonan)->format('d M Y'); } - + if($obj->penawaran->tanggal_penilaian_sebelumnya) { $data[$i]->penawaran->tanggal_penilaian_sebelumnya = Carbon::parse($obj->penawaran->tanggal_penilaian_sebelumnya)->format('d F Y H:i:s'); @@ -146,7 +146,7 @@ use Illuminate\Support\Facades\Auth; } public function edit($id) - { + { // dd(Carbon::now()->addDays(1)->format('d F Y')); // dd(Carbon::now()->subDays(1)->format('d F Y')); jenis_laporan_name $penawaran = PenawaranTender::leftJoin('detail_penawaran', 'detail_penawaran.penawaran_id','=','penawaran.id') @@ -178,7 +178,7 @@ use Illuminate\Support\Facades\Auth; if($penawaran->detail_penawaran_tgl_proposal) $penawaran->detail_penawaran_tgl_proposal = Carbon::parse($penawaran->detail_penawaran_tgl_proposal)->format('d F Y'); - + // generate no spk $spk_no_last=$penawaran->spk_no; if(!$spk_no_last) @@ -196,7 +196,7 @@ use Illuminate\Support\Facades\Auth; } // pengecekan perubahan jenis report // generate no spk - + // Jangka Waktu // date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final) $jangka_waktu=''; @@ -207,17 +207,17 @@ use Illuminate\Support\Facades\Auth; $persetujuan_sla_final = '...'; if(null !==$penawaran->persetujuan) { - $sla_resume_text = hitungHariKerja($penawaran->persetujuan->created_at,$penawaran->persetujuan->sla_resume); - $sla_final_text = hitungHariKerja($penawaran->persetujuan->created_at,$penawaran->persetujuan->sla_final); + $sla_resume_text = $penawaran->persetujuan->sla_resume; + $sla_final_text = $penawaran->persetujuan->sla_final; $sla_resume_text_terbilang = ucfirst(terbilang($sla_resume_text)); $sla_final_text_terbilang = ucfirst(terbilang($sla_final_text)); - + $persetujuan_no_proposal = $penawaran->persetujuan->nomor_proposal_penawaran; $persetujuan_tgl_proposal = Carbon::parse($penawaran->persetujuan->tanggal_proposal_penawaran)->format('d F Y'); $persetujuan_sla_resume = $sla_resume_text.' ('.$sla_resume_text_terbilang.')'; $persetujuan_sla_final = $sla_final_text.' ('.$sla_final_text_terbilang.')'; - + if($penawaran->penilaian_waktu_penilain) { $jangka_waktu_date_start=Carbon::parse($penawaran->penilaian_waktu_penilain)->addDays(1)->format('d F Y'); @@ -226,10 +226,10 @@ use Illuminate\Support\Facades\Auth; // date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final) $jangka_waktu=$jangka_waktu_date_start.' - '.$jangka_waktu_date_end; // Jangka Waktu - - } + + } } - + return view('lpj::spk.edit', compact('data', 'penawaran', 'persetujuan_no_proposal', 'persetujuan_tgl_proposal', 'persetujuan_sla_resume', 'persetujuan_sla_final', 'jangka_waktu')); } @@ -264,7 +264,7 @@ use Illuminate\Support\Facades\Auth; ->select('permohonan.*', 'jenis_jaminan.name as jenis_jaminan_name'); $data = $permohonan->with(['user', 'debiture', 'branch', 'tujuanPenilaian','dokumenjaminan'])->first(); - + // Jangka Waktu // date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final) $jangka_waktu=''; @@ -282,7 +282,7 @@ use Illuminate\Support\Facades\Auth; // $dataPermohonan=['dokumen' => $newFileNameWithPath]; // $data->update($dataPermohonan); // update table permohonan - + // update table penawaran $dataPenawaran['spk_dokumen_path'] = $newFileNameWithPath; // $spk_no_last=$penawaran->spk_no; @@ -296,7 +296,7 @@ use Illuminate\Support\Facades\Auth; $dataPenawaran['spk_no_core'] = $date_now.'_'.$spk_number; $penawaran->spk_no = $spk_no_last; - + } // pengecekan perubahan jenis report @@ -314,7 +314,7 @@ use Illuminate\Support\Facades\Auth; $penawaranM = PenawaranTender::find($penawaran->id); $penawaranM->update($dataPenawaran); // update table penawaran - + // pdf path $spkpenawaran_path = Storage::url($newFileNameWithPath); @@ -324,12 +324,12 @@ use Illuminate\Support\Facades\Auth; $persetujuan_sla_final = '...'; if(null !==$penawaran->persetujuan) { - $sla_resume_text = hitungHariKerja($penawaran->persetujuan->created_at,$penawaran->persetujuan->sla_resume); - $sla_final_text = hitungHariKerja($penawaran->persetujuan->created_at,$penawaran->persetujuan->sla_final); + $sla_resume_text = $penawaran->persetujuan->sla_resume; + $sla_final_text = $penawaran->persetujuan->sla_final; $sla_resume_text_terbilang = ucfirst(terbilang($sla_resume_text)); $sla_final_text_terbilang = ucfirst(terbilang($sla_final_text)); - + $persetujuan_no_proposal = $penawaran->persetujuan->nomor_proposal_penawaran; $persetujuan_tgl_proposal = Carbon::parse($penawaran->persetujuan->tanggal_proposal_penawaran)->format('d F Y'); $persetujuan_sla_resume = $sla_resume_text.' ('.$sla_resume_text_terbilang.')'; @@ -343,9 +343,9 @@ use Illuminate\Support\Facades\Auth; // date_start (penilaian.waktu_penilain + 1 day) - date_end (persetujuan_penawaran.sla_final) $jangka_waktu=$jangka_waktu_date_start.' - '.$jangka_waktu_date_end; // Jangka Waktu - - } - + + } + } @@ -392,7 +392,7 @@ use Illuminate\Support\Facades\Auth; // dokumen pdf diambil dari penawaran.spk_dokumen_path $permohonan = Permohonan::find($id); $document = PenawaranTender::where('nomor_registrasi','=',$permohonan->nomor_registrasi)->first(); - + return response()->download(storage_path('app/public/' .$document->spk_dokumen_path)); } } diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index 6b48f91..3142aa8 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -5,8 +5,12 @@ namespace Modules\Lpj\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; +use Maatwebsite\Excel\Facades\Excel; +use Modules\Lpj\Exports\BasicDataSurveyorExport; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Storage; use Illuminate\Http\Response; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Branch; @@ -18,6 +22,7 @@ use Modules\Lpj\Models\PosisiKavling; use Modules\Lpj\Models\KondisiFisikTanah; use Modules\Lpj\Models\KetinggianTanah; use Modules\Lpj\Models\SifatBangunan; +use Modules\Lpj\Models\JenisJaminan; use Modules\Lpj\Models\JenisBangunan; use Modules\Lpj\Models\KondisiBangunan; use Modules\Lpj\Models\SpekBangunan; @@ -53,7 +58,7 @@ use Modules\Lpj\Models\DetailDokumenJaminan; use Modules\Lpj\Models\JenisKapal; use Modules\Lpj\Models\JenisKendaraan; use Modules\Lpj\Models\RuteJaminan; -use Modules\Lpj\Models\JenisJaminan; + use Modules\Lpj\Models\HubunganPemilikJaminan; use Modules\Lpj\Models\HubunganPenghuniJaminan; use Modules\Lpj\Models\AnalisaUnit; @@ -92,124 +97,78 @@ class SurveyorController extends Controller 'branch', 'tujuanPenilaian', 'penilaian', - 'documents', + 'documents.jenisJaminan', ])->findOrFail($id); $surveyor = $id; $branches = Branch::all(); $provinces = Province::all(); $bentukTanah = BentukTanah::all(); - $konturTanah = KonturTanah::all(); - $posisiKavling = PosisiKavling::all(); - $ketinggianTanah = KetinggianTanah::all(); - $kondisiFisikTanah = KondisiFisikTanah::all(); - $jenisBangunan = JenisBangunan::all(); - $kondisiBangunan = KondisiBangunan::all(); - $sifatBangunan = SifatBangunan::all(); - $spekKategoriBagunan = SpekKategoritBangunan::all(); - $spekBangunan = SpekBangunan::all(); - $saranaPelengkap = SaranaPelengkap::all(); - $arahMataAngin = ArahMataAngin::all(); - $jenisKendaraan = JenisKendaraan::all(); - $jenisKapal = JenisKapal::all(); - $jenisPesawat = JenisPesawat::all(); - $modelAlatBerat = ModelAlatBerat::all(); - - - $denah = Denah::where('permohonan_id', $id)->get(); - $fotojaminan = FotoJaminan::where('permohonan_id', $id)->get(); - $analisa = Analisa::with('analisaUnit', 'analisaTanahBangunan', 'analisaLingkungan', 'analisaFakta', 'jenisJaminan') - ->where('permohonan_id', $id) - ->get(); - - - - $jenisJaminanIds = $permohonan->debiture->documents->pluck('jenisJaminan.id')->toArray(); // Convert to array - - $jaminanId = $jenisJaminanIds[0]; - $inpeksi = Inspeksi::where('permohonan_id', $id) - ->whereIn('jenis_jaminan_id', $jenisJaminanIds) - ->first(); - - if ($inpeksi) { - $forminspeksi = json_decode($inpeksi->data_form, true); - $formFoto = json_decode($inpeksi->foto_form, true); - $formDenah = json_decode($inpeksi->denah_form, true); - } else { - $forminspeksi = null; - $formFoto = null; - $formDenah = null; - } + // Get all inspeksi data for this permohonan + $inspeksiData = Inspeksi::where('permohonan_id', $id) + ->get() + ->keyBy('jenis_jaminan_id') + ->map(function ($item) { + return [ + 'data_form' => json_decode($item->data_form, true), + 'foto_form' => json_decode($item->foto_form, true), + 'denah_form' => json_decode($item->denah_form, true), + 'data_pembanding' => json_decode($item->data_pembanding, true), + ]; + }); return view('lpj::surveyor.detail', compact( - 'denah', - 'analisa', 'permohonan', 'surveyor', 'branches', 'provinces', 'bentukTanah', - 'konturTanah', - 'posisiKavling', - 'kondisiFisikTanah', - 'ketinggianTanah', - 'kondisiBangunan', - 'jenisBangunan', - 'sifatBangunan', - 'spekKategoriBagunan', - 'spekBangunan', - 'saranaPelengkap', - 'arahMataAngin', - 'forminspeksi', - 'formDenah', - 'formFoto', - 'jaminanId', - 'jenisKendaraan', - 'jenisKapal', - 'jenisPesawat', - 'modelAlatBerat' + 'inspeksiData' )); } + /** * Store form inspeksi. */ public function store(FormSurveyorRequest $request) { - $data = $request->validated(); - - - - if (!$data) { - return response()->json(['success' => false, 'message' => 'Invalid data'], 400); - } - try { - DB::beginTransaction(); + // Validate request data + $validatedData = $request->validated(); - $action = $request->input('type'); - $rules = $this->getActionSpecificRules($data, $action, $request); + // Get action specific rules and process data + $processedData = $this->getActionSpecificRules( + $validatedData, + $request->input('type'), + $request + ); - $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first(); - - if (!$inspeksi) { - Inspeksi::create([ + // Find or create inspeksi record + $inspeksi = Inspeksi::updateOrCreate( + [ 'permohonan_id' => $request->input('permohonan_id'), - 'data_form' => json_encode($rules), - 'name' => $request->input('type'), - 'jenis_jaminan_id' => $request->input('jenis_jaminan_id'), - ]); - } else { - $inspeksi->update(['data_form' => json_encode($rules)]); - } + 'jenis_jaminan_id' => $request->input('jenis_jaminan_id') + ], + [ + 'data_form' => json_encode($processedData), + 'name' => $request->input('type') + ] + ); - DB::commit(); + return response()->json([ + 'success' => true, + 'message' => 'Data berhasil disimpan', + 'data' => $processedData + ], 200); - return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => $data], 200); - } catch (Exception $e) { - DB::rollBack(); - return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal menyimpan data', + 'error' => $e->getMessage() + ], 500); } } @@ -284,8 +243,11 @@ class SurveyorController extends Controller ]); } - return response()->json(['success' => true, 'message' => 'Data berhasil disimpan', - 'data' => $formatJsonDenah], 200); + return response()->json([ + 'success' => true, + 'message' => 'Data berhasil disimpan', + 'data' => $formatJsonDenah + ], 200); } catch (Exception $e) { return response()->json(['success' => false, 'message' => 'Data gagal disimpan: ' . $e->getMessage()], 500); } @@ -294,10 +256,131 @@ class SurveyorController extends Controller public function storeFoto(Request $request) { - $validatedData = $request->validate([ + $validatedData = $this->validateFotoRequest($request); + try { + + $photoCategories = [ + 'rute_menuju_lokasi' => ['foto_rute', 'name_rute'], + 'object_jaminan' => ['foto_objek', 'name_objek', 'deskripsi_objek'], + 'lingkungan' => ['foto_lingkungan', 'name_lingkungan'], + 'foto_lantai_unit' => ['foto_lantai_unit', 'name_lantai_unit'], + 'foto_lantai_lainnya' => ['foto_lantai_lainnya', 'name_lantai_lainnya'], + 'foto_rute_lainnya' => ['foto_rute_lainnya', 'name_rute_lainnya'], + ]; + + $inspeksi = Inspeksi::firstOrNew([ + 'permohonan_id' => $request->input('permohonan_id'), + 'jenis_jaminan_id' => $request->input('jenis_jaminan_id') + ]); + + // Get existing foto_form data if it exists + $existingData = $inspeksi->exists && $inspeksi->foto_form + ? json_decode($inspeksi->foto_form, true) + : []; + + $formatFotojson = $existingData; // Start with existing data + + // Process each photo category + foreach ($photoCategories as $category => $fields) { + // Only update if new files are provided + if ($this->categoryHasNewFiles($request, $fields)) { + // Delete old files for this category only + if (isset($existingData[$category])) { + $this->deleteFilesForCategory($existingData[$category]); + } + $formatFotojson[$category] = $this->processPhotoCategory($request, $fields); + } + } + + // Process single files + $singleFiles = ['foto_basement', 'foto_gerbang', 'pendamping']; + foreach ($singleFiles as $file) { + if ($request->hasFile($file)) { + // Delete old file if exists + if (isset($existingData[$file])) { + $this->deleteFile($existingData[$file]); + } + $formatFotojson[$file] = $this->uploadFile($request->file($file), $file); + } + } + + // Update record + $inspeksi->foto_form = json_encode($formatFotojson); + $inspeksi->save(); + + + + return response()->json(['success' => true, 'message' => 'Data berhasil disimpan', 'data' => $formatFotojson], 200); + } catch (Exception $e) { + return response()->json(['success' => false, 'message' => 'Failed to upload: ' . $e->getMessage()], 500); + } + } + + /** + * Process a photo category and its subcategories + */ + + private function processPhotoCategory(Request $request, array $fields) + { + $result = []; + $photoField = $fields[0]; + + if ($request->hasFile($photoField)) { + foreach ($request->file($photoField, []) as $key => $value) { + $item = []; + $item[$fields[1]] = $request->input($fields[1] . '.' . $key); + $item[$photoField] = $this->uploadFile($value, $photoField . '.' . $key); + + if (isset($fields[2])) { + $item[$fields[2]] = $request->input($fields[2] . '.' . $key); + } + + $result[] = $item; + } + } + + return $result; + } + + private function categoryHasNewFiles(Request $request, array $fields): bool + { + $photoField = $fields[0]; // First element is usually the photo field + return $request->hasFile($photoField) || + (is_array($request->file($photoField)) && count($request->file($photoField)) > 0); + } + + private function deleteFilesForCategory($categoryData) + { + if (!is_array($categoryData)) { + return; + } + + foreach ($categoryData as $item) { + if (isset($item['foto'])) { + $this->deleteOfFile($item['foto']); + } + } + } + + private function deleteOfFile($filePath) + { + if ($filePath && Storage::exists($filePath)) { + Storage::delete($filePath); + } + } + + + + + /** + * Custom validation request for foto + */ + public function validateFotoRequest(Request $request) + { + return $request->validate([ 'permohonan_id' => 'required', 'jenis_jaminan_id' => 'required', - 'pendamping' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'pendamping' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', 'foto_objek.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', 'name_objek.*' => 'required|string|max:255', 'foto_lingkungan.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', @@ -316,167 +399,99 @@ class SurveyorController extends Controller 'foto_gerbang' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', 'name_gerbang' => 'nullable|string|max:255', ]); - - try { - - $rute_menuju_lokasi = []; - $object_jaminan = []; - $lingkungan = []; - $foto_lantai_unit = []; - $foto_lantai_lainnya = []; - $foto_rute_lainnya = []; - - - foreach ($request->file('foto_rute', []) as $key => $value) { - $fotoRutePath = $this->uploadFile($request->file('foto_rute.' . $key), 'foto_rute.' . $key); - - $rute_menuju_lokasi[] = [ - 'name_rute' => $request->input('name_rute.' . $key), - 'foto_rute' => $fotoRutePath, - ]; - } - - foreach ($request->file('foto_objek', []) as $key => $value) { - $fotoObjekPath = $this->uploadFile($request->file('foto_objek.' . $key), 'foto_objek.' . $key); - $object_jaminan[] = [ - 'nama_objek' => $request->input('name_objek.' . $key), - 'foto_object' => $fotoObjekPath, - 'deskripsi_objek' => $request->input('deskripsi_objek.' . $key), - ]; - } - - foreach ($request->file('foto_lingkungan', []) as $key => $value) { - $fotoLingkunganPath = $this->uploadFile($request->file('foto_lingkungan.' . $key), 'foto_lingkungan.' . $key); - $lingkungan[] = [ - 'name_lingkungan' => $request->input('name_lingkungan.' . $key), - 'foto_lingkungan' => $fotoLingkunganPath, - - ]; - } - - foreach ($request->file('foto_lantai_unit', []) as $key => $value) { - $foto_lantai_unit_Path = $this->uploadFile($request->file('foto_lantai_unit.' . $key), 'foto_lantai_unit.' . $key); - $foto_lantai_unit[] = [ - 'name_lantai_unit' => $request->input('name_lantai_unit.' . $key), - 'foto_lantai_unit' => $foto_lantai_unit_Path, - - ]; - } - - foreach ($request->file('foto_rute_lainnya', []) as $key => $value) { - $foto_rute_lainnya_path = $this->uploadFile($request->file('foto_rute_lainnya.' . $key), 'foto_rute_lainnya.' . $key); - $foto_rute_lainnya[] = [ - 'name_rute_lainnya' => $request->input('name_rute_lainnya.' . $key), - 'foto_rute_lainnya' => $foto_rute_lainnya_path, - - ]; - } - - - foreach ($request->file('foto_lantai_lainnya', []) as $key => $value) { - $foto_lantai_lainnya_path = $this->uploadFile($request->file('foto_lantai_lainnya.' . $key), 'foto_lantai_lainnya.' . $key); - $foto_lantai_lainnya[] = [ - 'name_lantai_lainnya' => $request->input('name_lantai_lainnya.' . $key), - 'foto_lantai_lainnya' => $foto_lantai_lainnya_path, - - ]; - } - - - $basement = $this->uploadFile($request->file('foto_basement'), 'foto_basement'); - $gerbang = $this->uploadFile($request->file('foto_gerbang'), 'foto_gerbang'); - $pendamping = $this->uploadFile($request->file('pendamping'), 'pendamping'); - - - $formatFotojson = [ - 'rute_menuju_lokasi' => $rute_menuju_lokasi, - 'object_jaminan' => $object_jaminan, - 'lingkungan' => $lingkungan - ,'foto_lantai_unit' => $foto_lantai_unit, - 'foto_lantai_lainnya' => $foto_lantai_lainnya, - 'foto_rute_lainnya' => $foto_rute_lainnya, - 'foto_basement' => $basement, - 'foto_gerbang' => $gerbang, - 'pendamping' => $pendamping - ]; - - $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first(); - - if ($inspeksi) { - $inspeksi->update([ - 'foto_form' => json_encode($formatFotojson) - ]); - } else { - Inspeksi::create([ - 'permohonan_id' => $request->input('permohonan_id'), - 'foto_form' => json_encode($formatFotojson), - 'jenis_jaminan_id' => $request->input('jenis_jaminan_id') - ]); - } - - return response()->json(['success' => true, 'message' => 'Data berhasil disimpan', 'data' => $formatFotojson], 200); - } catch (Exception $e) { - return response()->json(['success' => false, 'message' => 'Failed to upload: ' . $e->getMessage()], 500); - } } - - public function submitSurveyor($id) { try { - // $cekButton = $this->checkButtonStatus($id); - // if (!$cekButton->buttonDisable) { - $permohonan = Permohonan::find($id); + // Get button status check result + $buttonStatusCheck = $this->checkButtonStatus($id); + $buttonStatus = json_decode($buttonStatusCheck->getContent(), true); + + // Check if button should be disabled + if ($buttonStatus['buttonDisable']) { + return response()->json([ + 'success' => false, + 'message' => 'Form belum lengkap. Pastikan semua data telah diisi dengan benar.', + ], 422); + } + + // If validation passes, update permohonan status + $permohonan = Permohonan::findOrFail($id); $permohonan->update([ 'status' => 'done', + 'submitted_at' => now() ]); - return response()->json(['success' => true, 'message' => 'Form surveyor submitted successfully'], 200); - // } else { - // return response()->json(['error' => 'Something went wrong'], 400); - // } - } catch (Exception $e) { - return response()->json(['error' => 'Something went wrong', 'message' => $e->getMessage()], 500); + + return response()->json([ + 'success' => true, + 'message' => 'Form surveyor berhasil disubmit' + ], 200); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan', + 'error' => $e->getMessage() + ], 500); } } + public function checkButtonStatus($id) { try { + // Get all inspeksi records for this permohonan + $inspeksiRecords = Inspeksi::where('permohonan_id', $id)->get(); - $inpeksi = Inspeksi::where('permohonan_id', $id)->first(); - - if ($inpeksi) { - $forminspeksi = json_decode($inpeksi->data_form, true); - $formFoto = json_decode($inpeksi->foto_form, true); - - $buttonDisable = false; - if ( - $formFoto && count($formFoto) > 0 && - $forminspeksi - ) { - $buttonDisable = false; - } else { - $buttonDisable = true; - } - - return response()->json(['buttonDisable' => $buttonDisable]); - } else { + if ($inspeksiRecords->isEmpty()) { return response()->json(['buttonDisable' => true]); } + + foreach ($inspeksiRecords as $inspeksi) { + $dataForm = json_decode($inspeksi->data_form, true); + $fotoForm = json_decode($inspeksi->foto_form, true); + $denahForm = json_decode($inspeksi->denah_form, true); + $dataPembanding = json_decode($inspeksi->data_pembanding, true); + + // Get jenis jaminan to check if it needs denah + $jenisJaminan = JenisJaminan::find($inspeksi->jenis_jaminan_id); + $isTanahBangunan = !in_array( + strtoupper($jenisJaminan->name ?? ''), + ['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT'] + ); + + // Check if required forms are empty or incomplete + if (empty($dataForm) || empty($fotoForm)) { + return response()->json(['buttonDisable' => true]); + } + + if ($isTanahBangunan && empty($denahForm)) { + return response()->json(['buttonDisable' => true]); + } + + if (empty($dataPembanding)) { + return response()->json(['buttonDisable' => true]); + } + } + + // If we get here, all checks passed + return response()->json(['buttonDisable' => false]); + } catch (\Exception $e) { - // return response()->json(['buttonDisable' => true]); return response()->json([ 'error' => 'Something went wrong', - 'message' => $e->getMessage() + 'message' => $e->getMessage(), + 'buttonDisable' => true ], 500); } } + public function storeJadwal(Request $request) { try { @@ -536,41 +551,146 @@ class SurveyorController extends Controller } - public function storeDataPembanding(Request $request) + public function storeFreeze() { + + } + + + private function formatDataPembanding($request) { - $data = $request->all(); - if (!$data) { - return response()->json(['success' => false, 'message' => 'Invalid data'], 400); + $dataPembanding = []; + $pembandingCount = count($request->input('alamat_pembanding', [])); + + for ($i = 0; $i < $pembandingCount; $i++) { + $pembanding = $this->formatSinglePembanding($request, $i); + + // Perbaikan penanganan foto pembanding + $fotoKey = "foto_objek_pembanding_{$i}"; // Sesuaikan dengan nama field di form + if ($request->hasFile($fotoKey)) { + $pembanding['foto_objek'] = $this->handleFileUpload( + $request->file($fotoKey), + 'pembanding', + "pembanding_{$i}" + ); + } + + $dataPembanding[] = $pembanding; + } + + return $dataPembanding; + } + + private function handleFileUpload($file, $folder, $prefix) + { + if (!$file) { + return null; } + try { + // Buat nama file yang unik + $extension = $file->getClientOriginalExtension(); + $fileName = $prefix . '_' . time() . '_' . uniqid() . '.' . $extension; + + // Pastikan folder exists + $path = storage_path("app/public/{$folder}"); + if (!File::exists($path)) { + File::makeDirectory($path, 0777, true); + } + + // Simpan file + $file->storeAs("public/{$folder}", $fileName); + + // Log untuk debugging + \Log::info("File berhasil disimpan: {$folder}/{$fileName}"); + + return $fileName; + } catch (\Exception $e) { + \Log::error("Error saat upload file: " . $e->getMessage()); + throw $e; + } + } + + private function formatSinglePembanding($request, $index) + { + $fields = [ + 'alamat', 'desa', 'kecamatan', 'kabupaten', 'provinsi', + 'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan', + 'status_nara_sumber', 'harga', 'nama_nara_sumber', + 'peruntukan', 'penawaran_transaksi', 'nomor_tlp', + 'kordinat_lat', 'kordinat_lng', 'jenis_aset', + ]; + + $pembanding = []; + foreach ($fields as $field) { + $inputName = "{$field}_pembanding"; + $pembanding[$field] = $request->input($inputName)[$index] ?? null; + } + + // Inisialisasi foto_objek sebagai null + $pembanding['foto_objek'] = null; + + return $pembanding; + } + + public function storeDataPembanding(Request $request) + { try { DB::beginTransaction(); - // $action = $request->input('type'); - // $rules = $this->getActionSpecificRules($data, $action, $request); + $validator = $request->validate([ + 'permohonan_id' => 'required|exists:permohonan,id', + 'type' => 'required|string', + 'jenis_jaminan_id' => 'required', + 'foto_objek' => 'nullable|image|max:2048', + 'foto_objek_pembanding_*' => 'nullable|image|max:2048', + ]); - $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first(); - - if (!$inspeksi) { - Inspeksi::create([ - 'permohonan_id' => $request->input('permohonan_id'), - 'data_pembanding' => json_encode($data), - 'name' => $request->input('type'), - 'jenis_jaminan_id' => $request->input('jenis_jaminan_id'), - ]); - } else { - $inspeksi->update(['data_pembanding' => json_encode($data)]); + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => 'Validasi gagal', + 'errors' => $validator->errors() + ], 422); } + $objekPenilaian = $this->formatObjekPenilaian($request); + if ($request->hasFile('foto_objek')) { + $objekPenilaian['foto_objek'] = $this->handleFileUpload( + $request->file('foto_objek'), + 'pembanding', + 'objek_penilaian' + ); + } + + $formattedData = [ + 'permohonan_id' => $request->input('permohonan_id'), + 'type' => $request->input('type'), + 'jenis_jaminan_id' => $request->input('jenis_jaminan_id'), + 'objek_penilaian' => $objekPenilaian, + 'data_pembanding' => $this->formatDataPembanding($request) + ]; + + $inspeksi = $this->saveInspeksi($formattedData); + DB::commit(); - return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => json_encode($data)], 200); - } catch (Exception $e) { + return response()->json([ + 'success' => true, + 'message' => 'Data berhasil disimpan', + 'data' => $formattedData + ], 200); + + } catch (\Exception $e) { DB::rollBack(); - return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500); + return response()->json([ + 'success' => false, + 'message' => 'Gagal menyimpan data: ' . $e->getMessage() + ], 500); } } - + + + /** * Form inspeksi. */ @@ -583,9 +703,9 @@ class SurveyorController extends Controller $link_url_region = Teams::with('regions', 'teamsUsers') - ->whereHas('teamsUsers', function ($query) { - $query->where('user_id', Auth::user()->id); - })->first(); + ->whereHas('teamsUsers', function ($query) { + $query->where('user_id', Auth::user()->id); + })->first(); $branches = Branch::all(); $provinces = Province::all(); @@ -725,8 +845,9 @@ class SurveyorController extends Controller public function dataPembanding($id, $jaminanId) { - $permohonan = Permohonan::with( - [ + try { + // Ambil data permohonan dengan eager loading + $permohonan = Permohonan::with([ 'user', 'debiture.province', 'debiture.city', @@ -735,28 +856,65 @@ class SurveyorController extends Controller 'branch', 'tujuanPenilaian', 'penilaian' - ], - )->findOrFail($id); - $surveyor = $id; - $branches = Branch::all(); - $provinces = Province::all(); + ])->findOrFail($id); - $data = $this->getCommonData(); + // Ambil data inspeksi + $inspeksi = Inspeksi::where([ + 'permohonan_id' => $id, + 'jenis_jaminan_id' => $jaminanId + ])->first(); - $inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); - $forminspeksi = null; - if ($inpeksi) { - $forminspeksi = $inpeksi; - // $forminspeksi = json_decode($inpeksi->data_form, true); + // Inisialisasi variabel + $inspectionData = null; + $comparisons = null; + $fotoForm = null; + + + if ($inspeksi) { + + $inspectionData = json_decode($inspeksi->data_form, true); + if (json_last_error() !== JSON_ERROR_NONE) { + throw new \Exception('Error decoding inspection data: ' . json_last_error_msg()); + } + + if ($inspeksi->data_pembanding) { + $comparisons = json_decode($inspeksi->data_pembanding, true); + if (json_last_error() !== JSON_ERROR_NONE) { + throw new \Exception('Error decoding comparison data: ' . json_last_error_msg()); + } + + + } + $fotoForm = json_decode($inspeksi->foto_form, true); + + } + + // Ambil data pendukung + $data = $this->getCommonData(); + $branches = Branch::all(); + $provinces = Province::all(); + + return view('lpj::surveyor.components.data-pembanding', compact( + 'permohonan', + 'id', + 'branches', + 'provinces', + 'inspectionData', + 'comparisons', + 'data', + 'jaminanId', + 'fotoForm' + )); + + } catch (\Exception $e) { + return redirect() + ->back() + ->with('error', 'Terjadi kesalahan saat memuat data: ' . $e->getMessage()); } - - // return response()->json($forminspeksi); - return view('lpj::surveyor.components.data-pembanding', compact('permohonan', 'surveyor', 'branches', 'provinces', 'forminspeksi', 'data')); } - private function getHeader(string $type): array { return self::HEADERS[$type] ?? []; @@ -793,13 +951,12 @@ class SurveyorController extends Controller if (!$modelClass) { return redirect() - ->route('basicdata.'. $type .'.index') + ->route('basicdata.' . $type . '.index') ->with('error', 'Invalid type specified.'); } if ($type == 'spek-bangunan') { $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; - } @@ -807,12 +964,11 @@ class SurveyorController extends Controller $modelClass::create($data); return redirect() - ->route('basicdata.' . $type .'.index') + ->route('basicdata.' . $type . '.index') ->with('success', 'created successfully'); - } catch (Exeception $e) { return redirect() - ->route('basicdata.' . $type .'.index') + ->route('basicdata.' . $type . '.index') ->with('error', $th->getMessage()); } } @@ -861,7 +1017,6 @@ class SurveyorController extends Controller $spekKategoriBagunan = null; if ($type == 'spek-bangunan') { $spekKategoriBagunan = SpekKategoritBangunan::all(); - } @@ -877,7 +1032,6 @@ class SurveyorController extends Controller if ($type == 'spek-bangunan') { $validate['spek_kategori_bagunan_id'] = $request->spek_kategori_bagunan_id; - } // Check if the provided type exists in the modelClasses @@ -914,23 +1068,23 @@ class SurveyorController extends Controller 'penilaian', 'documents', ])->findOrFail($id); - + $jenisAssetUpdated = false; if ($request->input('types') == 'jenis_asset') { $this->updateJenisAsset($permohonan, $request); $jenisAssetUpdated = true; } - + if (in_array($request->input('types'), ['analisa_tanah', 'analisa_bangunan', 'analisa_unit'])) { $key = match ($request->input('types')) { 'analisa_tanah' => 'luas_tanah', 'analisa_bangunan' => 'luas_bangunan', 'analisa_unit' => 'luas_unit', }; - + $this->updateDetails($permohonan, $key, $request->input($key)); } - + return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', @@ -940,8 +1094,8 @@ class SurveyorController extends Controller return response()->json(['error' => 'Something went wrong', 'message' => $e->getMessage()], 500); } } - - + + private function updateJenisAsset($permohonan, $request) { $jenis_jaminan_id = $permohonan->debiture->documents->first()->jenis_jaminan_id; @@ -951,35 +1105,35 @@ class SurveyorController extends Controller 'jenis_jaminan_id' => $request->input('jenis_asset'), ]); } - + private function updateDetails($permohonan, $key, $newValue) { $document = $permohonan->debiture->documents->first(); - + if (!$document) { throw new \Exception("Document not found"); } - + $detailsUpdate = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->first(); - + if (!$detailsUpdate) { throw new \Exception("DetailDokumenJaminan not found"); } - + $datas = json_decode($detailsUpdate->details, true) ?? []; - + if (is_numeric($newValue)) { $newValue = [$key => $newValue]; } - + if (!is_array($newValue)) { throw new \InvalidArgumentException("'{$key}' must be an array or valid JSON string"); } - + foreach ($newValue as $subKey => $value) { $datas[$subKey] = $value; // Update atau tambahkan key baru } - + $detailsUpdate->update([ 'details' => json_encode($datas), ]); @@ -1036,7 +1190,7 @@ class SurveyorController extends Controller } $filteredRecords = $query->count(); - $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisFasilitasKredit','penilaian'])->get(); + $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisFasilitasKredit', 'penilaian'])->get(); $pageCount = ceil($totalRecords / $size); @@ -1187,10 +1341,10 @@ class SurveyorController extends Controller $query->where('jenis_jaminan_id', $jaminanId); } ]) - ->whereHas('debiture.documents', function ($query) use ($jaminanId) { - $query->where('jenis_jaminan_id', $jaminanId); - }) - ->findOrFail($id); + ->whereHas('debiture.documents', function ($query) use ($jaminanId) { + $query->where('jenis_jaminan_id', $jaminanId); + }) + ->findOrFail($id); } @@ -1230,6 +1384,7 @@ class SurveyorController extends Controller 'fasilitas-objek' => FasilitasObjek::class, 'merupakan-daerah' => MerupakanDaerah::class, 'jenis-unit' => JenisUnit::class, + 'perkerasan-jalan' => PerkerasanJalan::class, ]; @@ -1267,8 +1422,7 @@ class SurveyorController extends Controller 'fasilitasObjek' => FasilitasObjek::all(), 'merupakanDaerah' => MerupakanDaerah::all(), 'jenisUnit' => JenisUnit::all(), - - + 'jenisJaminan' => JenisJaminan::all(), ]; } @@ -1301,88 +1455,137 @@ class SurveyorController extends Controller 'posisi-unit' => ['Posisi unit', 'posisi-unit'], 'bentuk-unit' => ['Bentuk unit', 'bentuk-unit'], 'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek'], - ]; + ]; - private function getAssetData($data) + private function getAssetData(array $data): array { - return [ - 'asset' =>[ - 'debitur_perwakilan' => $data['debitur_perwakilan'] ?? [], - 'jenis_asset' => $data['jenis_asset'] ?? null, - 'jenis_asset_tidak_sesuai' => $data['jenis_asset_tidak_sesuai'] ?? null, - 'alamat_sesuai' => $data['alamat_sesuai'] ?? null, - 'alamat_tidak_sesuai' => $data['alamat_tidak_sesuai'] ?? null, + $alamatData = [ 'nama_jalan' => $data['nama_jalan'] ?? null, 'desa_kelurahan' => $data['desa_kelurahan'] ?? null, 'kecamatan' => $data['kecamatan'] ?? null, 'kota_kabupaten' => $data['kota_kabupaten'] ?? null, 'provinsi' => $data['provinsi'] ?? null, - 'kordinat_lng' => $data['kordinat_lng'] ?? null, - 'kordinat_lat' => $data['kordinat_lat'] ?? null, - ]]; + ]; + + return [ + 'asset' => [ + 'debitur_perwakilan' => $data['debitur_perwakilan'] ?? [], + 'jenis_asset' => [ + $data['jenis_asset'] => ($data['jenis_asset'] === 'sesuai') + ? $data['jenis_asset_name'] + : ($data['jenis_asset_tidak_sesuai'] ?? null) + ], + 'alamat' => [ + $data['alamat_sesuai'] => $alamatData + ], + 'hub_cadeb' => [ + $data['hub_cadeb'] => $this->getFieldData( + $data, + 'hub_cadeb', + true + ) + ], + 'hub_cadeb_penghuni' => [ + $data['hub_cadeb_penghuni'] => $this->getFieldData( + $data, + 'hub_cadeb_penghuni', + true + ) + ], + + 'kordinat_lng' => $data['kordinat_lng'] ?? null, + 'kordinat_lat' => $data['kordinat_lat'] ?? null, + ] + ]; } - private function getTanahData($data, $request): array + private function getTanahData(array $data): array { return [ 'tanah' => [ - - 'luas_tanah' => $data['luas_tanah'] ?? null, - 'luas_tanah_tidak_sesuai' => $data['luas_tanah_tidak_sesuai'] ?? null, - 'hadap_mata_angin' => $data['hadap_mata_angin'] ?? null, - 'hadap_mata_angin_tidak_sesuai' => $data['hadap_mata_angin_tidak_sesuai'] ?? null, - 'bentuk_tanah' => $data['bentuk_tanah'] ?? null, - 'bentuk_tanah_lainnya' => $data['bentuk_tanah_lainnya'] ?? null, - 'kontur_tanah' => $data['kontur_tanah'] ?? [], - 'ketinggian_tanah' => $data['ketinggian_tanah'] ?? [], - 'ketinggian_tanah_tidak_sesuai' => $data['ketinggian_tanah_tidak_sesuai'] ?? [], - 'kontur_jalan' => $data['kontur_jalan'] ?? null, - 'ketinggian_jalan' => $data['ketinggian_jalan'] ?? [], - 'posisi_kavling' => $data['posisi_kavling'] ?? [], - 'posisi_kavling_lainnya' => $data['posisi_kavling_lainnya'] ?? null, - 'tusuk_sate' => $data['tusuk_sate'] ?? null, - 'lockland' => $data['lockland'] ?? null, - 'kondisi_fisik_tanah' => $data['kondisi_fisik_tanah'] ?? [], - 'kondisi_fisik_tanah_lainnya' => $data['kondisi_fisik_tanah_lainnya'] ?? null, - ], + 'luas_tanah' => $this->getFieldData( + $data, + 'luas_tanah', + true + ), + 'hadap_mata_angin' => $this->getFieldData( + $data, + 'hadap_mata_angin', + true + ), + 'bentuk_tanah' => $this->getFieldData( + $data, + 'bentuk_tanah', + false, + 'lainnya' + ), + 'kontur_tanah' => $data['kontur_tanah'] ?? [], + 'ketinggian_tanah' => [ + 'ketinggian' => $data['kontur_tanah'] ?? null, + 'lebih_tinggi' => $data['ketinggian_lebih_tinggi'] ?? null, + 'lebih_rendah' => $data['ketinggian_lebih_rendah'] ?? null + ], + 'kontur_jalan' => $data['kontur_jalan'] ?? null, + 'ketinggian_jalan' => $data['ketinggian_jalan'] ?? [], + 'posisi_kavling' => $this->getFieldData( + $data, + 'posisi_kavling', + false, + 'lainnya' + ), + 'tusuk_sate' => $data['tusuk_sate'] ?? null, + 'lockland' => $data['lockland'] ?? null, + 'kondisi_fisik_tanah' => $this->getFieldData( + $data, + 'kondisi_fisik_tanah', + false, + 'lainnya' + ) + ] ]; } + private function getBangunanData($data, $request): array { $data = $request->all(); $result = []; - // foreach ($data['nama_bagunan'] as $index => $bangunan) { - // $bangunanData = [ - // 'bangunan' => $bangunan, - // 'kategori' => [] - // ]; + // foreach ($data['nama_bangunan'] as $index => $bangunan) { + // $bangunanData = [ + // 'bangunan' => $bangunan, + // 'kategori' => [] + // ]; - // foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) { - // if (isset($data['spek_bangunan'][$kategori])) { - // $bangunanData['kategori'][] = [ - // 'kategori' => $kategori, - // 'spesifikasi' => $data['spek_bangunan'][$kategori] - // ]; - // } - // } + // foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) { + // if (isset($data['spek_bangunan'][$kategori])) { + // $bangunanData['kategori'][] = [ + // 'kategori' => $kategori, + // 'spesifikasi' => $data['spek_bangunan'][$kategori] + // ]; + // } + // } - // $result[] = $bangunanData; - // } + // $result[] = $bangunanData; + // } return [ 'bangunan' => [ - 'luas_tanah_bagunan' => $data['luas_tanah_bagunan'] ?? null, - 'jenis_bangunan' => $data['jenis_bangunan'] ?? null, - 'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null, - 'sifat_bangunan' => $data['sifat_bangunan'] ?? null, - 'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null, - 'spesifikasi_bangunan' => $result ?? null, - // 'spek_bangunan' => $data['spek_bangunan'] ?? [], - 'sarana_pelengkap' => $data['sarana_pelengkap'] ?? [], - 'sarana_pelengkap_input' => $data['sarana_pelengkap_input'] ?? null, + 'luas_tanah_bagunan' => $this->getFieldData( + $data, + 'luas_tanah_bagunan', + true + ), + 'jenis_bangunan' => $data['jenis_bangunan'] ?? null, + 'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null, + 'sifat_bangunan' => $data['sifat_bangunan'] ?? null, + 'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null, + 'spesifikasi_bangunan' => $result ?? null, + 'sarana_pelengkap' => $this->mapArrayWithInputs( + $data['sarana_pelengkap'] ?? [], + $data['sarana_pelengkap_input'] ?? [] + ), ], ]; } @@ -1391,27 +1594,30 @@ class SurveyorController extends Controller { return [ 'lingkungan' => [ - 'jarak_jalan_utama' => $data['jarak_jalan_utama'] ?? null, - 'jalan_linkungan' => $data['jalan_linkungan'] ?? null, - 'jarak_cbd_point' => $data['jarak_cbd_point'] ?? null, - 'nama_cbd_point' => $data['nama_cbd_point'] ?? null, - 'lebar_perkerasan_jalan' => $data['lebar_perkerasan_jalan'] ?? null, - 'perkerasan_jalan' => $data['perkerasan_jalan'] ?? null, - 'lalu_lintas' => $data['lalu_lintas'] ?? null, - 'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null, - 'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null, - 'terletak_diarea' => $data['terletak_diarea'] ?? null, - 'disekitar_lokasi' => $data['disekitar_lokasi'] ?? null, - 'kondisi_bangunan_sekitar' => $data['kondisi_bangunan_sekitar'] ?? null, - 'sifat_bangunan_sekitar' => $data['sifat_bangunan_sekitar'] ?? null, - 'dekat_makam' => $data['dekat_makam'] ?? null, - 'jarak_makam' => $data['jarak_makam'] ?? null, - 'nama_makam' => $data['nama_makam'] ?? null, - 'dekat_tps' => $data['dekat_tps'] ?? null, - 'jarak_tps' => $data['jarak_tps'] ?? null, - 'nama_tps' => $data['nama_tps'] ?? null, - 'merupakan_daerah' => $data['merupakan_daerah'] ?? null, - 'fasilitas_dekat_object' => $data['fasilitas_dekat_object'] ?? null, + 'jarak_jalan_utama' => $data['jarak_jalan_utama'] ?? null, + 'jalan_linkungan' => $data['jalan_linkungan'] ?? null, + 'jarak_cbd_point' => $data['jarak_cbd_point'] ?? null, + 'nama_cbd_point' => $data['nama_cbd_point'] ?? null, + 'lebar_perkerasan_jalan' => $data['lebar_perkerasan_jalan'] ?? null, + 'perkerasan_jalan' => $data['perkerasan_jalan'] ?? null, + 'lalu_lintas' => $data['lalu_lintas'] ?? null, + 'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null, + 'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null, + 'terletak_diarea' => $data['terletak_diarea'] ?? null, + 'disekitar_lokasi' => $data['disekitar_lokasi'] === 'yes' ? [ + 'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null, + 'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null, + ] : $data['disekitar_lokasi'], + 'kondisi_bangunan_sekitar' => $data['kondisi_bangunan_sekitar'] ?? null, + 'sifat_bangunan_sekitar' => $data['sifat_bangunan_sekitar'] ?? null, + 'dekat_makam' => $data['dekat_makam'] ?? null, + 'jarak_makam' => $data['jarak_makam'] ?? null, + 'nama_makam' => $data['nama_makam'] ?? null, + 'dekat_tps' => $data['dekat_tps'] ?? null, + 'jarak_tps' => $data['jarak_tps'] ?? null, + 'nama_tps' => $data['nama_tps'] ?? null, + 'merupakan_daerah' => $data['merupakan_daerah'] ?? null, + 'fasilitas_dekat_object' => $data['fasilitas_dekat_object'] ?? null, ] ]; } @@ -1420,24 +1626,26 @@ class SurveyorController extends Controller { $factData = [ 'fakta' => [ - 'fakta_positif' => $data['fakta_positif'] ?? null, - 'fakta_negatif' => $data['fakta_negatif'] ?? null, - 'rute_menuju' => $data['rute_menuju'] ?? null, - 'batas_batas' => $data['batas_batas'] ?? null, - 'batas_batas_input' => $data['batas_batas_input'] ?? null, - 'kondisi_lingkungan' => $data['kondisi_lingkungan'] ?? null, - 'kondisi_lain_bangunan' => $data['kondisi_lain_bangunan'] ?? null, - 'informasi_dokument' => $data['informasi_dokument'] ?? null, - 'peruntukan' => $data['peruntukan'] ?? null, - 'kdb' => $data['kdb'] ?? null, - 'kdh' => $data['kdh'] ?? null, - 'gsb' => $data['gsb'] ?? null, - 'max_lantai' => $data['max_lantai'] ?? null, - 'klb' => $data['klb'] ?? null, - 'gss' => $data['gss'] ?? null, - 'pelebaran_jalan' => $data['pelebaran_jalan'] ?? null, - 'nama_petugas' => $data['nama_petugas'] ?? null, - 'keterangan' => $data['keterangan'] ?? null, + 'fakta_positif' => $data['fakta_positif'] ?? null, + 'fakta_negatif' => $data['fakta_negatif'] ?? null, + 'rute_menuju' => $data['rute_menuju'] ?? null, + 'batas_batas' => $this->mapArrayWithInputs( + $data['batas_batas'] ?? null, + $data['batas_batas_input'] ?? null + ), + 'kondisi_lingkungan' => $data['kondisi_lingkungan'] ?? null, + 'kondisi_lain_bangunan' => $data['kondisi_lain_bangunan'] ?? null, + 'informasi_dokument' => $data['informasi_dokument'] ?? null, + 'peruntukan' => $data['peruntukan'] ?? null, + 'kdb' => $data['kdb'] ?? null, + 'kdh' => $data['kdh'] ?? null, + 'gsb' => $data['gsb'] ?? null, + 'max_lantai' => $data['max_lantai'] ?? null, + 'klb' => $data['klb'] ?? null, + 'gss' => $data['gss'] ?? null, + 'pelebaran_jalan' => $data['pelebaran_jalan'] ?? null, + 'nama_petugas' => $data['nama_petugas'] ?? null, + 'keterangan' => $data['keterangan'] ?? null, ] ]; @@ -1462,7 +1670,7 @@ class SurveyorController extends Controller $factData[$fotoType] = $dataForm[$fotoType] ?? null; } } - }else{ + } else { foreach ($fotoTypes as $fotoType) { $factData[$fotoType] = $this->updateOrDeleteFile($data, $request, $fotoType); } @@ -1852,9 +2060,11 @@ class SurveyorController extends Controller { return [ 'action' => $data['action'] ?? null, - 'luas_unit' => $data['luas_unit'] ?? null, - 'luas_unit_tidak_sesuai' => $data['luas_unit_tidak_sesuai'] ?? null, - 'jenis_unit' => $data['jenis_unit'] ?? null, + 'luas_unit' => $this->getFieldData( + $data, + 'luas_unit', + true + ), 'kondisi_unit' => $data['kondisi_unit'] ?? null, 'posisi_unit' => $data['posisi_unit'] ?? null, 'lantai' => $data['lantai'] ?? null, @@ -1865,9 +2075,15 @@ class SurveyorController extends Controller + /** + * Helper untuk upload file + * + * @param $file + * @param $type + * @return path name + */ - // function upload file to storage private function uploadFile($file, $type) { if (!$file->isValid()) { @@ -1884,5 +2100,75 @@ class SurveyorController extends Controller return str_replace('public/', '', $path); } -} + /** + * Helper untuk memetakan array dengan inputannya + * + * @param array $keys Array kunci + * @param array $values Array nilai/input + * @return array + */ + private function mapArrayWithInputs(array $keys, array $values): array + { + $result = []; + + foreach ($keys as $index => $key) { + $result[$key] = $values[$index] ?? null; + } + + return $result; + } + + + + /** + * Helper method generic untuk mengambil data field + * + * @param array $data Array sumber data + * @param string $fieldName Nama field + * @param bool $checkKesesuaian Apakah perlu cek kesesuaian + * @param string|null $extraField Field tambahan (misal 'lainnya') + * @return array + */ + private function getFieldData( + array $data, + string $fieldName, + bool $checkKesesuaian = false, + ?string $extraField = null + ): array { + if ($checkKesesuaian) { + return [ + $data[$fieldName] ?? '' => ($data[$fieldName] ?? '') === 'sesuai' + ? ($data["{$fieldName}_sesuai"] ?? '') + : ($data["{$fieldName}_tidak_sesuai"] ?? '') + ]; + } + + $result = [ + $fieldName => $data[$fieldName] ?? null + ]; + + if ($extraField) { + $result[$extraField] = $data["{$fieldName}_{$extraField}"] ?? null; + } + + return $result; + } + + + public function export(string $type) + { + $modelClass = $this->getModelClass($type); + + if (!$modelClass) { + + return response()->json([ + 'message' => 'Invalid type provided.', + 'available_types' => array_keys($this->modelClasses), + ], 400); + } + + // Return Excel download + return Excel::download(new BasicDataSurveyorExport($modelClass), $type . '.xlsx'); + } +} diff --git a/app/Http/Requests/FormSurveyorRequest.php b/app/Http/Requests/FormSurveyorRequest.php index 0a3245b..25f32c2 100644 --- a/app/Http/Requests/FormSurveyorRequest.php +++ b/app/Http/Requests/FormSurveyorRequest.php @@ -71,8 +71,10 @@ class FormSurveyorRequest extends FormRequest { return [ 'luas_tanah' => 'required', + 'luas_tanah_sesuai' => 'nullable', 'luas_tanah_tidak_sesuai' => 'nullable', 'hadap_mata_angin' => 'required', + 'hadap_mata_angin_sesuai' => 'nullable', 'hadap_mata_angin_tidak_sesuai' => 'nullable', 'bentuk_tanah' => 'nullable|array', 'bentuk_tanah_lainnya' => 'nullable', @@ -95,12 +97,14 @@ class FormSurveyorRequest extends FormRequest { return [ 'action' => 'required', + 'luas_tanah_bangunan_sesuai' => 'nullable', 'luas_tanah_bagunan' => 'required', + 'luas_tanah_bangunan_tidak_sesuai' => 'nullable', 'jenis_bangunan' => 'required', 'kondisi_bangunan' => 'nullable', 'sifat_bangunan' => 'required|array', 'sifat_bangunan_input' => 'nullable|array', - 'nama_bagunan' => 'required', + 'nama_bagunan' => 'required|nullable', 'spek_kategori_bangunan.*' => 'required', 'spek_bangunan.*' => 'required', 'sarana_pelengkap' => 'required', @@ -116,8 +120,8 @@ class FormSurveyorRequest extends FormRequest return [ 'action' => 'required', 'luas_unit' => 'required', + 'luas_unit_sesuai' => 'nullable', 'luas_unit_tidak_sesuai' => 'nullable', - 'jenis_unit' => 'required|array', 'kondisi_unit' => 'required|array', 'posisi_unit' => 'required|array', 'lantai' => 'required|array', @@ -145,8 +149,8 @@ class FormSurveyorRequest extends FormRequest 'tingkat_keramaian' => 'nullable', 'terletak_diarea' => 'nullable', 'disekitar_lokasi' => 'nullable', - 'kondisi_bangunan_sekitar' => 'nullable', - 'sifat_bangunan_sekitar' => 'nullable', + 'kondisi_bagunan_disekitar_lokasi' => 'nullable', + 'sifat_bagunan_disekitar_lokasi' => 'nullable', 'dekat_makam' => 'nullable', 'jarak_makam' => 'nullable', 'nama_makam' => 'nullable', @@ -511,10 +515,19 @@ class FormSurveyorRequest extends FormRequest 'permohonan_id' => 'required', 'type' => 'required', 'debitur_perwakilan' => 'required|array', + 'jenis_asset_name' => 'nullable', 'jenis_asset' => 'required', 'jenis_asset_tidak_sesuai' => 'nullable', 'alamat_sesuai' => 'required', 'alamat_tidak_sesuai' => 'nullable', + + 'hub_cadeb' => 'required', + 'hub_cadeb_sesuai' => 'nullable', + 'hub_cadeb_tidak_sesuai' => 'nullable', + 'hub_cadeb_penghuni' => 'required', + 'hub_cadeb_penghuni_sesuai' => 'nullable', + 'hub_cadeb_penghuni_tidak_sesuai' => 'nullable', + 'nama_jalan' => 'nullable', 'desa_kelurahan' => 'nullable', 'kecamatan' => 'nullable', diff --git a/app/Http/Requests/JenisJaminanRequest.php b/app/Http/Requests/JenisJaminanRequest.php index 96d9653..9f4d076 100644 --- a/app/Http/Requests/JenisJaminanRequest.php +++ b/app/Http/Requests/JenisJaminanRequest.php @@ -19,7 +19,7 @@ 'name' => 'required|max:255', 'slug' => 'required|max:255', 'jenis_legalitas_jaminan_id' => 'nullable', - 'form_kategori.*' => 'required', + 'form_kategori' => 'required', ]; } @@ -39,13 +39,14 @@ $this->merge([ 'code' => IdGenerator::generate( ['table' => 'jenis_jaminan', 'length' => 5, 'prefix' => 'JJ', 'field' => 'code'], - ) + ), ]); } $this->merge([ 'jenis_legalitas_jaminan_id' => json_encode($this->jenis_legalitas_jaminan_id), - 'slug' => Str::slug($this->name), + 'form_kategori' => json_encode($this->form_kategori), + 'slug' => Str::slug($this->name), ]); } } diff --git a/app/Http/Requests/PersetujuanPenawaranRequest.php b/app/Http/Requests/PersetujuanPenawaranRequest.php index 53315db..5f85f6e 100644 --- a/app/Http/Requests/PersetujuanPenawaranRequest.php +++ b/app/Http/Requests/PersetujuanPenawaranRequest.php @@ -18,8 +18,8 @@ 'nomor_proposal_penawaran' => 'nullable|string|max:255', 'tanggal_proposal_penawaran' => 'nullable|date', 'biaya_final' => 'nullable|numeric|min:0', - 'sla_resume' => 'nullable|date', - 'sla_final' => 'nullable|date|after_or_equal:sla_resume', + 'sla_resume' => 'nullable|numeric|min:0', + 'sla_final' => 'nullable|numeric|min:0', 'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240', 'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240', 'bukti_bayar' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240', @@ -43,10 +43,7 @@ 'biaya_final.numeric' => 'Biaya final harus berupa angka.', 'biaya_final.min' => 'Biaya final tidak boleh kurang dari 0.', 'sla_resume.required' => 'SLA Resume wajib diisi.', - 'sla_resume.date' => 'SLA Resume harus berupa tanggal yang valid.', 'sla_final.required' => 'SLA Final wajib diisi.', - 'sla_final.date' => 'SLA Final harus berupa tanggal yang valid.', - 'sla_final.after_or_equal' => 'SLA Final harus sama dengan atau setelah SLA Resume.', 'file_persetujuan_penawaran.file' => 'File Persetujuan Penawaran harus berupa file.', 'file_persetujuan_penawaran.mimes' => 'File Persetujuan Penawaran harus berupa file PDF, DOC, atau DOCX.', 'file_persetujuan_penawaran.max' => 'Ukuran File Persetujuan Penawaran tidak boleh lebih dari 10MB.', diff --git a/app/Http/Requests/SurveyorRequest.php b/app/Http/Requests/SurveyorRequest.php index 379d24b..ec41731 100644 --- a/app/Http/Requests/SurveyorRequest.php +++ b/app/Http/Requests/SurveyorRequest.php @@ -37,6 +37,7 @@ class SurveyorRequest extends FormRequest 'posisi-unit' => 'posisi_unit', 'bentuk-unit' => 'bentuk_unit', 'fasilitas-objek' => 'fasilitas_objek', + 'perkerasan-jalan' => 'perkerasan_jalan', ]; /** diff --git a/app/Models/Inspeksi.php b/app/Models/Inspeksi.php index ebbe399..47e042a 100644 --- a/app/Models/Inspeksi.php +++ b/app/Models/Inspeksi.php @@ -14,7 +14,7 @@ class Inspeksi extends Model /** * The attributes that are mass assignable. */ - protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','jenis_jaminan_id']; + protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','jenis_jaminan_id','data_pembanding']; public function permohonan() { diff --git a/app/Models/PersetujuanPenawaran.php b/app/Models/PersetujuanPenawaran.php index 15176de..6a58bc2 100644 --- a/app/Models/PersetujuanPenawaran.php +++ b/app/Models/PersetujuanPenawaran.php @@ -29,8 +29,6 @@ protected $casts = [ 'tanggal_proposal_penawaran' => 'date', - 'sla_resume' => 'date', - 'sla_final' => 'date', 'biaya_final' => 'decimal:2', 'status' => 'boolean', 'authorized_status' => 'boolean', diff --git a/app/Models/Regions.php b/app/Models/Regions.php index 7b5519c..f5aef83 100644 --- a/app/Models/Regions.php +++ b/app/Models/Regions.php @@ -23,4 +23,8 @@ class Regions extends Model public function teams(){ return $this->hasMany(Teams::class, 'regions_id', 'id'); } + + public function penilaiTeam(){ + return $this->hasMany(PenilaianTeam::class, 'team_id', 'id'); + } } diff --git a/database/migrations/2024_12_03_021006_update_persetujuan_penawaran_table.php b/database/migrations/2024_12_03_021006_update_persetujuan_penawaran_table.php new file mode 100644 index 0000000..c48ca41 --- /dev/null +++ b/database/migrations/2024_12_03_021006_update_persetujuan_penawaran_table.php @@ -0,0 +1,30 @@ +string('sla_resume')->nullable()->change(); + $table->string('sla_final')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persetujuan_penawaran', function (Blueprint $table) { + $table->datetime('sls_resume')->nullable(false)->change(); + $table->datetime('sla_final')->nullable(false)->change(); + }); + } +}; diff --git a/database/migrations/2024_12_04_041852_update_name_inspeksi_table.php b/database/migrations/2024_12_04_041852_update_name_inspeksi_table.php new file mode 100644 index 0000000..424957e --- /dev/null +++ b/database/migrations/2024_12_04_041852_update_name_inspeksi_table.php @@ -0,0 +1,28 @@ +string('name')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('inspeksi', function (Blueprint $table) { + $table->string('name')->nullable(false)->change(); + }); + } +}; diff --git a/resources/views/activity/progres_activity/index.blade.php b/resources/views/activity/progres_activity/index.blade.php index 2e4189f..29cbb0a 100644 --- a/resources/views/activity/progres_activity/index.blade.php +++ b/resources/views/activity/progres_activity/index.blade.php @@ -51,13 +51,12 @@ @php $sortedTeamsActivity = $teamsActivity->sortBy(function ($item) { - return $item->team->penilaianTeam - ->filter(function ($penilaianTeam) use ($item) { - return $penilaianTeam->user_id == $item->user->id; + return $item->team->regions->penilaiTeam + ->filter(function ($penilaiTeam) use ($item) { + return $penilaiTeam->user_id == $item->user->id; }) ->count(); }); - @endphp @foreach ($sortedTeamsActivity as $index => $item) @@ -74,14 +73,7 @@
Total Task: {{ $totalTasks }}
+Total Task: {{ countPermohonanForUser($item->user->id) }}
{{ $luas_unit }} m2
+ @endforeach + + @endif +{{ $luas_bangunan }} m2
- @endforeach - - @endif -{{ $luas_tanah }} m2
- @endforeach - + @foreach ($permohonan->debiture->documents as $item) + @php + $luas = $item->detail; + $details = json_decode($luas[0]->details, true); + $luas_tanah = isset($details['luas_tanah']) ? $details['luas_tanah'] : 'N/A'; + @endphp + +{{ $luas_tanah }} m2
+ @endforeach @endif{{ $hadap_mata_angin }} m2
+ @endforeach + @endif