surveyorController = $surveyorController; // $this->penilaiController = $penilaiController; } /** * Display a listing of the resource. */ public function index() { $status_permohonan = StatusPermohonan::all(); return view('lpj::penilaian.index', compact('status_permohonan')); } /** * Store a newly created resource in storage. */ public function store(PenilaianRequest $request) { $validatedData = $request->validated(); if ($validatedData) { try { DB::beginTransaction(); $penilaian = Penilaian::create($validatedData); $validatedData['penilaian_id'] = $penilaian->id; $teams_ids = []; $user_ids = []; $roles = []; if ($validatedData['surveyor_id'] === 'pilih_dari_region') { $surveyor_region_id = $validatedData['surveyor_region_id']; // Hapus team_id sebelumnya di Permohonan jika ada $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first(); if ($permohonan) { $permohonan->update([ 'region_id' => $surveyor_region_id, ]); } $teams_ids[] = $surveyor_region_id; $user_ids[] = null; $roles[] = 'surveyor'; } else { $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first(); $teams_ids[] = $validatedData['teams_id']; if (isset($validatedData['penilai_surveyor_id'])) { $user_ids[] = $validatedData['penilai_surveyor_id']; } else { $user_ids[] = $validatedData['surveyor_id']; } $roles[] = 'surveyor'; } if ($validatedData['penilai_id'] === 'pilih_dari_region') { $penilaian_region_id = $validatedData['penilai_region_id']; // Hapus team_id sebelumnya di Permohonan jika ada $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first(); if ($permohonan) { $permohonan->update([ 'region_id' => $penilaian_region_id, ]); } $teams_ids[] = $penilaian_region_id; $user_ids[] = null; $roles[] = 'penilai'; } else { $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi)->first(); $teams_ids[] = $validatedData['teams_id']; if (isset($validatedData['penilai_surveyor_id'])) { $user_ids[] = $validatedData['penilai_surveyor_id']; } else { $user_ids[] = $validatedData['penilai_id']; } $roles[] = 'penilai'; } foreach ($teams_ids as $key => $teams_id) { PenilaianTeam::create([ 'penilaian_id' => $validatedData['penilaian_id'], 'team_id' => $teams_id, 'user_id' => $user_ids[$key], 'role' => $roles[$key], ]); } if ($validatedData['surveyor_id'] === 'pilih_dari_region' || $validatedData['penilai_id'] === 'pilih_dari_region') { $status = $permohonan->status; } else { $status = 'assign'; } $permohonan->update([ 'status' => $status, ]); DB::commit(); return response()->json(['success' => true, 'message' => 'Data berhasil disimpan'], 200); } catch (Exception $e) { DB::rollBack(); return response()->json(['error' => $e->getMessage()]); } } } /** * Show the form for creating a new resource. */ public function create($id) { return view('lpj::penilaian.form'); } /** * Update the specified resource in storage. */ public function update(Request $request, $id) { try { DB::beginTransaction(); $penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->first(); $penilaianId = $penilaian->id; $penilainTeam = PenilaianTeam::where('penilaian_id', $penilaianId)->get(); foreach ($penilainTeam as $item) { if ($item->role === 'surveyor' && $item->user_id === null) { $item->update([ 'user_id' => $request->surveyor_id, 'role' => 'surveyor', ]); } if ($item->role === 'penilai' && $item->user_id === null) { $item->update([ 'user_id' => $request->penilai_id, 'role' => 'penilai', ]); } } $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi); $permohonan->update([ 'status' => 'assign', ]); DB::commit(); return response()->json(['success' => true, 'message' => 'Data berhasil disimpan'], 200); } catch (Exception $e) { DB::rollBack(); return response()->json(['success' => false, 'error' => $e->getMessage()]); } } /** * Show the form for editing the specified resource. */ public function assignment($id) { $permohonan = Permohonan::with([ 'user', 'debiture.province', 'debiture.city', 'debiture.district', 'debiture.village', 'branch', 'tujuanPenilaian', ])->findOrFail($id); $idPenilaian = $permohonan->jenis_penilaian_id; $idRegion = $permohonan->region_id; $jenisPenilaian = JenisPenilaian::find($idPenilaian); $userTeam = Teams::with(['regions', 'teamsUsers.user'])->whereHas('regions', function ($q) use ($idRegion) { $q->where('id', $idRegion); })->get(); $teamPenilai = $userTeam->flatMap(function ($team) { return $team->teamsUsers->filter(function ($teamUser) { return $teamUser->user->roles->contains(function ($role) { return $role->name === 'surveyor' || $role->name === 'surveyor-penilai' || $role->name === 'administrator'; }); })->map(function ($teamUser) { return $teamUser->user; }); })->unique('id'); $existingTeamIds = $userTeam->pluck('id')->toArray(); $updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])->whereNotIn( 'id', $existingTeamIds, )->get(); $regionName = null; foreach ($userTeam as $item) { $regionName = $item->regions; } $penilaian = Penilaian::where('nomor_registrasi', $permohonan->nomor_registrasi)->first(); $penilaianTeam = collect(); if ($penilaian && $penilaian->id) { $penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get(); } return view( 'lpj::penilaian.form', compact( 'permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName', 'updateTeamPenilai', 'penilaianTeam', ), ); } /** * Remove the specified resource from storage. */ public function revisi(PenilaianRequest $request, $nomor_registrasi) { $validatedData = $request->validated(); if ($validatedData) { try { if (isset($validatedData['dokumen']) && $request->hasFile('dokumen')) { $file_name = $validatedData['dokumen']->getClientOriginalName(); $validatedData['dokumen']->storeAs('public/dokumen_revisi', $file_name); } $dataToUpdate = [ 'keterangan' => $validatedData['keterangan'], 'dokumen' => 'dokumen_revisi/' . $file_name, 'status' => 'revisi', ]; $permohonan = Permohonan::where('nomor_registrasi', $nomor_registrasi)->first(); $permohonan->update($dataToUpdate); return redirect()->route('penilaian.index')->with('success', 'Penilaian berhasil direvisi'); } catch (Exception $e) { return redirect()->route('penilaian.index')->with('error', $e->getMessage()); } } } public function dataForDatatables(Request $request) { if (is_null($this->user) || !$this->user->can('debitur.view')) { } $query = Permohonan::query(); 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->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); $q->orWhere('status', 'LIKE', '%' . $search . '%'); }); } $query->whereIn('status', ['registered', 'registrasi-final']); // 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'); $column = $request->get('sortField'); $query->orderBy($column, $order); } $totalRecords = $query->count(); $size = $request->get('size', 10); if ($size == 0) { $size = 10; } if ($request->has('page') && $request->has('size')) { $page = $request->get('page', 1); $offset = ($page - 1) * $size; $query->skip($offset)->take($size); } $filteredRecords = $query->count(); $data = $query->with( ['user', 'debiture', 'branch', 'tujuanPenilaian', 'region.teams.teamsUsers.user'], )->get(); $pageCount = ceil($totalRecords / $size); $currentPage = max(1, $request->get('page', 1)); return response()->json([ 'draw' => $request->get('draw'), 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, 'page' => $currentPage, 'totalCount' => $totalRecords, 'data' => $data, ]); } public function otorisator(Request $request) { $type = $request->route('type'); $headers = [ 'pelaporan' => 'Pelaporan', 'pembayaran' => 'Pembayaran', 'pembatalan' => 'Pembatalan', 'sla' => 'SLA', ]; $header = $headers[$type] ?? 'Pelaporan'; return view('lpj::penilaian.otorisator.index', compact('header')); } public function show($id, $type) { $headers = [ 'Pelaporan' => 'Pelaporan', 'Pembayaran' => 'Pembayaran', 'Pembatalan' => 'Pembatalan', 'SLA' => 'SLA', ]; $header = $headers[$type] ?? 'Pelaporan'; $permohonan = Permohonan::find($id); return view('lpj::penilaian.otorisator.show', compact('permohonan', 'header')); } public function otorisatorUpdate(Request $request, $id, $context) { $permohonan = Permohonan::find($id); if (!$permohonan) { return response()->json([ 'message' => 'Data permohonan tidak ditemukan.', ], 404); } switch (strtolower($context)) { case 'pembayaran': $newStatus = $permohonan->status_bayar === 'sudah_bayar' ? 'belum_bayar' : 'sudah_bayar'; $permohonan->update([ 'status_bayar' => $newStatus, 'keterangan' => $request->message, ]); break; case 'pembatalan': $permohonan->update([ 'status' => 'batal', 'keterangan' => $request->message, ]); break; case 'pelaporan': if (Auth::user()->roles[0]->name === 'senior-officer') { $permohonan->update([ 'status' => 'proses-laporan', 'approval_so' => Auth::user()->id, 'approval_so_at' => now(), 'keterangan' => $request->message, ]); } elseif (Auth::user()->roles[0]->name === 'EO Appraisal') { $permohonan->update([ 'status' => 'proses-laporan', 'approval_eo' => Auth::user()->id, 'approval_eo_at' => now(), 'keterangan' => $request->message, ]); } elseif (Auth::user()->roles[0]->name === 'DD Appraisal') { $permohonan->update([ 'status' => 'proses-laporan', 'approval_dd' => Auth::user()->id, 'approval_dd_at' => now(), 'keterangan' => $request->message, ]); } break; case 'sla': $permohonan->update([ 'status' => 'proses-sla', 'keterangan' => $request->message, ]); break; default: return response()->json([ 'message' => 'Konteks otorisasi tidak valid.', ], 400); } return response()->json([ 'message' => 'Otorisasi berhasil dilakukan.', 'data' => $permohonan, ]); } public function dataForAuthorization(Request $request, $otorisator) { if (is_null($this->user) || !$this->user->can('debitur.view')) { // abort(403, 'Sorry! You are not allowed to view users.'); } // Tentukan status berdasarkan otorisator $status = match ($otorisator) { 'Pelaporan' => 'proses-laporan', 'Pembayaran' => 'proses', 'Pembatalan' => 'batal', 'SLA' => 'freeze', default => '', }; $query = Permohonan::query(); // Pencarian berdasarkan parameter search 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->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); $q->orWhere('status', 'LIKE', '%' . $search . '%'); }); } if (!empty($otorisator)) { if ($status == 'proses') { $query->whereIn('status_bayar', ['sudah_bayar', 'belum_bayar']); } elseif ($status == 'proses-laporan') { $query->whereRaw('LOWER(status) = ?', [strtolower($status)]); } elseif ($status == 'batal') { $query->whereRaw('LOWER(status) = ?', [strtolower($status)]); } elseif ($status == 'freeze') { $query->whereRaw('LOWER(status) = ?', [strtolower($status)]); } } // Filter berdasarkan region user yang login if (Auth::user()->hasRole('senior-officer')) { $query->whereHas('region.teams.teamsUsers', function ($q) { $q->where('user_id', Auth::id()); }); } // Sorting berdasarkan sortField dan sortOrder if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); $query->orderBy($column, $order); } // Hitung total records $totalRecords = $query->count(); // Pagination (default page size 10) $size = $request->get('size', 10); if ($size == 0) { $size = 10; } if ($request->has('page') && $request->has('size')) { $page = $request->get('page', 1); $offset = ($page - 1) * $size; $query->skip($offset)->take($size); } // Filtered records $filteredRecords = $query->count(); // Ambil data dengan relasi $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'approveSo'])->get(); // Hitung jumlah halaman $pageCount = ceil($totalRecords / $size); // Ambil current page $currentPage = max(1, $request->get('page', 1)); // Return JSON response return response()->json([ 'draw' => $request->get('draw'), 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, 'page' => $currentPage, 'totalCount' => $totalRecords, 'data' => $data, ]); } public function view_laporan(Request $request) { $id = $request->permohonanId; $documentId = $request->query('documentId'); $jaminanId = $request->query('jaminanId'); $permohonan = $this->surveyorController->getPermohonanJaminanId($id, $documentId, $jaminanId); $basicData = $this->surveyorController->getCommonData(); $inspeksi = Inspeksi::where('permohonan_id', $id)->where('dokument_id', $documentId)->first(); $lpj = Penilai::where('permohonan_id', $id)->where('dokument_id', $documentId)->first(); $forminspeksi = null; $lpjData = null; if ($inspeksi) { $forminspeksi = json_decode($inspeksi->data_form, true); } if ($lpj) { $lpjData = json_decode($lpj->lpj, true); } return view('lpj::penilaian.laporan-so', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi', 'lpjData')); } public function storePenilaiLaporan(Request $request) { DB::beginTransaction(); try { $validatedRequest = app(FormSurveyorRequest::class); $this->surveyorController->store($validatedRequest); $data = [ 'luas_tanah_penilai' => $request->input('luas_tanah_penilai'), 'nilai_tanah_1' => $request->input('nilai_tanah_1'), 'nilai_tanah_2' => $request->input('nilai_tanah_2'), 'luas_bangunan_penilai' => $request->input('luas_bangunan_penilai'), 'nilai_bangunan_1' => $request->input('nilai_bangunan_1'), 'nilai_bangunan_2' => $request->input('nilai_bangunan_2'), 'sarana_pelengkap_penilai' => $request->input('sarana_pelengkap_penilai'), 'nilai_sarana_pelengkap_1' => $request->input('nilai_sarana_pelengkap_1'), 'nilai_sarana_pelengkap_2' => $request->input('nilai_sarana_pelengkap_2'), 'total_nilai_pasar_wajar' => $request->input('total_nilai_pasar_wajar'), 'likuidasi' => $request->input('likuidasi'), 'likuidasi_nilai_1' => $request->input('likuidasi_nilai_1'), 'likuidasi_nilai_2' => $request->input('likuidasi_nilai_2'), 'asuransi_luas_bangunan' => $request->input('asuransi_luas_bangunan'), 'asuransi_nilai_1' => $request->input('asuransi_nilai_1'), 'asuransi_nilai_2' => $request->input('asuransi_nilai_2'), ]; // Update atau buat data baru Penilai::updateOrCreate( [ 'permohonan_id' => $request->permohonanId, 'dokument_id' => $request->documentId, 'inspeksi_id' => $request->inspeksiId, ], [ 'lpj' => json_encode($data), ] ); DB::commit(); return response()->json([ 'success' => true, 'message' => 'Berhasil Update Laporan penilai', 'data' => $request->all(), ], 200); } catch (\Throwable $e) { DB::rollBack(); return response()->json([ 'success' => false, 'message' => 'Terjadi kesalahan', 'error' => $e->getMessage() ], 500); } } }