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': $permohonan->update([ 'status' => 'proses-laporan', '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 $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', 'region.teams.teamsUsers'])->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, ]); } }