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.
This commit is contained in:
Daeng Deni Mardaeni
2024-12-23 22:46:42 +07:00
parent d465a3ea7d
commit afe0563361
4 changed files with 571 additions and 463 deletions

View File

@@ -1,26 +1,25 @@
<?php <?php
namespace Modules\Lpj\Http\Controllers; namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Exception; use Exception;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth;
use Modules\Lpj\Http\Requests\PenilaianRequest; use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\JenisPenilaian; use Modules\Lpj\Http\Requests\PenilaianRequest;
use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\JenisPenilaian;
use Modules\Lpj\Models\PenilaianTeam; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\PenilaianTeam;
use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Teams; use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Models\Regions; use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\TeamsUsers; use Modules\Usermanagement\Models\User;
use Modules\Usermanagement\Models\User;
use Illuminate\Support\Facades\Auth;
class PenilaianController extends Controller class PenilaianController extends Controller
{ {
public $user; public $user;
/** /**
* Display a listing of the resource. * Display a listing of the resource.
*/ */
@@ -75,7 +74,6 @@ class PenilaianController extends Controller
} }
$roles[] = 'surveyor'; $roles[] = 'surveyor';
} }
if ($validatedData['penilai_id'] === 'pilih_dari_region') { if ($validatedData['penilai_id'] === 'pilih_dari_region') {
@@ -103,7 +101,6 @@ class PenilaianController extends Controller
} }
$roles[] = 'penilai'; $roles[] = 'penilai';
} }
foreach ($teams_ids as $key => $teams_id) { foreach ($teams_ids as $key => $teams_id) {
@@ -171,7 +168,6 @@ class PenilaianController extends Controller
'role' => 'penilai', 'role' => 'penilai',
]); ]);
} }
} }
$permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi); $permohonan = Permohonan::where('nomor_registrasi', $request->nomor_registrasi);
@@ -182,7 +178,7 @@ class PenilaianController extends Controller
return response()->json(['success' => true, 'message' => 'Data berhasil disimpan'], 200); return response()->json(['success' => true, 'message' => 'Data berhasil disimpan'], 200);
} catch (Exception $e) { } catch (Exception $e) {
DB::rollBack(); DB::rollBack();
return response()->json([ 'success' => false, 'error' => $e->getMessage()]); return response()->json(['success' => false, 'error' => $e->getMessage()]);
} }
} }
@@ -206,11 +202,9 @@ class PenilaianController extends Controller
$jenisPenilaian = JenisPenilaian::find($idPenilaian); $jenisPenilaian = JenisPenilaian::find($idPenilaian);
$userTeam = Teams::with(['regions', 'teamsUsers.user']) $userTeam = Teams::with(['regions', 'teamsUsers.user'])->whereHas('regions', function ($q) use ($idRegion) {
->whereHas('regions', function ($q) use ($idRegion) {
$q->where('id', $idRegion); $q->where('id', $idRegion);
}) })->get();
->get();
$teamPenilai = $userTeam->flatMap(function ($team) { $teamPenilai = $userTeam->flatMap(function ($team) {
return $team->teamsUsers->filter(function ($teamUser) { return $team->teamsUsers->filter(function ($teamUser) {
@@ -224,9 +218,10 @@ class PenilaianController extends Controller
$existingTeamIds = $userTeam->pluck('id')->toArray(); $existingTeamIds = $userTeam->pluck('id')->toArray();
$updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user']) $updateTeamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])->whereNotIn(
->whereNotIn('id', $existingTeamIds) 'id',
->get(); $existingTeamIds,
)->get();
$regionName = null; $regionName = null;
foreach ($userTeam as $item) { foreach ($userTeam as $item) {
@@ -240,8 +235,20 @@ class PenilaianController extends Controller
$penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get(); $penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get();
} }
return view('lpj::penilaian.form', compact('permohonan', 'teamPenilai', 'jenisPenilaian', 'penilaian', 'regionName', 'updateTeamPenilai', 'penilaianTeam')); return view(
'lpj::penilaian.form',
compact(
'permohonan',
'teamPenilai',
'jenisPenilaian',
'penilaian',
'regionName',
'updateTeamPenilai',
'penilaianTeam',
),
);
} }
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
*/ */
@@ -250,9 +257,7 @@ class PenilaianController extends Controller
{ {
$validatedData = $request->validated(); $validatedData = $request->validated();
if ($validatedData) { if ($validatedData) {
try { try {
if (isset($validatedData['dokumen']) && $request->hasFile('dokumen')) { if (isset($validatedData['dokumen']) && $request->hasFile('dokumen')) {
$file_name = $validatedData['dokumen']->getClientOriginalName(); $file_name = $validatedData['dokumen']->getClientOriginalName();
$validatedData['dokumen']->storeAs('public/dokumen_revisi', $file_name); $validatedData['dokumen']->storeAs('public/dokumen_revisi', $file_name);
@@ -276,12 +281,9 @@ class PenilaianController extends Controller
} }
public function dataForDatatables(Request $request) public function dataForDatatables(Request $request)
{ {
if (is_null($this->user) || !$this->user->can('debitur.view')) { if (is_null($this->user) || !$this->user->can('debitur.view')) {
} }
$query = Permohonan::query(); $query = Permohonan::query();
@@ -329,7 +331,9 @@ class PenilaianController extends Controller
} }
$filteredRecords = $query->count(); $filteredRecords = $query->count();
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'region.teams.teamsUsers.user'])->get(); $data = $query->with(
['user', 'debiture', 'branch', 'tujuanPenilaian', 'region.teams.teamsUsers.user'],
)->get();
$pageCount = ceil($totalRecords / $size); $pageCount = ceil($totalRecords / $size);
@@ -346,12 +350,8 @@ class PenilaianController extends Controller
} }
public function otorisator(Request $request) public function otorisator(Request $request)
{ {
$type = $request->route('type'); $type = $request->route('type');
$headers = [ $headers = [
'pelaporan' => 'Pelaporan', 'pelaporan' => 'Pelaporan',
@@ -382,11 +382,10 @@ class PenilaianController extends Controller
public function otorisatorUpdate(Request $request, $id, $context) public function otorisatorUpdate(Request $request, $id, $context)
{ {
$permohonan = Permohonan::find($id); $permohonan = Permohonan::find($id);
if (!$permohonan) { if (!$permohonan) {
return response()->json([ return response()->json([
'message' => 'Data permohonan tidak ditemukan.' 'message' => 'Data permohonan tidak ditemukan.',
], 404); ], 404);
} }
@@ -397,53 +396,67 @@ class PenilaianController extends Controller
$permohonan->update([ $permohonan->update([
'status_bayar' => $newStatus, 'status_bayar' => $newStatus,
'keterangan' => $request->message 'keterangan' => $request->message,
]); ]);
break; break;
case 'pembatalan': case 'pembatalan':
$permohonan->update([ $permohonan->update([
'status' => 'batal', 'status' => 'batal',
'keterangan' => $request->message 'keterangan' => $request->message,
]); ]);
break; break;
case 'pelaporan': case 'pelaporan':
if(Auth::user()->roles[0]->name === 'senior-officer') {
$permohonan->update([ $permohonan->update([
'status' => 'proses-laporan', 'status' => 'proses-laporan',
'keterangan' => $request->message '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; break;
case 'sla': case 'sla':
$permohonan->update([ $permohonan->update([
'status' => 'proses-sla', 'status' => 'proses-sla',
'keterangan' => $request->message 'keterangan' => $request->message,
]); ]);
break; break;
default: default:
return response()->json([ return response()->json([
'message' => 'Konteks otorisasi tidak valid.' 'message' => 'Konteks otorisasi tidak valid.',
], 400); ], 400);
} }
return response()->json([ return response()->json([
'message' => 'Otorisasi berhasil dilakukan.', 'message' => 'Otorisasi berhasil dilakukan.',
'data' => $permohonan 'data' => $permohonan,
]); ]);
} }
public function dataForAuthorization(Request $request, $otorisator) public function dataForAuthorization(Request $request, $otorisator)
{ {
if (is_null($this->user) || !$this->user->can('debitur.view')) { if (is_null($this->user) || !$this->user->can('debitur.view')) {
// abort(403, 'Sorry! You are not allowed to view users.'); // abort(403, 'Sorry! You are not allowed to view users.');
} }
@@ -489,9 +502,11 @@ class PenilaianController extends Controller
} }
// Filter berdasarkan region user yang login // Filter berdasarkan region user yang login
if(Auth::user()->hasRole('senior-officer')) {
$query->whereHas('region.teams.teamsUsers', function ($q) { $query->whereHas('region.teams.teamsUsers', function ($q) {
$q->where('user_id', Auth::id()); $q->where('user_id', Auth::id());
}); });
}
// Sorting berdasarkan sortField dan sortOrder // Sorting berdasarkan sortField dan sortOrder
@@ -543,4 +558,4 @@ class PenilaianController extends Controller
} }
} }

View File

@@ -44,6 +44,25 @@
'approve_keterangan_bayar', 'approve_keterangan_bayar',
'approve_bayar_by', 'approve_bayar_by',
'approve_bayar_at', '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() protected static function boot()

View File

@@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddApprovalFieldsToPermohonanTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('permohonan', function (Blueprint $table) {
$table->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'
]);
});
}
}

View File

@@ -13,6 +13,37 @@
@include('lpj::component.detail-jaminan', ['backLink' => 'otorisator.'. $dataHeader . '.index']) @include('lpj::component.detail-jaminan', ['backLink' => 'otorisator.'. $dataHeader . '.index'])
@if($permohonan->approval_so)
<div class="card pb-2.5">
<div class="card-header" id="basic_settings">
<h3 class="card-title">
Approval
</h3>
</div>
<div class="card-body">
<table class="table table-border">
<tbody>
<tr>
<td>Diperiksa Oleh</td>
<td>{{ getUser($permohonan->approval_so)->name ?? 'N/A' }}</td>
<td>{{ $permohonan->approval_so_at ? formatTanggalIndonesia($permohonan->approval_so_at,1) : 'N/A' }}</td>
</tr>
<tr>
<td>Disetujui Oleh (EO)</td>
<td>{{ getUser($permohonan->approval_eo)->name ?? 'N/A' }}</td>
<td>{{ $permohonan->approval_eo_at ? formatTanggalIndonesia($permohonan->approval_eo_at,1) : 'N/A' }}</td>
</tr>
<tr>
<td>Disetujui Oleh (DD)</td>
<td>{{ getUser($permohonan->approval_dd)->name ?? 'N/A' }}</td>
<td>{{ $permohonan->approval_dd_at ? formatTanggalIndonesia($permohonan->approval_dd_at,1) : 'N/A' }}</td>
</tr>
</tbody>
</table>
</div>
</div>
@endif
<div> <div>
<div> <div>
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary"> <button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">