From afe056336169464af2a567eaece73d94d6689b44 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Mon, 23 Dec 2024 22:46:42 +0700 Subject: [PATCH] Tambah kolom approval pada tabel permohonan - Menambahkan kolom approval_eo, approval_dd, dan approval_so beserta timestamp terkait di tabel permohonan. - Memperluas fungsionalitas model dan controller untuk mendukung kolom approval baru. --- app/Http/Controllers/PenilaianController.php | 941 +++++++++--------- app/Models/Permohonan.php | 19 + ...dd_approval_fields_to_permohonan_table.php | 43 + .../views/penilaian/otorisator/show.blade.php | 31 + 4 files changed, 571 insertions(+), 463 deletions(-) create mode 100644 database/migrations/2024_12_23_151733_add_approval_fields_to_permohonan_table.php diff --git a/app/Http/Controllers/PenilaianController.php b/app/Http/Controllers/PenilaianController.php index b7d4ed6..0013891 100644 --- a/app/Http/Controllers/PenilaianController.php +++ b/app/Http/Controllers/PenilaianController.php @@ -1,546 +1,561 @@ validated(); + /** + * Store a newly created resource in storage. + */ - if ($validatedData) { + 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(); - $penilaian = Penilaian::create($validatedData); - $validatedData['penilaian_id'] = $penilaian->id; + $penilaianId = $penilaian->id; - $teams_ids = []; - $user_ids = []; - $roles = []; + $penilainTeam = PenilaianTeam::where('penilaian_id', $penilaianId)->get(); - 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, + foreach ($penilainTeam as $item) { + if ($item->role === 'surveyor' && $item->user_id === null) { + $item->update([ + 'user_id' => $request->surveyor_id, + 'role' => 'surveyor', ]); } - $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, + if ($item->role === 'penilai' && $item->user_id === null) { + $item->update([ + 'user_id' => $request->penilai_id, + 'role' => 'penilai', ]); } - - $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 = Permohonan::where('nomor_registrasi', $request->nomor_registrasi); $permohonan->update([ - 'status' => $status, + 'status' => 'assign', ]); - DB::commit(); return response()->json(['success' => true, 'message' => 'Data berhasil disimpan'], 200); } catch (Exception $e) { DB::rollBack(); - - return response()->json(['error' => $e->getMessage()]); + return response()->json(['success' => false, 'error' => $e->getMessage()]); } } - } - /** - * Show the form for creating a new resource. - */ - public function create($id) - { - return view('lpj::penilaian.form'); - } + /** + * 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); - /** - * Update the specified resource in storage. - */ - public function update(Request $request, $id) - { - try { - DB::beginTransaction(); - $penilaian = Penilaian::where('nomor_registrasi', $request->nomor_registrasi)->first(); + $idPenilaian = $permohonan->jenis_penilaian_id; + $idRegion = $permohonan->region_id; - $penilaianId = $penilaian->id; + $jenisPenilaian = JenisPenilaian::find($idPenilaian); - $penilainTeam = PenilaianTeam::where('penilaian_id', $penilaianId)->get(); + $userTeam = Teams::with(['regions', 'teamsUsers.user'])->whereHas('regions', function ($q) use ($idRegion) { + $q->where('id', $idRegion); + })->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'; + $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; }); - })->map(function ($teamUser) { - return $teamUser->user; - }); - })->unique('id'); + })->unique('id'); - $existingTeamIds = $userTeam->pluck('id')->toArray(); + $existingTeamIds = $userTeam->pluck('id')->toArray(); - $updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user']) - ->whereNotIn('id', $existingTeamIds) - ->get(); + $updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])->whereNotIn( + 'id', + $existingTeamIds, + )->get(); - $regionName = null; - foreach ($userTeam as $item) { - $regionName = $item->regions; + $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', + ), + ); } - $penilaian = Penilaian::where('nomor_registrasi', $permohonan->nomor_registrasi)->first(); + /** + * Remove the specified resource from storage. + */ - $penilaianTeam = collect(); - if ($penilaian && $penilaian->id) { - $penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get(); - } + 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); + } - return view('lpj::penilaian.form', compact('permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName', 'updateTeamPenilai', 'penilaianTeam')); - } - /** - * Remove the specified resource from storage. - */ + $dataToUpdate = [ + 'keterangan' => $validatedData['keterangan'], + 'dokumen' => 'dokumen_revisi/' . $file_name, + 'status' => 'revisi', + ]; - public function revisi(PenilaianRequest $request, $nomor_registrasi) - { - $validatedData = $request->validated(); - if ($validatedData) { - try { + $permohonan = Permohonan::where('nomor_registrasi', $nomor_registrasi)->first(); - if (isset($validatedData['dokumen']) && $request->hasFile('dokumen')) { - $file_name = $validatedData['dokumen']->getClientOriginalName(); - $validatedData['dokumen']->storeAs('public/dokumen_revisi', $file_name); + $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()); } - - $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')) { + } - public function dataForDatatables(Request $request) - { + $query = Permohonan::query(); - if (is_null($this->user) || !$this->user->can('debitur.view')) { + 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']); - $query = Permohonan::query(); + // 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('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 ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } - $query->whereIn('status', ['registered', 'registrasi-final']); + $totalRecords = $query->count(); - // Filter berdasarkan role - if (Auth::user()->roles[0]->name !== 'administrator') { - $query->whereHas('region.teams.teamsUsers.user', function ($q) { - $q->where('id', Auth::user()->id); - }); - } + $size = $request->get('size', 10); + if ($size == 0) { + $size = 10; + } - if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { - $order = $request->get('sortOrder'); - $column = $request->get('sortField'); - $query->orderBy($column, $order); - } + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page', 1); + $offset = ($page - 1) * $size; - $totalRecords = $query->count(); + $query->skip($offset)->take($size); + } - $size = $request->get('size', 10); - if ($size == 0) { - $size = 10; - } + $filteredRecords = $query->count(); + $data = $query->with( + ['user', 'debiture', 'branch', 'tujuanPenilaian', 'region.teams.teamsUsers.user'], + )->get(); - if ($request->has('page') && $request->has('size')) { - $page = $request->get('page', 1); - $offset = ($page - 1) * $size; + $pageCount = ceil($totalRecords / $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) { + $currentPage = max(1, $request->get('page', 1)); return response()->json([ - 'message' => 'Data permohonan tidak ditemukan.' - ], 404); + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $data, + ]); } - switch (strtolower($context)) { - case 'pembayaran': - $newStatus = $permohonan->status_bayar === 'sudah_bayar' ? 'belum_bayar' : 'sudah_bayar'; + public function otorisator(Request $request) + { + $type = $request->route('type'); + $headers = [ + 'pelaporan' => 'Pelaporan', + 'pembayaran' => 'Pembayaran', + 'pembatalan' => 'Pembatalan', + 'sla' => 'SLA', + ]; - $permohonan->update([ - 'status_bayar' => $newStatus, - 'keterangan' => $request->message - ]); - break; + $header = $headers[$type] ?? 'Pelaporan'; - case 'pembatalan': - $permohonan->update([ - 'status' => 'batal', - 'keterangan' => $request->message - ]); - break; + return view('lpj::penilaian.otorisator.index', compact('header')); + } - case 'pelaporan': - $permohonan->update([ - 'status' => 'proses-laporan', - 'keterangan' => $request->message - ]); - break; + public function show($id, $type) + { + $headers = [ + 'Pelaporan' => 'Pelaporan', + 'Pembayaran' => 'Pembayaran', + 'Pembatalan' => 'Pembatalan', + 'SLA' => 'SLA', + ]; - case 'sla': + $header = $headers[$type] ?? 'Pelaporan'; + $permohonan = Permohonan::find($id); - $permohonan->update([ - 'status' => 'proses-sla', - 'keterangan' => $request->message - ]); - break; - - default: + 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' => '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)]); + '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, + ]); } - // Filter berdasarkan region user yang login - $query->whereHas('region.teams.teamsUsers', function ($q) { - $q->where('user_id', Auth::id()); - }); + + 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.'); + } - // 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); + // 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', '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, + ]); } - // 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, - ]); } - - -} diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php index 5d086b5..eac4ad8 100644 --- a/app/Models/Permohonan.php +++ b/app/Models/Permohonan.php @@ -44,6 +44,25 @@ 'approve_keterangan_bayar', 'approve_bayar_by', 'approve_bayar_at', + + 'approval_eo', + 'approval_eo_at', + 'approval_dd', + 'approval_dd_at', + 'approval_so', + 'approval_so_at', + ]; + + protected $dates = [ + 'tanggal_permohonan', + 'authorized_at', + 'created_at', + 'updated_at', + 'registrasi_at', + 'approve_bayar_at', + 'approval_eo_at', + 'approval_dd_at', + 'approval_so_at', ]; protected static function boot() diff --git a/database/migrations/2024_12_23_151733_add_approval_fields_to_permohonan_table.php b/database/migrations/2024_12_23_151733_add_approval_fields_to_permohonan_table.php new file mode 100644 index 0000000..f814764 --- /dev/null +++ b/database/migrations/2024_12_23_151733_add_approval_fields_to_permohonan_table.php @@ -0,0 +1,43 @@ +boolean('approval_eo')->default(false)->after('status'); + $table->timestamp('approval_eo_at')->nullable()->after('approval_eo'); + + $table->boolean('approval_dd')->default(false)->after('approval_eo_at'); + $table->timestamp('approval_dd_at')->nullable()->after('approval_dd'); + + $table->boolean('approval_so')->default(false)->after('approval_dd_at'); + $table->timestamp('approval_so_at')->nullable()->after('approval_so'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('permohonan', function (Blueprint $table) { + $table->dropColumn([ + 'approval_eo', 'approval_eo_at', + 'approval_dd', 'approval_dd_at', + 'approval_so', 'approval_so_at' + ]); + }); + } +} diff --git a/resources/views/penilaian/otorisator/show.blade.php b/resources/views/penilaian/otorisator/show.blade.php index 05b1fff..1cc6a38 100644 --- a/resources/views/penilaian/otorisator/show.blade.php +++ b/resources/views/penilaian/otorisator/show.blade.php @@ -13,6 +13,37 @@ @include('lpj::component.detail-jaminan', ['backLink' => 'otorisator.'. $dataHeader . '.index']) + @if($permohonan->approval_so) +
+
+

+ Approval +

+
+ +
+ + + + + + + + + + + + + + + + + + +
Diperiksa Oleh{{ getUser($permohonan->approval_so)->name ?? 'N/A' }}{{ $permohonan->approval_so_at ? formatTanggalIndonesia($permohonan->approval_so_at,1) : 'N/A' }}
Disetujui Oleh (EO){{ getUser($permohonan->approval_eo)->name ?? 'N/A' }}{{ $permohonan->approval_eo_at ? formatTanggalIndonesia($permohonan->approval_eo_at,1) : 'N/A' }}
Disetujui Oleh (DD){{ getUser($permohonan->approval_dd)->name ?? 'N/A' }}{{ $permohonan->approval_dd_at ? formatTanggalIndonesia($permohonan->approval_dd_at,1) : 'N/A' }}
+
+
+ @endif