From ae15e1983f9c5db1d60fc1df27cb777bd1d2d20f Mon Sep 17 00:00:00 2001 From: majid Date: Thu, 3 Jul 2025 09:51:57 +0700 Subject: [PATCH] feat(rekap-monitoring-so) : tambah rekap monitoring so --- .../LaporanMonitoringSoController.php | 43 ++++ app/Services/LaporanMonitoringSoService.php | 228 ++++++++++++++++++ .../views/laporan-monitoring/index.blade.php | 89 +++++++ .../views/laporan-monitoring/show.blade.php | 211 ++++++++++++++++ 4 files changed, 571 insertions(+) create mode 100644 app/Http/Controllers/LaporanMonitoringSoController.php create mode 100644 app/Services/LaporanMonitoringSoService.php create mode 100644 resources/views/laporan-monitoring/index.blade.php create mode 100644 resources/views/laporan-monitoring/show.blade.php diff --git a/app/Http/Controllers/LaporanMonitoringSoController.php b/app/Http/Controllers/LaporanMonitoringSoController.php new file mode 100644 index 0000000..2e3d9d6 --- /dev/null +++ b/app/Http/Controllers/LaporanMonitoringSoController.php @@ -0,0 +1,43 @@ +laporanMonitoringSoService = $laporanMonitoringSoService; + } + + /** + * Display a listing of the resource. + */ + public function index() + { + $user = auth()->user()->load('roles'); + $result = $this->laporanMonitoringSoService->progresPengerjaanLaporan($user); + return view('lpj::laporan-monitoring.index', compact('result')); + } + + /** + * Show details data. + * @return Response + */ + + public function show($id){ + return view('lpj::laporan-monitoring.show', compact('id')); + } + + + public function dataForDatatablePenilai(Request $request, $id){ + return $this->laporanMonitoringSoService->showDetailsPermohonan($request, $id); + } + +} diff --git a/app/Services/LaporanMonitoringSoService.php b/app/Services/LaporanMonitoringSoService.php new file mode 100644 index 0000000..2eb619f --- /dev/null +++ b/app/Services/LaporanMonitoringSoService.php @@ -0,0 +1,228 @@ +roles->pluck('name')->contains('senior-officer')) { + $userTeam = TeamsUsers::with('team')->firstWhere('user_id', $user->id); + $regionId = $userTeam?->team->regions_id; + $teamId = $userTeam?->teams_id; + } + + + $teamsActivity = TeamsUsers::with(['user', 'team', 'team.regions', 'user.roles']) + ->whereHas('team', function ($q) use ($regionId, $teamId) { + $q->when($regionId, fn ($q) => $q->where('regions_id', $regionId)) + ->when($teamId, fn ($q) => $q->where('id', $teamId)); + }) + ->where('user_id', '!=', $user->id) + ->whereHas('user.roles', fn ($q) => $q->whereIn('name', ['surveyor', 'surveyor-penilai'])) + ->get(); + + $teamId = is_array($teamId) ? $teamId : [$teamId]; + + $teamPenilai = Teams::with(['regions', 'teamsUsers', 'teamsUsers.user'])->whereNotIn( + 'id', + $teamId + )->get(); + + return [ + 'teamsActivity' => $teamsActivity, + 'teamPenilai' => $teamPenilai, + ]; + } + + + public function showDetailsPermohonan($request,$id) + { + $query = Penilaian::with([ + 'permohonan', + 'permohonan.debiture', + 'permohonan.tujuanPenilaian', + 'permohonan.debiture.documents.jenisJaminan', + 'userPenilai' => function ($query) use ($id) { + $query->where('user_id', $id); + }, + 'permohonan.penilai', + 'permohonan.approveEo', + 'permohonan.approveDd', + 'permohonan.approveSo', + + ]) + ->whereHas('userPenilai', function ($q) use ($id) { + $q->where('user_id', $id); + }) + ->whereHas('permohonan', function ($q) { + $q->whereIn('status', [ + 'assign', + 'survey-completed', + 'proses-laporan', + 'paparan', + 'proses-paparan', + 'revisi-laporan', + 'revisi-paparan', + 'survey', + 'proses-survey', + 'request-reschedule', + 'reschedule', + 'rejected-reschedule', + 'approved-reschedule', + 'revisi-survey', + 'revisi-pembayaran' + ]); + }); + + + + // Filter pencarian + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('nomor_registrasi', 'LIKE', "%$search%") + ->orWhere('status', 'LIKE', "%$search%"); + }); + } + + // Sorting + 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 + $size = $request->get('size', 10); + $page = $request->get('page', 1); + $offset = ($page - 1) * $size; + + // Ambil data dengan pagination + $data = $query->skip($offset)->take($size)->get(); + + $data = $data->map(function ($item) { + $jeniAsset = null; + $statusPembayaran = trim(strtolower($item->permohonan->status_bayar ?? '')); + $tujuanPenilaian = $item->permohonan->tujuanPenilaian->name ?? null; + $plafond = $item->permohonan->nilaiPlafond->name ?? null; + + $now = Carbon::now(); + $type_report = $item->permohonan->penilai->type ?? ""; + + $hari = $hariPaparan = 0; + + if ($type_report == "sederhana") { + $hari = 2; + $item->paparan = 'Tidak Ada'; + } else { + if ($plafond == '< 2M') { + $item->paparan = 'Tidak Ada'; + $hari = 3; + } elseif ($plafond == '2 M - 5 M') { + $hari = 3; + $hariPaparan = 2; + } else { + $hari = 5; + $hariPaparan = 3; + } + } + + if ($tujuanPenilaian == 'RAP') { + $hari = 2; + $hariPaparan = 2; + } + + + if ($item->permohonan && $item->permohonan->debiture) { + $jeniAsset = $item->permohonan->debiture->documents->first() ?? null; + } + + /*$hariTambahan = 0; + + if ($tujuanPenilaian == 'RAP') { + $hariTambahan = 2; + } else { + if ($statusPembayaran == 'sudah_bayar') { + $hariTambahan = 1; // H+1 untuk yang sudah bayar + } else { + $hariTambahan = 2; // H+2 untuk yang belum bayar + } + }*/ + + $tanggalMulai = $item->waktu_penilaian; + + if ($tanggalMulai) { + if (!$tanggalMulai instanceof Carbon) { + $tanggalMulai = Carbon::parse($tanggalMulai); + } + $hariKerjaBerikutnya = hitungHariKerja($tanggalMulai->toDateString(), $tanggalMulai->copy()->addDays(1)); + $hariKerjaBerikutnya = max($hariKerjaBerikutnya, 1); + $tanggalMulai = $tanggalMulai->copy()->addDays($hariKerjaBerikutnya); + + // Konversi string tanggal ke objek Carbon jika belum + if (!$tanggalMulai instanceof Carbon) { + $tanggalMulai = Carbon::parse($tanggalMulai); + } + + // Hitung tanggal selesai berdasarkan hari tambahan + $tanggalSelesai = $tanggalMulai->copy()->addDays($hari); + $tanggalPaparan = $tanggalMulai->copy()->addDays($hariPaparan); + + // Hitung hari kerja + $hariKerja = hitungHariKerja($tanggalMulai->toDateString(), $tanggalSelesai->toDateString()); + $hariKerja = max($hariKerja, $hari); + + $hariKerjaPaparan = hitungHariKerja($tanggalMulai->toDateString(), $tanggalPaparan->toDateString()); + $hariKerjaPaparan = max($hariKerjaPaparan, $hariPaparan); + + // Set due date SLA + $dueDateSla = $tanggalMulai->copy()->addDays($hariKerja); + $dueDateSlaPaparan = $tanggalMulai->copy()->addDays($hariKerjaPaparan); + + // Cek apakah sudah melewati due date + /*if ($now->greaterThan($dueDateSla)) { + $item->due_date_sla = null; + } else { + $item->due_date_sla = $dueDateSla->toDateString(); + }*/ + + $item->due_date_sla = $dueDateSla->toDateString(); + $item->paparan = $dueDateSlaPaparan->toDateString(); + } else { + $item->due_date_sla = null; + $item->paparan = null; + + } + + return $item; + }); + + $filteredRecords = $data->count(); + $pageCount = ceil($totalRecords / $size); + + // Return data dalam bentuk JSON + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $page, + 'totalCount' => $totalRecords, + 'data' => $data + ]); + } +} diff --git a/resources/views/laporan-monitoring/index.blade.php b/resources/views/laporan-monitoring/index.blade.php new file mode 100644 index 0000000..e1ebf08 --- /dev/null +++ b/resources/views/laporan-monitoring/index.blade.php @@ -0,0 +1,89 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render('laporan-hasil-penilaian-jaminan-internal-external') }} --}} +@endsection + +@section('content') +
+ + + +
+
+

+ Rekap Progres Pengerjaan Laporan Penilai +

+
+ +
+
+ + + + + + + + + + + @php + $sortedTeamsActivity = $result['teamsActivity']->sortBy(function ($item) { + return $item->team->regions->penilaiTeam + ->filter(function ($penilaiTeam) { + $permohonan = optional($penilaiTeam->penilaian)->permohonan; + return $permohonan !== null; + }) + ->count(); + }); + @endphp + + @foreach ($sortedTeamsActivity as $teamActivity) + @php + $totalTask = countPermohonanForUser($teamActivity->user->id); + @endphp + + + + + + + + @endforeach + + + + +
+ + + Nama Penilai + + + Total Task + + + Aksi + +
+ + + {{ $teamActivity->user->name }} + + {{ $totalTask }} + + + + Lihat + +
+
+
+
+
+@endsection diff --git a/resources/views/laporan-monitoring/show.blade.php b/resources/views/laporan-monitoring/show.blade.php new file mode 100644 index 0000000..fad82ae --- /dev/null +++ b/resources/views/laporan-monitoring/show.blade.php @@ -0,0 +1,211 @@ + @extends('layouts.main') + + @section('breadcrumbs') + {{-- {{ Breadcrumbs::render('laporan-hasil-penilaian-jaminan-internal-external') }} --}} + @endsection + + @section('content') +
+
+
+

+ Daftar Penilaian {{ $nama_penilai ?? '' }} +

+
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
Nama DebiturTujuan PenilaianStatus BayarJenis AssetPenugasanJenis ReportTgl RegisterTgl AssignTgl KunjunganProgressSLA LaporanSLA PaparanApproveKeteranganAction
+
+ +
+
+
+ @endsection + + @push('scripts') + + @endpush