Merge remote-tracking branch 'origin/feature/senior-officer' into staging

This commit is contained in:
Daeng Deni Mardaeni
2025-03-14 09:24:04 +07:00
7 changed files with 293 additions and 162 deletions

View File

@@ -73,7 +73,8 @@ class ActivityController extends Controller
public function updateTeamAssingment(Request $request) public function updateTeamAssingment(Request $request)
{ {
try { try {
// Validasi input
// dd($request->all());
$validatedData = $request->validate([ $validatedData = $request->validate([
'id' => 'required|integer', // penilaian_id 'id' => 'required|integer', // penilaian_id
'team_member_id' => 'nullable|integer', 'team_member_id' => 'nullable|integer',
@@ -81,6 +82,7 @@ class ActivityController extends Controller
'permohonan_id' => 'required|integer', 'permohonan_id' => 'required|integer',
'user_id' => 'required|integer', 'user_id' => 'required|integer',
'team_id' => 'required|integer', 'team_id' => 'required|integer',
'penugasan' => 'required|string',
], [ ], [
'team_member_id.required_without' => 'Field team harus diisi.', 'team_member_id.required_without' => 'Field team harus diisi.',
'.required_without' => 'Field harus diisi.', '.required_without' => 'Field harus diisi.',
@@ -93,6 +95,7 @@ class ActivityController extends Controller
$permohonanId = $validatedData['permohonan_id']; $permohonanId = $validatedData['permohonan_id'];
$userId = $validatedData['user_id']; $userId = $validatedData['user_id'];
$teamId = $validatedData['team_id']; $teamId = $validatedData['team_id'];
$penugasan = $validatedData['penugasan'];
// Cek apakah permohonan ada // Cek apakah permohonan ada
$permohonan = Permohonan::findOrFail($permohonanId); $permohonan = Permohonan::findOrFail($permohonanId);
@@ -106,10 +109,11 @@ class ActivityController extends Controller
// } // }
// Ambil tim berdasarkan penilaian_id dan user_id // Ambil tim berdasarkan penilaian_id dan user_id
if ($penugasan === 'sama') {
$teams = PenilaianTeam::where('penilaian_id', $penilaianId) $teams = PenilaianTeam::where('penilaian_id', $penilaianId)
->where('user_id', $userId) ->where('user_id', $userId)
->get(); ->get();
// Cek apakah tim ditemukan // Cek apakah tim ditemukan
if ($teams->isEmpty()) { if ($teams->isEmpty()) {
return response()->json([ return response()->json([
@@ -122,15 +126,20 @@ class ActivityController extends Controller
DB::beginTransaction(); DB::beginTransaction();
$updated = false; $updated = false;
$status_permohonan = $permohonan->status;
// Proses update berdasarkan region_id // Proses update berdasarkan region_id
if ($regionId) { if ($regionId) {
foreach ($teams as $team) { foreach ($teams as $team) {
if ($team->role === 'surveyor') { if ($team->role === 'surveyor') {
$team->update([ $team->update([
'team_id' => $regionId, 'team_id' => $regionId,
'user_id' => null]); 'user_id' => null,
'status' => $status_permohonan,
]);
$permohonan->update([ $permohonan->update([
'status' => 'registered']); 'status' => 'reassign'
]);
$updated = true; $updated = true;
} }
@@ -138,9 +147,10 @@ class ActivityController extends Controller
$team->update([ $team->update([
'team_id' => $regionId, 'team_id' => $regionId,
'user_id' => null, 'user_id' => null,
'status' => $status_permohonan
]); ]);
$permohonan->update([ $permohonan->update([
'status' => 'registered', 'status' => 'reassign',
'region_id' => $regionId, 'region_id' => $regionId,
]); ]);
$updated = true; $updated = true;
@@ -157,6 +167,45 @@ class ActivityController extends Controller
} }
} }
} }
}
if ($penugasan === 'surveyor' || $penugasan === 'penilai') {
$teams = PenilaianTeam::where('penilaian_id', $penilaianId)
->where('user_id', $userId)
->where('role', $penugasan)
->first();
// Cek apakah tim ditemukan
if (!$teams) {
return response()->json([
'status' => 'error',
'message' => 'Data tim tidak ditemukan.',
]);
}
// Mulai transaksi
DB::beginTransaction();
$updated = false;
// Proses update berdasarkan region_id
if ($regionId) {
$teams->update([
'team_id' => $regionId,
'user_id' => null
]);
$permohonan->update([
'status' => $status_permohonan,
'region_id' => $regionId,
]);
$updated = true;
}
// Proses update berdasarkan team_member_id
if ($teamMemberId) {
$teams->update(['user_id' => $teamMemberId]);
$updated = true;
}
}
if ($updated) { if ($updated) {
@@ -306,7 +355,7 @@ class ActivityController extends Controller
} }
// Filter for specific roles // Filter for specific roles
if (in_array($userRole, ['surveyor', 'surveyor-penilai'])) { if (in_array($userRole, ['surveyor', 'penilai'])) {
$query->whereHas('penilaian.userPenilai', function ($q) use ($user) { $query->whereHas('penilaian.userPenilai', function ($q) use ($user) {
$q->where('user_id', $user->id); $q->where('user_id', $user->id);
}); });
@@ -451,17 +500,17 @@ class ActivityController extends Controller
$hari = $hariPaparan = 0; $hari = $hariPaparan = 0;
if($type_report == "sederhana"){ if ($type_report == "sederhana") {
$hari = 2; $hari = 2;
$item->paparan = 'Tidak Ada'; $item->paparan = 'Tidak Ada';
} else{ } else {
if ($plafond == '< 2M') { if ($plafond == '< 2M') {
$item->paparan = 'Tidak Ada'; $item->paparan = 'Tidak Ada';
$hari = 3; $hari = 3;
}else if($plafond == '2 M - 5 M'){ } elseif ($plafond == '2 M - 5 M') {
$hari = 3; $hari = 3;
$hariPaparan = 2; $hariPaparan = 2;
}else { } else {
$hari = 5; $hari = 5;
$hariPaparan = 3; $hariPaparan = 3;
} }
@@ -495,7 +544,7 @@ class ActivityController extends Controller
if (!$tanggalMulai instanceof Carbon) { if (!$tanggalMulai instanceof Carbon) {
$tanggalMulai = Carbon::parse($tanggalMulai); $tanggalMulai = Carbon::parse($tanggalMulai);
} }
$hariKerjaBerikutnya = hitungHariKerja($tanggalMulai->toDateString(),$tanggalMulai->copy()->addDays(1)); $hariKerjaBerikutnya = hitungHariKerja($tanggalMulai->toDateString(), $tanggalMulai->copy()->addDays(1));
$hariKerjaBerikutnya = max($hariKerjaBerikutnya, 1); $hariKerjaBerikutnya = max($hariKerjaBerikutnya, 1);
$tanggalMulai = $tanggalMulai->copy()->addDays($hariKerjaBerikutnya); $tanggalMulai = $tanggalMulai->copy()->addDays($hariKerjaBerikutnya);

View File

@@ -558,6 +558,7 @@ class PenilaiController extends Controller
$query = Permohonan::query(); $query = Permohonan::query();
// Apply search filter if provided // Apply search filter if provided
$query = $query->orderBy('nomor_registrasi', 'desc');
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$columns = ['debiture.name', 'branch.name', 'user.name', 'tujuanPenilaian.name', 'jenisfasilitasKredit.name']; $columns = ['debiture.name', 'branch.name', 'user.name', 'tujuanPenilaian.name', 'jenisfasilitasKredit.name'];
@@ -575,7 +576,7 @@ class PenilaiController extends Controller
if (!Auth::user()->hasRole('administrator')) { if (!Auth::user()->hasRole('administrator')) {
$query->whereHas('penilaian.userPenilai', function ($q) { $query->whereHas('penilaian.userPenilai', function ($q) {
$q $q
->where('role', 'penilai') ->where('role', ['surveyor','penilai'])
->where('user_id', Auth::user()->id); ->where('user_id', Auth::user()->id);
}); });
} }

View File

@@ -253,7 +253,7 @@ class PenilaianController extends Controller
$teamPenilai = $userTeam->flatMap(function ($team) { $teamPenilai = $userTeam->flatMap(function ($team) {
return $team->teamsUsers->filter(function ($teamUser) { return $team->teamsUsers->filter(function ($teamUser) {
return $teamUser->user->roles->contains(function ($role) { return $teamUser->user->roles->contains(function ($role) {
return $role->name === 'surveyor' || $role->name === 'surveyor-penilai' || $role->name === 'administrator'; return $role->name === 'surveyor' || $role->name === 'penilai' || $role->name === 'administrator';
}); });
})->map(function ($teamUser) { })->map(function ($teamUser) {
return $teamUser->user; return $teamUser->user;
@@ -279,6 +279,8 @@ class PenilaianController extends Controller
$penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get(); $penilaianTeam = PenilaianTeam::where('penilaian_id', $penilaian->id)->get();
} }
// dd($penilaianTeam);
return view( return view(
'lpj::penilaian.form', 'lpj::penilaian.form',
compact( compact(
@@ -347,8 +349,9 @@ class PenilaianController extends Controller
$query->whereIn('status', ['registered', 'registrasi-final', 'reassign']); $query->whereIn('status', ['registered', 'registrasi-final', 'reassign']);
// Filter berdasarkan role
if (Auth::user()->roles[0]->name !== 'administrator') { if (Auth::user()->roles[0]->name !== 'administrator') {
$query->whereHas('region.teams.teamsUsers.user', function ($q) { $query->whereHas('region.teams.teamsUsers.user', function ($q) {
$q->where('id', Auth::user()->id); $q->where('id', Auth::user()->id);
}); });
@@ -376,7 +379,8 @@ class PenilaianController extends Controller
$filteredRecords = $query->count(); $filteredRecords = $query->count();
$data = $query->with( $data = $query->with(
['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisPenilaian', 'region.teams.teamsUsers.user'], ['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisPenilaian', 'region.teams.teamsUsers.user',
]
)->get(); )->get();
$pageCount = ceil($totalRecords / $size); $pageCount = ceil($totalRecords / $size);
@@ -739,7 +743,7 @@ class PenilaianController extends Controller
'nilaiPlafond', 'nilaiPlafond',
'penilaian.userPenilai' => function ($q) { 'penilaian.userPenilai' => function ($q) {
$q->where('role', 'penilai')->with(['user', 'team.regions']); $q->where('role', 'penilai')->with(['user', 'team.regions']);
}, },
'penilai', 'penilai',
'approveSo', 'approveSo',
'approveEo', 'approveEo',
@@ -900,7 +904,7 @@ class PenilaianController extends Controller
public function revisiLaporan(Request $request, $id) public function revisiLaporan(Request $request, $id)
{ {
// dd($id); // dd($id);
if($request->dataHeader=='Paparan' || $request->dataHeader=='Freze SLA'){ if ($request->dataHeader == 'Paparan' || $request->dataHeader == 'Freze SLA') {
$authorization = Authorization::find($id); $authorization = Authorization::find($id);
$permohonan = Permohonan::find($authorization->permohonan_id); $permohonan = Permohonan::find($authorization->permohonan_id);
} else { } else {
@@ -914,13 +918,13 @@ class PenilaianController extends Controller
} }
$status = 'revisi-paparan'; $status = 'revisi-paparan';
}else if($permohonan->status === 'request-freeze'){ } elseif ($permohonan->status === 'request-freeze') {
if ($authorization) { if ($authorization) {
$authorization->delete(); $authorization->delete();
} }
$status = 'reject-freeze'; $status = 'reject-freeze';
}elseif ($permohonan->status === 'proses-laporan' && $userRole === 'EO Appraisal') { } elseif ($permohonan->status === 'proses-laporan' && $userRole === 'EO Appraisal') {
$permohonan->update([ $permohonan->update([
'approval_so' => 0, 'approval_so' => 0,
'approval_so_at' => null, 'approval_so_at' => null,

View File

@@ -2008,7 +2008,7 @@ class SurveyorController extends Controller
} }
$query = Permohonan::query(); $query = Permohonan::query();
$query = $query->orderBy('nomor_registrasi', 'desc');
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$query->where(function ($q) use ($search) { $query->where(function ($q) use ($search) {
@@ -2028,7 +2028,7 @@ class SurveyorController extends Controller
if (!Auth::user()->hasRole('administrator')) { if (!Auth::user()->hasRole('administrator')) {
$query->whereHas('penilaian.userPenilai', function ($q) { $query->whereHas('penilaian.userPenilai', function ($q) {
$q->where('user_id', Auth::user()->id); $q->where('user_id', Auth::user()->id);
$q->where('role', 'surveyor'); $q->where('role', ['surveyor', 'penilai']);
}); });
} }

View File

@@ -292,10 +292,16 @@
}, },
actions: { actions: {
title: 'Action', title: 'Action',
render: (item, data) => ` render: (item, data) => {
<a class="btn btn-sm btn-icon btn-clear btn-primary" onclick="updateTeam(${data.user_penilai[0].penilaian_id}, ${data.permohonan.id}, ${data.user_penilai[0].user_id}, ${data.user_penilai[0].team_id})" title="Ganti Team"> const roles = data.user_penilai.map(d => d.role)
let htmlData = ''
htmlData = `<a class="btn btn-sm btn-icon btn-clear btn-primary" onclick="updateTeam(${data.user_penilai[0].penilaian_id}, ${data.permohonan.id}, ${data.user_penilai[0].user_id}, ${data.user_penilai[0].team_id}, '${roles}')" title="Ganti Team">
<i class="ki-filled ki-user-edit"></i> <i class="ki-filled ki-user-edit"></i>
</a>`, </a>`
return htmlData;
},
}, },
}, },
}; };
@@ -326,83 +332,153 @@
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
function updateTeam(penilaaniId, permohonanId, userId, teamId) { function updateTeam(penilaaniId, permohonanId, userId, teamId, roles) {
const selectCategory = () => { const selectCategory = () => {
Swal.fire({ Swal.fire({
title: 'Pilih Kategori', title: 'Pilih Kategori',
input: 'select', html: `
inputOptions: { <select id="categorySelect" class="input">
team: 'Pilih dari Team', <option value="" selected disabled>Pilih kategori Pengganti</option>
region: 'Pilih dari Wilayah' <option value="team">Pilih dari Team</option>
}, <option value="region">Pilih dari Wilayah</option>
inputPlaceholder: 'Pilih kategori Pengganti', </select>
`,
icon: 'warning', icon: 'warning',
showCancelButton: true, showCancelButton: true,
confirmButtonColor: '#3085d6', confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33', cancelButtonColor: '#d33',
confirmButtonText: 'Lanjut', confirmButtonText: 'Lanjut',
cancelButtonText: 'Batal', cancelButtonText: 'Batal',
preConfirm: () => {
const selectedCategory = document.getElementById('categorySelect').value;
if (!selectedCategory) {
Swal.showValidationMessage('Anda harus memilih kategori!');
}
return selectedCategory;
}
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
const selectedCategory = result.value; const selectedCategory = result.value;
let subOptions = {}; let subOptionsHtml = '';
if (selectedCategory === 'team') { if (selectedCategory === 'team') {
subOptions = { if (roles === 'surveyor' || roles === 'penilai') {
subOptionsHtml = `
<div class="flex grid gap-2">
<select id="subOptionsPenugasan" class="input" disabled>
<option value="${roles}" selected>${roles}</option>
</select>
<select id="subOptionsSelect" class="input">
<option value="" selected disabled>Pilih Anggota Tim</option>
@foreach ($teamsActivity as $item) @foreach ($teamsActivity as $item)
{{ $item->user->id }}: '{{ $item->user->name }}', <option value="{{ $item->user->id }}">{{ $item->user->name }}</option>
@endforeach @endforeach
}; </select>
</div>
`;
} else {
subOptionsHtml = `
<div class="flex grid gap-2">
<select id="subOptionsPenugasan" class="input">
<option value="" selected disabled>Pilih Penugasan</option>
<option value="surveyor">Surveyor</option>
<option value="penilai">Penilai</option>
<option value="sama">Penilai dan Surveyor Sama</option>
</select>
<select id="subOptionsSelect" class="input">
<option value="" selected disabled>Pilih Anggota Tim</option>
@foreach ($teamsActivity as $item)
<option value="{{ $item->user->id }}">{{ $item->user->name }}</option>
@endforeach
</select>
</div>
`;
}
} else if (selectedCategory === 'region') { } else if (selectedCategory === 'region') {
subOptions = { if (roles === 'surveyor' || roles === 'penilai') {
@foreach ($teamPenilai as $item) subOptionsHtml = `
{{ $item->regions->id }}: '{{ $item->regions->name }}', <div class="flex grid gap-2">
<select id="subOptionsPenugasan" class="input" disabled>
<option value="${roles}" selected>${roles}</option>
</select>
<select id="subOptionsSelect" class="input">
<option value="" selected disabled>Pilih Anggota Tim</option>
@foreach ($teamsActivity as $item)
<option value="{{ $item->user->id }}">{{ $item->user->name }}</option>
@endforeach @endforeach
}; </select>
</div>
`;
} else {
subOptionsHtml = `
<div>
<select id="subOptionsPenugasan" class="input">
<option value="" selected disabled>Pilih Penugasan</option>
<option value="surveyor">Surveyor</option>
<option value="penilai">Penilai</option>
<option value="sama">Penilai dan Surveyor Sama</option>
</select>
<select id="subOptionsSelect" class="input">
<option value="" selected disabled>Pilih Wilayah</option>
@foreach ($teamPenilai as $item)
<option value="{{ $item->regions->id }}">{{ $item->regions->name }}</option>
@endforeach
</select>
</div>
`;
}
} }
Swal.fire({ Swal.fire({
title: 'Pilih ' + (selectedCategory === 'team' ? 'Anggota Tim' : 'Wilayah'), title: `Pilih ${selectedCategory === 'team' ? 'Anggota Tim' : 'Wilayah'}`,
input: 'select', html: subOptionsHtml,
inputOptions: subOptions,
inputPlaceholder: 'Pilih salah satu ' + (selectedCategory === 'team' ?
'Anggota Tim' : 'Wilayah'),
icon: 'info', icon: 'info',
showCancelButton: true, showCancelButton: true,
confirmButtonColor: '#3085d6', confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33', cancelButtonColor: '#d33',
confirmButtonText: 'Ya', confirmButtonText: 'Ya',
cancelButtonText: 'Kembali', cancelButtonText: 'Kembali',
preConfirm: () => {
const subOptionsPenugasan = document.getElementById('subOptionsPenugasan')?.value;
const subSelected = document.getElementById('subOptionsSelect').value;
if (!subSelected) {
Swal.showValidationMessage('Anda harus memilih opsi!');
return false;
}
return {
penugasan: subOptionsPenugasan || null,
selectedOption: subSelected || null,
};
}
}).then((subResult) => { }).then((subResult) => {
console.log(subResult);
if (subResult.dismiss === Swal.DismissReason.cancel) { if (subResult.dismiss === Swal.DismissReason.cancel) {
// Kembali ke tahap pemilihan kategori
selectCategory(); selectCategory();
} else if (subResult.isConfirmed) { } else if (subResult.isConfirmed) {
if (!subResult.value) { if (!subResult.value) {
Swal.fire('Error!', 'Anda harus memilih opsi sebelum melanjutkan.', Swal.fire('Error!', 'Anda harus memilih opsi sebelum melanjutkan.', 'error');
'error');
return; return;
} }
// Define variables
let token = "{{ csrf_token() }}"; let token = "{{ csrf_token() }}";
let useURL = "{{ URL::to('/activity/update-team') }}"; let useURL = "{{ URL::to('/activity/update-team') }}";
const paramKey = selectedCategory === 'team' ? 'team_member_id' : 'region_id';
// Tentukan tipe parameter berdasarkan kategori
const paramKey = selectedCategory === 'team' ? 'team_member_id' :
'region_id';
// Prepare input data
let input_data = { let input_data = {
_token: token, _token: token,
id: penilaaniId, id: penilaaniId,
[paramKey]: subResult.value, [paramKey]: subResult.value.selectedOption,
penugasan: subResult.value.penugasan,
permohonan_id: permohonanId, permohonan_id: permohonanId,
user_id: userId, user_id: userId,
team_id: teamId, team_id: teamId,
}; };
// AJAX request
$.ajax({ $.ajax({
url: useURL, url: useURL,
type: "PUT", type: "PUT",
@@ -411,8 +487,7 @@
dataType: "json", dataType: "json",
success: function(response) { success: function(response) {
if (response.status === 'success') { if (response.status === 'success') {
Swal.fire('Sukses!', response.message, Swal.fire('Sukses!', response.message, 'success').then(() => {
'success').then(() => {
location.reload(true); location.reload(true);
}); });
} else { } else {
@@ -421,9 +496,7 @@
}, },
error: function(xhr) { error: function(xhr) {
console.error(xhr); console.error(xhr);
Swal.fire('Error!', Swal.fire('Error!', 'Terjadi kesalahan saat memproses permintaan.', 'error');
'Terjadi kesalahan saat memproses permintaan.',
'error');
}, },
}); });
} }
@@ -432,8 +505,8 @@
}); });
}; };
// Mulai dari pemilihan kategori
selectCategory(); selectCategory();
} }
</script> </script>
@endpush @endpush

View File

@@ -57,7 +57,7 @@
<td style="padding: 2px; vertical-align: top;">Tanggal Survey</td> <td style="padding: 2px; vertical-align: top;">Tanggal Survey</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) }}</td> {{ formatTanggalIndonesia($permohonan->penilaian->updated_at) }}</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">User</td> <td style="padding: 2px; vertical-align: top;">User</td>
@@ -115,7 +115,7 @@
<td style="padding: 2px; vertical-align: top;">Waktu Penyelesaian</td> <td style="padding: 2px; vertical-align: top;">Waktu Penyelesaian</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ hitungHariKerja($permohonan->penilaian->tanggal_kunjungan, $tanggalLaporan) }}</td> {{ hitungHariKerja($permohonan->penilaian->updated_at, $tanggalLaporan) }}</td>
</tr> </tr>
</table> </table>
</td> </td>
@@ -183,9 +183,12 @@
</table> </table>
</td> </td>
</tr> </tr>
</table>
<div class="no-break">
<table>
<tr> <tr>
<td style="width: 50%; border: 1px solid #000;"> <td style="width: 50%; border: 1px solid #000;">
A. STATUS KEPEMILIKAN, HUBUNGAN DAN PENGHUNI A. STATUS KEPEMILIKAN, HUBUNGAN DAN PENGHUNI
</td> </td>
@@ -689,7 +692,7 @@
</td> </td>
</tr> </tr>
</table> </table>
</div>
<div class="no-break"> <div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>

View File

@@ -105,10 +105,11 @@
{{ str_replace('_', ' ', $permohonan->status_bayar) }} {{ str_replace('_', ' ', $permohonan->status_bayar) }}
</span> </span>
</div> </div>
</div>
@endif @endif
</div> </div>
</div> </div>
</div>
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->documents as $dokumen)