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')
+
+@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')
+
+ @endsection
+
+ @push('scripts')
+
+ @endpush