diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php
index 5c9351e..1f6a711 100644
--- a/app/Helpers/Lpj.php
+++ b/app/Helpers/Lpj.php
@@ -134,7 +134,7 @@
if ($penawaran) {
$isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric
$isNP = substr($maxCode, 0, 2);
- if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (isNumeric($isNum))) {
+ if ((8 == strlen($maxCode)) && ("NP" == $isNP) && (ctype_digit($isNum))) {
$code_penawaran_last = substr($maxCode, -4);
$year_penawaran_last = Carbon::parse($penawaran->created_at)->year;
$year_now = Carbon::now()->year;
@@ -149,11 +149,6 @@
return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString;
}
- function isNumeric($str)
- {
- return ctype_digit($str);
- }
-
// generate last penawaran.no_spk
function onLastnumberCodePenawaranSPK($jenis_laporan_code)
: string
@@ -188,46 +183,7 @@
function onRomawi(int $bln)
: string
{
- switch ($bln) {
- case 1:
- return "I";
- break;
- case 2:
- return "II";
- break;
- case 3:
- return "III";
- break;
- case 4:
- return "IV";
- break;
- case 5:
- return "V";
- break;
- case 6:
- return "VI";
- break;
- case 7:
- return "VII";
- break;
- case 8:
- return "VIII";
- break;
- case 9:
- return "IX";
- break;
- case 10:
- return "X";
- break;
- case 11:
- return "XI";
- break;
- case 12:
- return "XII";
- break;
-
- }
-
+ return convertToRoman($bln);
}
function penyebut($nilai)
@@ -304,15 +260,6 @@
return $hariKerja;
}
- function holidays()
- {
- return HolidayCalendar::pluck('date')->map(
- function ($item) {
- return Carbon::parse($item)->format('Y-m-d');
- },
- )->toArray();
- }
-
function countPermohonanForUser($userId)
{
$validStatuses = [
diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
new file mode 100644
index 0000000..9d6e39a
--- /dev/null
+++ b/app/Http/Controllers/DashboardController.php
@@ -0,0 +1,36 @@
+dashboardService = $dashboardService;
+ }
+ /**
+ * Display a listing of the resource.
+ */
+ public function index(Request $request)
+ {
+ // nilai default
+ $start_date = $request->input('start_date', now()->startOfYear()->format('Y-m-d'));
+ $end_date = $request->input('end_date', now()->format('Y-m-d'));
+
+ $validate = $request->validate([
+ 'start_date' => 'nullable|date_format:Y-m-d',
+ 'end_date' => 'nullable|date_format:Y-m-d',
+ ]);
+
+ $dashboard = $this->dashboardService->getDashboardData($start_date, $end_date);
+
+ // dd($dashboard);
+ return view('lpj::dashboard.index', compact('dashboard'));
+ }
+
+}
diff --git a/app/Http/Controllers/LaporanBiayaInternalExternalController.php b/app/Http/Controllers/LaporanBiayaInternalExternalController.php
new file mode 100644
index 0000000..89c3d1c
--- /dev/null
+++ b/app/Http/Controllers/LaporanBiayaInternalExternalController.php
@@ -0,0 +1,23 @@
+count();
// Get the data for the current page
- $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','jenisFasilitasKredit', 'documents.inspeksi','penilai','documents.detail'])->get();
+ $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','jenisFasilitasKredit', 'documents.inspeksi','penilai','documents.detail','noc'])->get();
// Calculate the page count
$pageCount = ceil($totalRecords / $size);
diff --git a/app/Http/Controllers/LaporanDebitureController.php b/app/Http/Controllers/LaporanDebitureController.php
new file mode 100644
index 0000000..bb57b52
--- /dev/null
+++ b/app/Http/Controllers/LaporanDebitureController.php
@@ -0,0 +1,33 @@
+laporanDebitureService = app(LaporanDebitureService::class);
+ }
+
+ /**
+ * Display a listing of the resource.
+ */
+ public function index()
+ {
+ $debiture = Debiture::all();
+ return view('lpj::laporan-debiture.index', compact('debiture'));
+ }
+
+
+ public function dataTableForDebiture(Request $request)
+ {
+ return $this->laporanDebitureService->dataForDatatables($request);
+ }
+
+}
diff --git a/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php b/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php
index 3bac546..081d455 100644
--- a/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php
+++ b/app/Http/Controllers/LaporanHasilPenilaianJaminanInternalExternalController.php
@@ -190,7 +190,7 @@
$pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number
- $currentPage = $request->get('page', 1);
+ $currentPage = $request->get('page') ?: 1;
// Return the response data as a JSON object
return response()->json([
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/Http/Controllers/LaporanSLAPenilaiController.php b/app/Http/Controllers/LaporanSLAPenilaiController.php
new file mode 100644
index 0000000..4ef6704
--- /dev/null
+++ b/app/Http/Controllers/LaporanSLAPenilaiController.php
@@ -0,0 +1,32 @@
+laporanSLAPenilaiService = app(LaporanSLAPenilaiService::class);
+ }
+
+ /**
+ * Display a listing of the resource.
+ */
+ public function index()
+ {
+ return view('lpj::laporan-sla-penilai.index');
+ }
+
+ public function dataForDatatableSLaPenilai(Request $request)
+ {
+ return $this->laporanSLAPenilaiService->dataForDatatables($request);
+ }
+
+
+}
diff --git a/app/Http/Controllers/LaporanUserController.php b/app/Http/Controllers/LaporanUserController.php
new file mode 100644
index 0000000..7d48559
--- /dev/null
+++ b/app/Http/Controllers/LaporanUserController.php
@@ -0,0 +1,41 @@
+laporanUserService = $laporanUserService;
+ }
+
+ /**
+ * Display a listing of the resource.
+ */
+ public function index()
+ {
+ // $user = $this->laporanUserService->getUserPemohon();
+ return view('lpj::laporan-user.index');
+ }
+
+ public function searchUserPemohon(Request $request)
+ {
+ $search = $request->get('search');
+ $user = $this->laporanUserService->getUserPemohon($search);
+ return response()->json($user);
+ }
+
+ public function dataTableForUserPemohon(Request $request)
+ {
+ return $this->laporanUserService->dataForDatatables($request);
+ }
+
+}
diff --git a/app/Http/Controllers/NocController.php b/app/Http/Controllers/NocController.php
index 87a50b8..1f24819 100644
--- a/app/Http/Controllers/NocController.php
+++ b/app/Http/Controllers/NocController.php
@@ -6,6 +6,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Modules\Lpj\Http\Requests\NocRequest;
+ use Modules\Lpj\Models\Noc;
use Modules\Lpj\Models\PenawaranTender;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PersetujuanPenawaran;
@@ -18,9 +19,20 @@
* Display a listing of the resource.
*/
public function index()
+ {
+ return redirect()->route('noc.pembayaran');
+ }
+
+ public function pembayaran()
{
$persetujuanPenawarans = PersetujuanPenawaran::all();
- return view('lpj::noc.index', compact('persetujuanPenawarans'));
+ return view('lpj::noc.pembayaran', compact('persetujuanPenawarans'));
+ }
+
+ public function penyelesaian()
+ {
+ $persetujuanPenawarans = PersetujuanPenawaran::all();
+ return view('lpj::noc.penyelesaian', compact('persetujuanPenawarans'));
}
/**
@@ -43,26 +55,35 @@
$status = "persetujuan-penawaran";
}
- $persetujuanPenawaran = PersetujuanPenawaran::updateOrCreate(
- ['penawaran_id' => $validated['penawaran_id']],
- $validated,
+
+ $dataNoc = [
+ 'nominal_bayar' => $validated['nominal_bayar'],
+ 'tanggal_pembayaran' => $validated['tanggal_pembayaran'] ?? date('Y-m-d'),
+ 'status_bayar' => $validated['nominal_bayar'] < $validated['total_harus_bayar'] ? false : true,
+ 'catatan_noc' => $validated['catatan_noc'],
+ ];
+ $noc = Noc::updateOrCreate(
+ [
+ 'permohonan_id' => $validated['permohonan_id'],
+ 'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'],
+ ],
+ $dataNoc,
);
- $folderPath = 'noc/' . $validated['penawaran_id'];
+ $folderPath = 'noc/' . request()->get('persetujuan_penawaran_id') . '/bukti_ksl/';
if ($request->hasFile('bukti_ksl')) {
- $persetujuanPenawaran->bukti_ksl = $request->file('bukti_ksl')->store(
+ $noc->bukti_ksl = $request->file('bukti_ksl')->store(
$folderPath,
'public',
);
}
-
- $persetujuanPenawaran->save();
+ $noc->save();
// Update the status of the related permohonan to 'spk'
$permohonan = Permohonan::find(request()->get('permohonan_id'));
if ($permohonan) {
- $permohonan->status_bayar = request()->get('status_bayar');
+ $permohonan->status_bayar = request()->get('status_pembayar');
if ($permohonan->jenis_penilaian_id == 2) {
$permohonan->status = $status;
}
@@ -81,7 +102,7 @@
}
return redirect()
- ->route('noc.index')->with('success', 'Penyelesaian KSL berhasil disimpan.');
+ ->route('noc.index')->with('success', 'NOC berhasil disimpan.');
}
/**
@@ -89,13 +110,58 @@
*/
public function update(NocRequest $request, PersetujuanPenawaran $persetujuanPenawaran)
{
- $validated = $request->validated();
- $validated['updated_by'] = Auth::id();
+ $validated = $request->validated();
+
+ if($request->get('is_memo')){
+
+ $memo = Noc::find($request->get('is_memo'));
+
+ $folderPath = 'noc/' . request()->get('persetujuan_penawaran_id') . '/memo_penyelesaian/';
+
+ if ($request->hasFile('memo_penyelesaian')) {
+ $memo->memo_penyelesaian = $request->file('memo_penyelesaian')->store(
+ $folderPath,
+ 'public',
+ );
+ }
+
+ $memo->catatan_noc = $validated['catatan_noc'];
+ $memo->save();
+
+
+ return redirect()
+ ->route('laporan.index')->with('success', 'Memo Penyelesaian updated successfully');
+ }
+ $dataNoc = [
+ 'nominal_penyelesaian' => $validated['nominal_penyelesaian'],
+ 'tanggal_penyelesaian' => $validated['tanggal_penyelesaian'] ?? date('Y-m-d'),
+ 'status_pelunasan' => ((int)$validated['nominal_bayar'] + (int)$validated['nominal_penyelesaian']) === (int)$validated['total_harus_bayar'] ? true : false,
+ 'catatan_noc' => $validated['catatan_noc'],
+ ];
+
+
+ $noc = Noc::updateOrCreate(
+ [
+ 'permohonan_id' => $validated['permohonan_id'],
+ 'permohonan_id' => $validated['permohonan_id'],
+ 'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'],
+ ],
+ $dataNoc,
+ );
+
+ $folderPath = 'noc/' . request()->get('persetujuan_penawaran_id') . '/bukti_penyelesaian/';
+
+ if ($request->hasFile('bukti_penyelesaian')) {
+ $noc->bukti_penyelesaian = $request->file('bukti_penyelesaian')->store(
+ $folderPath,
+ 'public',
+ );
+ }
+ $noc->save();
- $persetujuanPenawaran->update($validated);
return redirect()
- ->route('noc.index')->with('success', 'Persetujuan Penawaran updated successfully');
+ ->route('noc.index')->with('success', 'NOC updated successfully');
}
/**
@@ -109,16 +175,18 @@
/**
* Display the specified resource.
*/
- public function show($id) { }
+ public function show(Request $request) {
+ $noc = Noc::find($request->get('id'));
+
+ return view('lpj::noc.memo', compact('noc'));
+ }
/**
* Show the form for editing the specified resource.
*/
public function edit($id)
{
- $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->with(
- ['penawaran.detail', 'penawaran.permohonan.debiture', 'permohonan'],
- )->first();
+ $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->first();
return view('lpj::noc.form', compact('persetujuanPenawaran'));
}
@@ -134,6 +202,12 @@
}
public function dataForDatatables(Request $request)
+ {
+ // Redirect to pembayaran datatables by default
+ return $this->dataForDatatablesPembayaran($request);
+ }
+
+ public function dataForDatatablesPembayaran(Request $request)
{
if (is_null($this->user) || !$this->user->can('noc.view')) {
//abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
@@ -142,6 +216,11 @@
// Retrieve data from the database
$query = PersetujuanPenawaran::query();
+ // Filter for pembayaran (where memo_penyelesaian is null)
+ $query->whereDoesntHave('noc', function($q) {
+ $q->whereNotNull('memo_penyelesaian');
+ });
+
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search');
@@ -181,13 +260,115 @@
'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi,
'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name,
'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name,
- 'tanggal_setor' => formatTanggalIndonesia($persetujuanPenawaran->created_at, true),
- 'nominal_bayar' => format_currency($persetujuanPenawaran->nominal_bayar ?? 0),
- 'bukti_ksl' => $persetujuanPenawaran->bukti_ksl ?? null,
- 'tanggal_penyelesaian' => formatTanggalIndonesia($persetujuanPenawaran->updated_at, true),
+ 'tanggal_pembayaran' => dateFormat(
+ $persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
+ true,
+ ),
+ 'nominal_bayar' => currencyFormat($persetujuanPenawaran->nominal_bayar ?? 0,
+ ),
+ 'nominal_diterima' => currencyFormat(
+ $persetujuanPenawaran->noc->nominal_bayar ?? 0,
+ ),
+ 'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null,
+ 'bukti_bayar' => $persetujuanPenawaran->bukti_bayar ?? null,
+ 'updated_at' => dateFormat($persetujuanPenawaran->updated_at, true),
];
+ })->sortBy('updated_at', 1);
+
+ // Calculate the page count
+ $pageCount = ceil($totalRecords / $request->get('size'));
+
+ // Calculate the current page number
+ $currentPage = $request->get('page', 1);
+
+ // Return the response data as a JSON object
+ return response()->json([
+ 'draw' => $request->get('draw'),
+ 'recordsTotal' => $totalRecords,
+ 'recordsFiltered' => $filteredRecords,
+ 'pageCount' => $pageCount,
+ 'page' => $currentPage,
+ 'totalCount' => $totalRecords,
+ 'data' => $data,
+ ]);
+ }
+
+ public function dataForDatatablesPenyelesaian(Request $request)
+ {
+ if (is_null($this->user) || !$this->user->can('noc.view')) {
+ //abort(403, 'Sorry! You are not allowed to view persetujuan penawaran.');
+ }
+
+ // Retrieve data from the database
+ $query = PersetujuanPenawaran::query();
+
+ // Filter for penyelesaian (where memo_penyelesaian is not null)
+ $query->whereHas('noc', function($q) {
+ $q->whereNotNull('memo_penyelesaian');
});
+ // Apply search filter if provided
+ if ($request->has('search') && !empty($request->get('search'))) {
+ $search = $request->get('search');
+ $query->where(function ($q) use ($search) {
+ $q->orWhereRelation('penawaran', 'nomor_registrasi', 'LIKE', '%' . $search . '%');
+ });
+ }
+
+ // Apply sorting if provided
+ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
+ $order = $request->get('sortOrder');
+ $column = $request->get('sortField');
+ $query->orderBy($column, $order);
+ }
+
+ // Get the total count of records
+ $totalRecords = $query->count();
+
+ // Apply pagination if provided
+ if ($request->has('page') && $request->has('size')) {
+ $page = $request->get('page');
+ $size = $request->get('size');
+ $offset = ($page - 1) * $size; // Calculate the offset
+
+ $query->skip($offset)->take($size);
+ }
+
+ // Get the filtered count of records
+ $filteredRecords = $query->count();
+
+ // Get the data for the current page
+ $data = $query->get();
+
+ $data = $data->map(function ($persetujuanPenawaran) {
+ return [
+ 'id' => $persetujuanPenawaran->id,
+ 'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi,
+ 'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name,
+ 'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name,
+ 'tanggal_pembayaran' => dateFormat(
+ $persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
+ true,
+ ),
+ 'nominal_bayar' => currencyFormat($persetujuanPenawaran->nominal_bayar ?? 0,
+ ),
+ 'nominal_diterima' => currencyFormat(
+ $persetujuanPenawaran->noc->nominal_bayar ?? 0,
+ ),
+ 'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null,
+ 'bukti_bayar' => $persetujuanPenawaran->bukti_bayar ?? null,
+ 'memo_penyelesaian' => $persetujuanPenawaran->noc->memo_penyelesaian ?? $persetujuanPenawaran->memo_penyelesaian ?? null,
+ 'nominal_penyelesaian' => currencyFormat(
+ $persetujuanPenawaran->noc->nominal_penyelesaian ?? $persetujuanPenawaran->nominal_penyelesaian ?? 0,
+ ),
+ 'bukti_penyelesaian' => $persetujuanPenawaran->noc->bukti_penyelesaian ?? $persetujuanPenawaran->bukti_penyelesaian ?? null,
+ 'tanggal_penyelesaian' => $persetujuanPenawaran->noc?->tanggal_penyelesaian ? dateFormat(
+ $persetujuanPenawaran->noc?->tanggal_penyelesaian,
+ true) : '-',
+ 'updated_at' => dateFormat($persetujuanPenawaran->updated_at, true),
+ ];
+ })->sortBy('updated_at', 1);
+
// Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size'));
diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php
index fe20028..a3588f2 100644
--- a/app/Http/Controllers/PenilaiController.php
+++ b/app/Http/Controllers/PenilaiController.php
@@ -152,6 +152,11 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId');
$permohonan = $this->surveyorController->getPermohonanJaminanId($id, $documentId, $jaminanId);
+
+ if ($permohonan->status == 'proses-laporan') {
+ return redirect()->back()->with('error', 'Masih dalam proses laporan');
+ }
+
$basicData = $this->surveyorController->getCommonData();
$noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj');
@@ -218,6 +223,11 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId');
$permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $jaminanId);
+
+ if ($permohonan->status == 'proses-laporan') {
+ return redirect()->back()->with('error', 'Masih dalam proses laporan');
+ }
+
$nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'resume');
$inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
$noLpresume = $this->generateNoLaporan($permohonan, $documentId, 'resume');
@@ -253,6 +263,9 @@ class PenilaiController extends Controller
$data = $this->getDataPermohonanWithPenilaiAndInspeksi($req['permohonanId'], $req['documentId'], $req['jaminanId']);
$permohonan = $data['permohonan'];
+ if ($permohonan->status == 'proses-laporan') {
+ return redirect()->back()->with('error', 'Masih dalam proses laporan');
+ }
$nomorLaporan = $this->generateNoLaporan($permohonan, $req['documentId'], 'memo');
$inspeksi = Inspeksi::where('permohonan_id', $req['permohonanId'])->where('dokument_id', $req['documentId'])->first();
@@ -392,6 +405,11 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId');
$provinces = Province::all();
$permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $jaminanId);
+
+ if ($permohonan->status == 'proses-laporan') {
+ return redirect()->back()->with('error', 'Masih dalam proses laporan');
+ }
+
$nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'rap');
$basicData = $this->surveyorController->getCommonData();
$inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
@@ -470,6 +488,9 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId');
$provinces = Province::all();
$permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $jaminanId);
+ if ($permohonan->status == 'proses-laporan') {
+ return redirect()->back()->with('error', 'Masih dalam proses laporan');
+ }
$nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'call-report');
$basicData = $this->surveyorController->getCommonData();
$inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
@@ -1056,14 +1077,14 @@ class PenilaiController extends Controller
$data = [];
- $kategoriUnik = ['tanah', 'bangunan', 'apartemen-kantor', 'alat-berat', 'mesin', 'kendaraan', 'pesawat', 'kapal', 'sarana_pelengkap_penilai'];
+ $kategoriUnik = ['tanah', 'bangunan', 'apartemen-kantor', 'alat-berat', 'mesin', 'kendaraan', 'pesawat', 'kapal', 'sarana_pelengkap_penilai'];
foreach ($kategoriUnik as $kategori) {
// Dynamically generate keys
$luasKey = 'luas_' . $kategori;
$nilaiKey1 = 'nilai_' . $kategori . '_1';
$nilaiKey2 = 'nilai_' . $kategori . '_2';
-
+
// Collect data if exists
if ($request->has($luasKey)) {
$data[$luasKey] = $request->input($luasKey);
@@ -1075,7 +1096,7 @@ class PenilaiController extends Controller
$data[$nilaiKey2] = $request->input($nilaiKey2);
}
}
-
+
$data['total_nilai_pasar_wajar'] = $request->input('total_nilai_pasar_wajar');
$data['likuidasi'] = $request->input('likuidasi');
$data['likuidasi_nilai_1'] = $request->input('likuidasi_nilai_1');
@@ -1104,8 +1125,7 @@ class PenilaiController extends Controller
$penilai = Penilai::updateOrCreate(
[
'permohonan_id' => $request->permohonanId,
- 'dokument_id' => $request->documentId,
-
+ 'dokument_id' => $request->input('dokument_id'),
],
[
'lpj' => json_encode($data),
@@ -1132,20 +1152,9 @@ class PenilaiController extends Controller
{
DB::beginTransaction();
try {
- $formRequest = new FormSurveyorRequest();
- $formRequest->setContainer(app());
- $formRequest->initialize(
- $request->all(),
- $request->query->all(),
- $request->attributes->all(),
- $request->cookies->all(),
- $request->files->all(),
- $request->server->all(),
- $request->getContent()
- );
- $validated = $formRequest->validateResolved();
- $result = $this->surveyorController->store($formRequest);
+ $validatedData = $request->all();
+ $result = $this->inspeksiService->storeInspeksi($validatedData, $request->input('type'), $request);
$data = [
'kepada' => $request->input('kepada'),
@@ -1410,7 +1419,7 @@ class PenilaiController extends Controller
}
- // pengunaan request query by id permohonan, dokument, jaminan , inspeksi
+ // pengunaan request query by id permohonan, documentId, jaminan , inspeksi
protected function getRequestQueryId(Request $request)
{
return [
diff --git a/app/Http/Controllers/PermohonanController.php b/app/Http/Controllers/PermohonanController.php
index 0c5c05b..da92c4a 100644
--- a/app/Http/Controllers/PermohonanController.php
+++ b/app/Http/Controllers/PermohonanController.php
@@ -1,489 +1,518 @@
historyService = $historyService;
- }
+ public $user;
+ protected $historyService;
- public function index()
- {
- return view('lpj::permohonan.index');
- }
-
- public function store(PermohonanRequest $request)
- {
- $validate = $request->validated();
- if ($validate) {
- try {
- // Process file upload
- $filePath = null;
- if ($request->hasFile('attachment')) {
- $file = $request->file('attachment');
- $fileName = time() . '_' . $file->getClientOriginalName();
- $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public');
- }
-
- // Get keterangan if provided
- $keterangan = $request->input('keterangan') ?? null;
-
-
- // Save to database
- $permohonan = Permohonan::create($validate);
-
- // Create history
- $this->historyService->createHistory(
- $permohonan,
- $validate['status'],
- $keterangan,
- [], // beforeRequest is empty for new permohonan
- $permohonan->toArray(),
- $filePath,
- );
-
- $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
- if (count($documents) < 1) {
- return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
- }
- return redirect()
- ->route('permohonan.index')->with('success', 'Permohonan created successfully');
- } catch (Exception $e) {
- return redirect()
- ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage());
- }
- } else {
- return redirect()
- ->route('permohonan.create')->with('success', 'error naon iye')->withInput();
+ public function __construct(PermohonanHistoryService $historyService)
+ {
+ $this->historyService = $historyService;
}
- }
- public function create()
- {
- return view('lpj::permohonan.create');
- }
+ public function index()
+ {
+ return view('lpj::permohonan.index');
+ }
- public function createPermohonan($debitur)
- {
- $branches = Branch::all();
- $debitur = Debiture::find($debitur);
- $tujuanPenilaian = TujuanPenilaian::all();
- $status = StatusPermohonan::all();
- $fasilitasKredit = JenisFasilitasKredit::all();
- $plafond = NilaiPlafond::all();
+ public function store(PermohonanRequest $request)
+ {
+ $validate = $request->validated();
+ if ($validate) {
+ try {
+ // Process file upload
+ $filePath = null;
+ if ($request->hasFile('attachment')) {
+ $file = $request->file('attachment');
+ $fileName = time() . '_' . $file->getClientOriginalName();
+ $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public');
+ }
- return view(
- 'lpj::permohonan.form',
- compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'),
- );
- }
+ // Get keterangan if provided
+ $keterangan = $request->input('keterangan') ?? null;
- public function edit($id)
- {
- $permohonan = Permohonan::find($id);
- $branches = Branch::all();
- $debitur = Debiture::find($permohonan->debiture_id);
- $tujuanPenilaian = TujuanPenilaian::all();
- $status = StatusPermohonan::all();
- $provinces = Province::all();
- $cities = City::where('province_code', $debitur->province_code)->get();
- $districts = District::where('city_code', $debitur->city_code)->get();
- $villages = Village::where('district_code', $debitur->district_code)->get();
- $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get();
- $fasilitasKredit = JenisFasilitasKredit::all();
- $plafond = NilaiPlafond::all();
+ // Save to database
+ $permohonan = Permohonan::create($validate);
- return view(
- 'lpj::permohonan.form',
- compact(
- 'permohonan',
- 'branches',
- 'debitur',
- 'tujuanPenilaian',
- 'status',
- 'provinces',
- 'cities',
- 'districts',
- 'villages',
- 'documents',
- 'fasilitasKredit',
- 'plafond',
- ),
- );
- }
+ // Create history
+ $this->historyService->createHistory(
+ $permohonan,
+ $validate['status'],
+ $keterangan,
+ [], // beforeRequest is empty for new permohonan
+ $permohonan->toArray(),
+ $filePath,
+ );
- public function update(PermohonanRequest $request, $id)
- {
- $permohonan = Permohonan::findOrFail($id);
- $beforeRequest = $permohonan->toArray();
-
- $validate = $request->validated();
- if ($validate) {
- try {
- // Update in database
-
- if ($permohonan->status == 'revisi') {
- $validate['status'] = 'order';
+ $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
+ if (count($documents) < 1) {
+ return redirect()->route(
+ 'debitur.jaminan.create',
+ array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]),
+ )->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
+ }
+ return redirect()
+ ->route('permohonan.index')->with('success', 'Permohonan created successfully');
+ } catch (Exception $e) {
+ return redirect()
+ ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage());
}
- $permohonan->update($validate);
-
- $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
- if (count($documents) < 1) {
- return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
- }
-
+ } else {
return redirect()
- ->route('permohonan.index')->with('success', 'Permohonan updated successfully');
- } catch (Exception $e) {
- return redirect()
- ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan');
+ ->route('permohonan.create')->with('success', 'error naon iye')->withInput();
}
}
- }
- public function destroy($id)
- {
- try {
- // Delete from database
+ public function create()
+ {
+ return view('lpj::permohonan.create');
+ }
+
+ public function createPermohonan($debitur)
+ {
+ $branches = Branch::all();
+ $debitur = Debiture::find($debitur);
+ $tujuanPenilaian = TujuanPenilaian::all();
+ $status = StatusPermohonan::all();
+ $fasilitasKredit = JenisFasilitasKredit::all();
+ $plafond = NilaiPlafond::all();
+
+ return view(
+ 'lpj::permohonan.form',
+ compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'),
+ );
+ }
+
+ public function edit($id)
+ {
+ $permohonan = Permohonan::find($id);
+ $branches = Branch::all();
+ $debitur = Debiture::find($permohonan->debiture_id);
+ $tujuanPenilaian = TujuanPenilaian::all();
+ $status = StatusPermohonan::all();
+ $provinces = Province::all();
+ $cities = City::where('province_code', $debitur->province_code)->get();
+ $districts = District::where('city_code', $debitur->city_code)->get();
+ $villages = Village::where('district_code', $debitur->district_code)->get();
+ $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get();
+
+ $fasilitasKredit = JenisFasilitasKredit::all();
+ $plafond = NilaiPlafond::all();
+
+ return view(
+ 'lpj::permohonan.form',
+ compact(
+ 'permohonan',
+ 'branches',
+ 'debitur',
+ 'tujuanPenilaian',
+ 'status',
+ 'provinces',
+ 'cities',
+ 'districts',
+ 'villages',
+ 'documents',
+ 'fasilitasKredit',
+ 'plafond',
+ ),
+ );
+ }
+
+ public function destroy($id)
+ {
+ try {
+ // Delete from database
+ $permohonan = Permohonan::find($id);
+ $permohonan->delete();
+
+ echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']);
+ } catch (Exception $e) {
+ echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']);
+ }
+ }
+
+ public function dataForDatatables(Request $request)
+ {
+ if (is_null($this->user) || !$this->user->can('debitur.view')) {
+ //abort(403, 'Sorry! You are not allowed to view users.');
+ }
+
+ // Retrieve data from the database
+ $query = Permohonan::query();
+
+ if (!Auth::user()->hasAnyRole(['administrator'])) {
+ $query = $query->where('branch_id', Auth::user()->branch_id);
+ }
+
+ $query = $query->orderBy('nomor_registrasi', 'desc');
+ // Apply search filter if provided
+ 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('mig_mst_lpj_nomor_jaminan', '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 . '%');
+ });
+ }
+
+ // Apply sorting if provided
+ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
+ $order = $request->get('sortOrder');
+ $column = $request->get('sortField');
+ $query->orderBy($column, $order);
+ }
+
+ // Get the total count of records
+ $totalRecords = $query->count();
+ $size = $request->get('size', 10);
+ if ($size == 0) {
+ $size = 10;
+ }
+
+ // Apply pagination if provided
+ if ($request->has('page') && $request->has('size')) {
+ $page = $request->get('page');
+ $size = $request->get('size');
+ $offset = ($page - 1) * $size; // Calculate the offset
+
+ $query->skip($offset)->take($size);
+ }
+
+ // Get the filtered count of records
+ $filteredRecords = $query->count();
+
+ // Get the data for the current page
+ $data = $query->get();
+
+ $data = $data->map(function ($item) {
+ return [
+ 'id' => $item->id,
+ 'nomor_registrasi' => $item->nomor_registrasi,
+ 'mig_mst_lpj_nomor_jaminan' => $item->mig_mst_lpj_nomor_jaminan,
+ 'tanggal_permohonan' => $item->tanggal_permohonan ? dateFormat(
+ $item->tanggal_permohonan,
+ ) : null,
+ 'pemohon' => $item->user->name ?? 'N/A',
+ 'branch' => $item->branch->name ?? 'N/A',
+ 'debiture' => [
+ 'name' => $item->debiture->name,
+ ],
+ 'tujuan_penilaian' => [
+ 'code' => $item->tujuanPenilaian->code ?? null,
+ 'name' => $item->tujuanPenilaian->name ?? null,
+ ],
+ 'status' => $item->status,
+ 'documents' => count($item->documents),
+ 'keterangan' => $item->keterangan,
+ 'penilaian' => [
+ 'id' => $item->penilaian->id ?? null,
+ 'waktu_penilaian' => $item->penilaian->waktu_penilaian ?? null,
+ 'rejected_note' => $item->penilaian->rejected_note ?? null,
+ 'authorized_status' => $item->penilaian->authorized_status ?? null,
+ ],
+ 'registrasi_catatan' => $item->registrasi_catatan,
+ ];
+ });
+
+ // Calculate the page count
+ $pageCount = ceil($totalRecords / $size);
+
+ // Calculate the current page number
+ $currentPage = max(1, $request->get('page', 1));
+
+ // Return the response data as a JSON object
+ return response()->json([
+ 'draw' => $request->get('draw'),
+ 'recordsTotal' => $totalRecords,
+ 'recordsFiltered' => $filteredRecords,
+ 'pageCount' => $pageCount,
+ 'page' => $currentPage,
+ 'totalCount' => $totalRecords,
+ 'data' => $data,
+ ]);
+ }
+
+ public function export()
+ {
+ return Excel::download(new PermohonanExport(), 'permohonan.xlsx');
+ }
+
+ public function authorization()
+ {
+ return view('lpj::permohonan.authorization.index');
+ }
+
+ public function dataForAuthorization(Request $request)
+ {
+ if (is_null($this->user) || !$this->user->can('debitur.view')) {
+ //abort(403, 'Sorry! You are not allowed to view users.');
+ }
+
+ // Retrieve data from the database
+ $query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order');
+
+ if (!Auth::user()->hasAnyRole(['administrator'])) {
+ $query = $query->where('branch_id', Auth::user()->branch_id);
+ }
+
+ // Apply search filter if provided
+ 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 . '%');
+ });
+ }
+
+ // Apply sorting if provided
+ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
+ $order = $request->get('sortOrder');
+ $column = $request->get('sortField');
+ $query->orderBy($column, $order);
+ }
+
+ // Get the total count of records
+ $totalRecords = $query->count();
+
+ // Apply pagination if provided
+ if ($request->has('page') && $request->has('size')) {
+ $page = $request->get('page');
+ $size = $request->get('size');
+ $offset = ($page - 1) * $size; // Calculate the offset
+
+ $query->skip($offset)->take($size);
+ }
+
+ // Get the filtered count of records
+ $filteredRecords = $query->count();
+
+ // Get the data for the current page
+ $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get();
+
+ // Calculate the page count
+ $pageCount = ceil($totalRecords / $request->get('size'));
+
+ // Calculate the current page number
+ $currentPage = 0 + 1;
+
+ // Return the response data as a JSON object
+ return response()->json([
+ 'draw' => $request->get('draw'),
+ 'recordsTotal' => $totalRecords,
+ 'recordsFiltered' => $filteredRecords,
+ 'pageCount' => $pageCount,
+ 'page' => $currentPage,
+ 'totalCount' => $totalRecords,
+ 'data' => $data,
+ ]);
+ }
+
+ public function showAuthorization($id)
+ {
$permohonan = Permohonan::find($id);
- $permohonan->delete();
-
- echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']);
- } catch (Exception $e) {
- echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']);
- }
- }
-
- public function dataForDatatables(Request $request)
- {
- if (is_null($this->user) || !$this->user->can('debitur.view')) {
- //abort(403, 'Sorry! You are not allowed to view users.');
+ return view('lpj::permohonan.authorization.show', compact('permohonan'));
}
- // Retrieve data from the database
- $query = Permohonan::query();
-
- if (!Auth::user()->hasAnyRole(['administrator'])) {
- $query = $query->where('branch_id', Auth::user()->branch_id);
- }
-
- $query = $query->orderBy('nomor_registrasi', 'desc');
- // Apply search filter if provided
- 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('mig_mst_lpj_nomor_jaminan', '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 . '%');
- });
- }
-
- // Apply sorting if provided
- if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
- $order = $request->get('sortOrder');
- $column = $request->get('sortField');
- $query->orderBy($column, $order);
- }
-
- // Get the total count of records
- $totalRecords = $query->count();
- $size = $request->get('size', 10);
- if ($size == 0) {
- $size = 10;
- }
-
- // Apply pagination if provided
- if ($request->has('page') && $request->has('size')) {
- $page = $request->get('page');
- $size = $request->get('size');
- $offset = ($page - 1) * $size; // Calculate the offset
-
- $query->skip($offset)->take($size);
- }
-
- // Get the filtered count of records
- $filteredRecords = $query->count();
-
- // Get the data for the current page
- $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','documents'])->get();
-
- // Calculate the page count
- $pageCount = ceil($totalRecords / $size);
-
- // Calculate the current page number
- $currentPage = max(1, $request->get('page', 1));
-
- // Return the response data as a JSON object
- return response()->json([
- 'draw' => $request->get('draw'),
- 'recordsTotal' => $totalRecords,
- 'recordsFiltered' => $filteredRecords,
- 'pageCount' => $pageCount,
- 'page' => $currentPage,
- 'totalCount' => $totalRecords,
- 'data' => $data,
- ]);
- }
-
- public function export()
- {
- return Excel::download(new PermohonanExport(), 'permohonan.xlsx');
- }
-
- public function authorization()
- {
- return view('lpj::permohonan.authorization.index');
- }
-
- public function dataForAuthorization(Request $request)
- {
- if (is_null($this->user) || !$this->user->can('debitur.view')) {
- //abort(403, 'Sorry! You are not allowed to view users.');
- }
-
- // Retrieve data from the database
- $query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order');
-
- if (!Auth::user()->hasAnyRole(['administrator'])) {
- $query = $query->where('branch_id', Auth::user()->branch_id);
- }
-
- // Apply search filter if provided
- 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 . '%');
- });
- }
-
- // Apply sorting if provided
- if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
- $order = $request->get('sortOrder');
- $column = $request->get('sortField');
- $query->orderBy($column, $order);
- }
-
- // Get the total count of records
- $totalRecords = $query->count();
-
- // Apply pagination if provided
- if ($request->has('page') && $request->has('size')) {
- $page = $request->get('page');
- $size = $request->get('size');
- $offset = ($page - 1) * $size; // Calculate the offset
-
- $query->skip($offset)->take($size);
- }
-
- // Get the filtered count of records
- $filteredRecords = $query->count();
-
- // Get the data for the current page
- $data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get(
- );
-
- // Calculate the page count
- $pageCount = ceil($totalRecords / $request->get('size'));
-
- // Calculate the current page number
- $currentPage = 0 + 1;
-
- // Return the response data as a JSON object
- return response()->json([
- 'draw' => $request->get('draw'),
- 'recordsTotal' => $totalRecords,
- 'recordsFiltered' => $filteredRecords,
- 'pageCount' => $pageCount,
- 'page' => $currentPage,
- 'totalCount' => $totalRecords,
- 'data' => $data,
- ]);
- }
-
- public function showAuthorization($id)
- {
- $permohonan = Permohonan::find($id);
- return view('lpj::permohonan.authorization.show', compact('permohonan'));
- }
-
- public function updateAuthorization(Request $request, $id)
- {
- try {
- $permohonan = Permohonan::find($id);
- $permohonan->status = $request->status;
- $permohonan->keterangan = $request->keterangan;
- $permohonan->save();
- } catch (Exception $e) {
- return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan');
- }
-
- return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully');
- }
-
- public function show($id)
- {
- $permohonan = Permohonan::find($id);
-
- return view('lpj::permohonan.show', compact('permohonan'));
- }
-
- public function print($id)
- {
- $permohonan = Permohonan::find($id);
- return view('lpj::permohonan.print', compact('permohonan'));
-
- // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan'));
- // return $pdf->stream();
- }
-
- public function showPembatalan($id)
- {
- $permohonan = Permohonan::with(['pembatalan','debiture'])->findOrFail($id);
- return view('lpj::permohonan.pembatalan-form', compact('permohonan'));
- }
-
-
- public function pembatalan(Request $request)
- {
- // Validate the request
- $validatedData = $request->validate([
- 'permohonan_id' => 'required|exists:permohonan,id',
- 'alasan_pembatalan' => 'required|string',
- 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048',
- ]);
-
- // Handle file upload
- if ($request->hasFile('file_pembatalan')) {
- $file = $request->file('file_pembatalan');
- $filename = time() . '_' . $file->getClientOriginalName();
- $filePath = $file->storeAs('pembatalan', $filename, 'public');
- $validatedData['file_pembatalan'] = $filePath;
- }
-
- // Add created_by
- $validatedData['created_by'] = auth()->id();
-
- // Create new PermohonanPembatalan
- $pembatalan = PermohonanPembatalan::create($validatedData);
-
- return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval');
- }
-
- public function storeAproved(Request $request, $id): JsonResponse
- {
- $data = [];
- if (request()->ajax()) {
+ public function updateAuthorization(Request $request, $id)
+ {
try {
- $penilaian = Penilaian::findOrFail($id);
- $penilaian->update([
- 'authorized_status' => 1,
- ]);
-
- $permohonan = Permohonan::findOrFail($request->permohonan_id);
-
- $permohonan->update([
- 'status' => 'proses-survey'
- ]);
-
- $data['status'] = 'success';
- $data['message'] = 'Jadwal '.$request->noReg.' berhasil di aprove';
- } catch (\Exception $e) {
- $data['status'] = 'error';
- $data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage();
+ $permohonan = Permohonan::find($id);
+ $permohonan->status = $request->status;
+ $permohonan->keterangan = $request->keterangan;
+ $permohonan->save();
+ } catch (Exception $e) {
+ return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan');
}
- } else {
- $data['status'] = 'error';
- $data['message'] = "no ajax request";
+ return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully');
}
- return response()->json($data);
- }
+ public function show($id)
+ {
+ $permohonan = Permohonan::find($id);
+ return view('lpj::permohonan.show', compact('permohonan'));
+ }
- public function storeRescheduleSurvey(Request $request, $id)
- {
- try {
+ public function print($id)
+ {
+ $permohonan = Permohonan::find($id);
+ return view('lpj::permohonan.print', compact('permohonan'));
+
+ // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan'));
+ // return $pdf->stream();
+ }
+
+ public function showPembatalan($id)
+ {
+ $permohonan = Permohonan::with(['pembatalan', 'debiture'])->findOrFail($id);
+ return view('lpj::permohonan.pembatalan-form', compact('permohonan'));
+ }
+
+ public function pembatalan(Request $request)
+ {
+ // Validate the request
$validatedData = $request->validate([
'permohonan_id' => 'required|exists:permohonan,id',
- 'penilaian_id' => 'nullable',
- 'nomor_registrasi' => 'required',
- 'reschedule_note' => 'required',
- 'reschedule_date' => 'required',
- 'keterangan' => 'required'
+ 'alasan_pembatalan' => 'required|string',
+ 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048',
]);
- DB::beginTransaction();
+ // Handle file upload
+ if ($request->hasFile('file_pembatalan')) {
+ $file = $request->file('file_pembatalan');
+ $filename = time() . '_' . $file->getClientOriginalName();
+ $filePath = $file->storeAs('pembatalan', $filename, 'public');
+ $validatedData['file_pembatalan'] = $filePath;
+ }
- $permohonan = Permohonan::findOrFail($request->permohonan_id);
- $permohonan->update([
- 'status' => 'request-reschedule'
- ]);
+ // Add created_by
+ $validatedData['created_by'] = auth()->id();
- $penilaian = Penilaian::findOrFail($id);
+ // Create new PermohonanPembatalan
+ $pembatalan = PermohonanPembatalan::create($validatedData);
- $penilaian->update([
- 'reschedule_date' => $request->reschedule_date,
- 'reschedule_note' => $request->reschedule_note,
- ]);
-
- DB::commit();
- return response()->json([
- 'status' => 'success',
- 'message' => 'Proses request reschedule permohonan Nomor registrasi '.$request->nomor_registrasi.' berhasil',
- ]);
- } catch (\Exception $e) {
- DB::rollBack();
- return response()->json([
- 'status' => 'error',
- 'message' => 'Gagal membuat request reschedule: ' . $e->getMessage(),
- ]);
+ return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval');
}
- }
-}
+ public function storeAproved(Request $request, $id)
+ : JsonResponse {
+ $data = [];
+ if (request()->ajax()) {
+ try {
+ $penilaian = Penilaian::findOrFail($id);
+ $penilaian->update([
+ 'authorized_status' => 1,
+ ]);
+
+ $permohonan = Permohonan::findOrFail($request->permohonan_id);
+
+ $permohonan->update([
+ 'status' => 'proses-survey',
+ ]);
+
+ $data['status'] = 'success';
+ $data['message'] = 'Jadwal ' . $request->noReg . ' berhasil di aprove';
+ } catch (Exception $e) {
+ $data['status'] = 'error';
+ $data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage();
+ }
+ } else {
+ $data['status'] = 'error';
+ $data['message'] = "no ajax request";
+ }
+
+ return response()->json($data);
+ }
+
+ public function update(PermohonanRequest $request, $id)
+ {
+ $permohonan = Permohonan::findOrFail($id);
+ $beforeRequest = $permohonan->toArray();
+
+ $validate = $request->validated();
+ if ($validate) {
+ try {
+ // Update in database
+
+ if ($permohonan->status == 'revisi') {
+ $validate['status'] = 'order';
+ }
+ $permohonan->update($validate);
+
+ $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
+ if (count($documents) < 1) {
+ return redirect()->route(
+ 'debitur.jaminan.create',
+ array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]),
+ )->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
+ }
+
+ return redirect()
+ ->route('permohonan.index')->with('success', 'Permohonan updated successfully');
+ } catch (Exception $e) {
+ return redirect()
+ ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan');
+ }
+ }
+ }
+
+ public function storeRescheduleSurvey(Request $request, $id)
+ {
+ try {
+ $validatedData = $request->validate([
+ 'permohonan_id' => 'required|exists:permohonan,id',
+ 'penilaian_id' => 'nullable',
+ 'nomor_registrasi' => 'required',
+ 'reschedule_note' => 'required',
+ 'reschedule_date' => 'required',
+ 'keterangan' => 'required',
+ ]);
+
+ DB::beginTransaction();
+
+ $permohonan = Permohonan::findOrFail($request->permohonan_id);
+ $permohonan->update([
+ 'status' => 'request-reschedule',
+ ]);
+
+ $penilaian = Penilaian::findOrFail($id);
+
+ $penilaian->update([
+ 'reschedule_date' => $request->reschedule_date,
+ 'reschedule_note' => $request->reschedule_note,
+ ]);
+
+ DB::commit();
+ return response()->json([
+ 'status' => 'success',
+ 'message' => 'Proses request reschedule permohonan Nomor registrasi ' . $request->nomor_registrasi . ' berhasil',
+ ]);
+ } catch (Exception $e) {
+ DB::rollBack();
+ return response()->json([
+ 'status' => 'error',
+ 'message' => 'Gagal membuat request reschedule: ' . $e->getMessage(),
+ ]);
+ }
+ }
+
+ }
diff --git a/app/Http/Controllers/PersetujuanPenawaranController.php b/app/Http/Controllers/PersetujuanPenawaranController.php
index 1486fbe..3838167 100644
--- a/app/Http/Controllers/PersetujuanPenawaranController.php
+++ b/app/Http/Controllers/PersetujuanPenawaranController.php
@@ -6,6 +6,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest;
+ use Modules\Lpj\Models\Noc;
use Modules\Lpj\Models\PenawaranDetailTender;
use Modules\Lpj\Models\PenawaranDetailTenderLog;
use Modules\Lpj\Models\PenawaranTender;
@@ -67,6 +68,22 @@
$persetujuanPenawaran->save();
+
+ // Save NOC
+ try {
+ $noc = Noc::updateOrCreate([
+ 'permohonan_id' => $persetujuanPenawaran->permohonan_id,
+ 'persetujuan_penawaran_id' => $persetujuanPenawaran->id
+ ],[
+ 'bukti_bayar' => $persetujuanPenawaran->bukti_bayar,
+ ]);
+ } catch (\Exception $e) {
+ \Log::error('Failed to create or update NOC: ' . $e->getMessage());
+ return redirect()
+ ->route('persetujuan-penawaran.index')
+ ->with('error', 'Persetujuan Penawaran berhasil disimpan tetapi gagal membuat NOC: ' . $e->getMessage());
+ }
+
return redirect()
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.');
}
diff --git a/app/Http/Controllers/RekapHarianSoController.php b/app/Http/Controllers/RekapHarianSoController.php
new file mode 100644
index 0000000..5fae8e8
--- /dev/null
+++ b/app/Http/Controllers/RekapHarianSoController.php
@@ -0,0 +1,22 @@
+validate([
- 'dokument' => 'required',
+ 'documentId' => 'required',
'jenis_jaminan' => 'required'
]);
- $dokumentId = $validated['dokument'];
+ $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
@@ -1644,11 +1644,11 @@ class SurveyorController extends Controller
public function denah(Request $request, $id)
{
$validated = $request->validate([
- 'dokument' => 'required',
+ 'documentId' => 'required',
'jenis_jaminan' => 'required'
]);
- $dokumentId = $validated['dokument'];
+ $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
@@ -1672,11 +1672,11 @@ class SurveyorController extends Controller
public function foto(Request $request, $id)
{
$validated = $request->validate([
- 'dokument' => 'required',
+ 'documentId' => 'required',
'jenis_jaminan' => 'required'
]);
- $dokumentId = $validated['dokument'];
+ $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan'];
$fotoObjekJaminan = FotoObjekJaminan::all();
@@ -1707,11 +1707,11 @@ class SurveyorController extends Controller
// Ambil data permohonan dengan eager loading
$validated = $request->validate([
- 'dokument' => 'required',
+ 'documentId' => 'required',
'jenis_jaminan' => 'required'
]);
- $dokumentId = $validated['dokument'];
+ $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
diff --git a/app/Http/Requests/NocRequest.php b/app/Http/Requests/NocRequest.php
index 0cb7e66..13b76af 100644
--- a/app/Http/Requests/NocRequest.php
+++ b/app/Http/Requests/NocRequest.php
@@ -4,20 +4,150 @@
use Illuminate\Foundation\Http\FormRequest;
+ /**
+ * Form Request untuk validasi data NOC (Notice of Completion)
+ */
class NocRequest extends FormRequest
{
+ /**
+ * Konstanta untuk jenis file yang diizinkan
+ */
+ private const ALLOWED_FILE_TYPES = 'pdf,jpg,jpeg,png';
+
+ /**
+ * Konstanta untuk ukuran file maksimum (dalam KB)
+ */
+ private const MAX_FILE_SIZE = 10240;
+
+ /**
+ * Menentukan apakah pengguna berwenang untuk melakukan request ini
+ *
+ * @return bool
+ */
public function authorize()
{
return true;
}
+ /**
+ * Mengumpulkan semua aturan validasi
+ *
+ * @return array
+ */
public function rules()
+ {
+ return array_merge(
+ $this->getBasicInfoRules(),
+ $this->getPaymentRules(),
+ $this->getSettlementRules(),
+ $this->getAuthorizationRules(),
+ );
+ }
+
+ /**
+ * Aturan validasi untuk informasi dasar
+ *
+ * @return array
+ */
+ private function getBasicInfoRules()
{
return [
- 'penawaran_id' => 'nullable|exists:penawaran,id',
- 'nominal_bayar' => 'nullable|numeric|min:0',
- 'bukti_ksl' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240',
- 'status' => 'nullable|boolean',
+ 'permohonan_id' => 'required|exists:permohonan,id',
+ 'persetujuan_penawaran_id' => 'required|exists:persetujuan_penawaran,id',
+ 'status' => 'nullable|boolean',
+ 'created_by' => 'nullable|exists:users,id',
+ 'updated_by' => 'nullable|exists:users,id',
+ ];
+ }
+
+ /**
+ * Aturan validasi untuk data pembayaran
+ *
+ * @return array
+ */
+ private function getPaymentRules()
+ {
+ $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE;
+
+ return [
+ 'total_harus_bayar' => 'nullable|numeric|min:0',
+ 'nominal_bayar' => 'nullable|numeric|min:0',
+ 'bukti_ksl' => $fileRule,
+ 'bukti_bayar' => $fileRule,
+ 'status_bayar' => 'nullable|boolean',
+ 'tanggal_pembayaran' => 'nullable|date',
+ ];
+ }
+
+ /**
+ * Aturan validasi untuk data penyelesaian
+ *
+ * @return array
+ */
+ private function getSettlementRules()
+ {
+ $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE;
+
+ return [
+ 'nominal_penyelesaian' => 'nullable|numeric|min:0',
+ 'status_penyelesaian' => 'nullable|boolean',
+ 'tanggal_penyelesaian' => 'nullable|date',
+ 'bukti_penyelesaian' => $fileRule,
+ 'memo_penyelesaian' => $fileRule,
+ 'catatan_noc' => 'nullable|string',
+ ];
+ }
+
+ /**
+ * Aturan validasi untuk otorisasi
+ *
+ * @return array
+ */
+ private function getAuthorizationRules()
+ {
+ return [
+ 'authorized_status' => 'nullable|boolean',
+ 'authorized_at' => 'nullable|date',
+ 'authorized_by' => 'nullable|exists:users,id',
+ ];
+ }
+
+ /**
+ * Pesan khusus untuk validasi
+ *
+ * @return array
+ */
+ public function messages()
+ {
+ return [
+ 'permohonan_id.required' => 'ID Permohonan harus diisi',
+ 'permohonan_id.exists' => 'ID Permohonan tidak valid',
+ 'persetujuan_penawaran_id.required' => 'ID Persetujuan Penawaran harus diisi',
+ 'persetujuan_penawaran_id.exists' => 'ID Persetujuan Penawaran tidak valid',
+ 'nominal_bayar.numeric' => 'Nominal Bayar harus berupa angka',
+ 'nominal_bayar.min' => 'Nominal Bayar minimal 0',
+ 'bukti_ksl.file' => 'Bukti KSL harus berupa file',
+ 'bukti_ksl.mimes' => 'Bukti KSL harus berformat pdf, jpg, jpeg, atau png',
+ 'bukti_ksl.max' => 'Ukuran Bukti KSL maksimal 10MB',
+ 'bukti_bayar.file' => 'Bukti Bayar harus berupa file',
+ 'bukti_bayar.mimes' => 'Bukti Bayar harus berformat pdf, jpg, jpeg, atau png',
+ 'bukti_bayar.max' => 'Ukuran Bukti Bayar maksimal 10MB',
+ 'status.boolean' => 'Status harus berupa boolean',
+ 'status_bayar.boolean' => 'Status Bayar harus berupa boolean',
+ 'tanggal_pembayaran.date' => 'Format Tanggal Pembayaran tidak valid',
+ 'nominal_penyelesaian.numeric' => 'Nominal Penyelesaian harus berupa angka',
+ 'nominal_penyelesaian.min' => 'Nominal Penyelesaian minimal 0',
+ 'status_penyelesaian.boolean' => 'Status Penyelesaian harus berupa boolean',
+ 'tanggal_penyelesaian.date' => 'Format Tanggal Penyelesaian tidak valid',
+ 'bukti_penyelesaian.file' => 'Bukti Penyelesaian harus berupa file',
+ 'bukti_penyelesaian.mimes' => 'Bukti Penyelesaian harus berformat pdf, jpg, jpeg, atau png',
+ 'bukti_penyelesaian.max' => 'Ukuran Bukti Penyelesaian maksimal 10MB',
+ 'memo_penyelesaian.file' => 'Memo Penyelesaian harus berupa file',
+ 'memo_penyelesaian.mimes' => 'Memo Penyelesaian harus berformat pdf, jpg, jpeg, atau png',
+ 'memo_penyelesaian.max' => 'Ukuran Memo Penyelesaian maksimal 10MB',
+ 'authorized_status.boolean' => 'Status Otorisasi harus berupa boolean',
+ 'authorized_at.date' => 'Format Tanggal Otorisasi tidak valid',
+ 'authorized_by.exists' => 'User Otorisasi tidak valid',
];
}
}
diff --git a/app/Http/Requests/PersetujuanPenawaranRequest.php b/app/Http/Requests/PersetujuanPenawaranRequest.php
index 8d04940..d1f87f8 100644
--- a/app/Http/Requests/PersetujuanPenawaranRequest.php
+++ b/app/Http/Requests/PersetujuanPenawaranRequest.php
@@ -23,8 +23,6 @@
'sla_final' => 'nullable|numeric|min:0',
'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
- 'bukti_bayar' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240',
- 'nominal_bayar' => 'nullable|numeric|min:0',
'status' => 'nullable|boolean',
'authorized_status' => 'boolean',
'authorized_at' => 'nullable|date',
@@ -52,9 +50,6 @@
'surat_representasi.file' => 'Surat Representasi harus berupa file.',
'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.',
'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.',
- 'bukti_bayar.file' => 'Bukti Bayar harus berupa file.',
- 'bukti_bayar.mimes' => 'Bukti Bayar harus berupa file PDF, JPG, JPEG, atau PNG.',
- 'bukti_bayar.max' => 'Ukuran Bukti Bayar tidak boleh lebih dari 10MB.',
'region_id.required' => 'Region ID wajib diisi.',
'region_id.exists' => 'Region ID tidak valid.',
'status.required' => 'Status wajib diisi.',
@@ -62,8 +57,6 @@
'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.',
'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.',
'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak valid.',
- 'status_bayar.required' => 'Status bayar wajib diisi.',
- 'status_bayar.in' => 'Status bayar harus berupa "sudah_bayar", "belum_bayar" atau "tidak bayar".',
];
}
}
diff --git a/app/Models/Noc.php b/app/Models/Noc.php
new file mode 100644
index 0000000..16a0342
--- /dev/null
+++ b/app/Models/Noc.php
@@ -0,0 +1,62 @@
+ 'decimal:2',
+ 'status_bayar' => 'boolean',
+ 'tanggal_pembayaran' => 'date',
+ 'nominal_penyelesaian' => 'decimal:2',
+ 'status_penyelesaiaan' => 'boolean',
+ 'tanggal_penyelesaian' => 'date',
+ 'status' => 'boolean',
+ 'authorized_status' => 'boolean',
+ 'authorized_at' => 'datetime',
+ ];
+
+ // Relationship with Permohonan
+ public function permohonan()
+ {
+ return $this->belongsTo(Permohonan::class, 'permohonan_id');
+ }
+
+ // Relationship with PersetujuanPenawaran
+ public function persetujuanPenawaran()
+ {
+ return $this->belongsTo(PersetujuanPenawaran::class, 'persetujuan_penawaran_id');
+ }
+
+ // Relationship with User (for authorized_by)
+ public function authorizedBy()
+ {
+ return $this->belongsTo(User::class, 'authorized_by');
+ }
+}
diff --git a/app/Models/Permohonan.php b/app/Models/Permohonan.php
index 5644430..4490721 100644
--- a/app/Models/Permohonan.php
+++ b/app/Models/Permohonan.php
@@ -259,4 +259,10 @@
return $this->belongsTo(Inspeksi::class, 'permohonan_id');
}
+ // Add this relationship
+ public function noc()
+ {
+ return $this->hasOne(Noc::class, 'permohonan_id');
+ }
+
}
diff --git a/app/Models/PersetujuanPenawaran.php b/app/Models/PersetujuanPenawaran.php
index 014a5a3..0bb8158 100644
--- a/app/Models/PersetujuanPenawaran.php
+++ b/app/Models/PersetujuanPenawaran.php
@@ -25,7 +25,6 @@
'authorized_status',
'authorized_at',
'authorized_by',
- 'status',
'catatan',
];
@@ -58,4 +57,10 @@
{
return $this->belongsTo(User::class, 'authorized_by');
}
+
+ // Relationship with Noc
+ public function noc()
+ {
+ return $this->hasOne(Noc::class, 'persetujuan_penawaran_id');
+ }
}
diff --git a/app/Services/DashboardService.php b/app/Services/DashboardService.php
new file mode 100644
index 0000000..2443207
--- /dev/null
+++ b/app/Services/DashboardService.php
@@ -0,0 +1,179 @@
+getTotalLpjInternal($start_date, $end_date);
+ $countLpjExternal = $this->getTotalLpjEksternal($start_date, $end_date);
+ $countResume = $this->getResumeCabang($start_date, $end_date);
+ $countPendapatan = $this->getPendapatanAppraisal($start_date, $end_date);
+
+ return [
+ 'count_lpj_internal' => $countLpjInternal,
+ 'count_lpj_eksternal' => $countLpjExternal,
+ 'count_resume' => $countResume,
+ 'count_pendapatan' => $countPendapatan
+ ];
+
+ }
+
+
+
+ public function getTotalLpjInternal($start_date, $end_date)
+ {
+ $months = $this->getMonthly();
+ $regions = $this->getRegion();
+ $data = [];
+
+ foreach ($months as $index => $month) {
+ $monthNumber = $index + 1;
+ $data[$month] = [];
+
+ foreach ($regions as $region) {
+ if ($monthNumber > now()->month) {
+
+ $data[$month][$region] = [
+ 'total_laporan' => 0,
+ 'total_debiture' => 0,
+ ];
+ } else {
+
+ $totalLaporan = Laporan::whereBetween('created_at', [$start_date, $end_date])
+ ->count();
+ $totalDebitur = Permohonan::whereBetween('created_at', [$start_date, $end_date])
+ ->where('status', 'done')
+ ->distinct()
+ ->count('debiture_id');
+
+
+
+ $data[$month][$region] = [
+ 'total_laporan' => $totalLaporan,
+ 'total_debiture' => $totalDebitur,
+ ];
+ }
+ }
+ }
+ return $data;
+ }
+
+
+
+ public function getPendapatanAppraisal($start_date, $end_date)
+{
+ $months = $this->getMonthly();
+ $data = [];
+
+ foreach ($months as $index => $month) {
+ $monthNumber = $index + 1;
+
+ if ($monthNumber > now()->month) {
+ // Bulan belum terjadi
+ $data[$month] = [
+ 'total_jumlah' => 0,
+ 'total_akumulasi' => 0,
+ ];
+ } else {
+ // Hitung jumlah nominal_bayar pada bulan ini
+ $totalJumlah = Noc::whereYear('tanggal_pembayaran', now()->year)
+ ->whereMonth('tanggal_pembayaran', $monthNumber)
+ ->sum('nominal_bayar');
+
+
+ $data[$month] = [
+ 'total_jumlah' => $totalJumlah,
+ 'total_akumulasi' => $totalJumlah,
+ ];
+ }
+ }
+
+ return $data;
+}
+
+ public function getResumeCabang($start_date, $end_date)
+ {
+ $regions = $this->getRegion();
+ $status = ['batal', 'done'];
+ $data = [];
+
+ foreach ($status as $item) {
+ $data[$item] = [];
+ foreach ($regions as $region) {
+ $totalLaporan = DB::table('laporan')
+ ->join('permohonan', 'laporan.permohonan_id', '=', 'permohonan.id')
+ ->where('permohonan.status', $item)
+ ->whereBetween('laporan.created_at', [$start_date, $end_date])
+ ->count();
+
+ $data[$item][$region] = [
+ 'count_report' => $totalLaporan,
+ ];
+ }
+ }
+
+ return $data;
+
+ }
+ public function getTotalLpjEksternal($start_date, $end_date)
+ {
+ $months = $this->getMonthly();
+ $data = [];
+ foreach ($months as $index => $month) {
+ $monthNumber = $index + 1;
+ if ($monthNumber > now()->month) {
+ $data[$month] = [
+ 'total_laporan' => 0,
+ 'total_debiture' => 0,
+ ];
+ } else {
+ $totalLaporan = Laporan::where('created_at', '>=', $start_date)->where('created_at', '<=', $end_date)->count();
+
+ $totalDebitur = Permohonan::whereBetween('created_at', [$start_date, $end_date])
+ ->where('status', 'done')
+ ->distinct()
+ ->count('debiture_id');
+
+ $data[$month] = [
+ 'total_laporan' => $totalLaporan,
+ 'total_debiture' => $totalDebitur,
+ ];
+ }
+ }
+ return $data;
+
+
+ }
+
+ private function getMonthly()
+ {
+ return [
+ 'januari',
+ 'februari',
+ 'maret',
+ 'april',
+ 'mei',
+ 'juni',
+ 'juli',
+ 'agustus',
+ 'september',
+ 'oktober',
+ 'november',
+ 'desember',
+ ];
+ }
+
+ private function getRegion()
+ {
+ return [
+ 'jabodetabek',
+ 'non-jabodetabek',
+ ];
+ }
+}
diff --git a/app/Services/LaporanDebitureService.php b/app/Services/LaporanDebitureService.php
new file mode 100644
index 0000000..fb27ce6
--- /dev/null
+++ b/app/Services/LaporanDebitureService.php
@@ -0,0 +1,182 @@
+where('status', 'done');
+
+ // Apply search filter if provided
+ if ($request->has('search') && !empty($request->get('search'))) {
+ $search = json_decode($request->get('search'));
+
+ if (isset($search->start_date) || isset($search->end_date)) {
+ $query->whereBetween('tanggal_permohonan', [
+ $search->start_date ?? '1900-01-01',
+ $search->end_date ?? now()->toDateString()
+ ]);
+ }
+
+ // Filter by branch if provided
+ if (isset($search->debiture_id) && !empty($search->debiture_id)) {
+ $query->where('debiture_id', $search->debiture_id);
+ }
+
+ if (isset($search->search)) {
+
+ $query->where(function ($q) use ($search) {
+ $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
+ $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhere('status', 'LIKE', '%' . $search->search . '%');
+ });
+ }
+ }
+
+ // Apply sorting if provided
+ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
+ $order = $request->get('sortOrder');
+ $column = $request->get('sortField');
+ $query->orderBy($column, $order);
+ }
+
+ // Get the total count of records
+ $totalRecords = $query->count();
+
+ // Apply pagination if provided
+ if ($request->has('page') && $request->has('size')) {
+ $page = $request->get('page');
+ $size = $request->get('size');
+ $offset = ($page - 1) * $size; // Calculate the offset
+
+ $query->skip($offset)->take($size);
+ }
+
+ // Get the filtered count of records
+ $filteredRecords = $query->count();
+
+ // Get the data for the current page
+ $data = $query->with(['debiture.branch'])->get();
+
+ $data = $data->map(function ($permohonan) {
+ $luas_tanah = 0;
+ $luas_bangunan = 0;
+ $nilai_tanah = 0;
+ $nilai_bangunan = 0;
+ $npw = 0;
+ $nilai_liquidasi = 0;
+
+ if (isset($permohonan->penilai->lpj)) {
+ $lpj = json_decode($permohonan->penilai->lpj, true);
+ $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
+
+ $luas_tanah = $lpj['luas_tanah'] ?? 0;
+ $luas_bangunan = $lpj['luas_bangunan'] ?? 0;
+ // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
+ $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
+
+ $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
+ $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
+ }
+
+ return [
+ 'id' => $permohonan->id,
+ 'nomor_registrasi' => $permohonan->nomor_registrasi,
+ 'jenis_penilaian' => $permohonan->jenisPenilaian?->name,
+ 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
+ 'jenis_fasilitas_kredit' => $permohonan->jenisFasilitasKredit?->name,
+ 'branch' => $permohonan->debiture->branch?->name,
+ 'pemohon' => $permohonan->creator?->name,
+ 'cif' => $permohonan->debiture->cif,
+ 'name' => $permohonan->debiture?->name,
+ 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')
+ ->unique()
+ ->implode(', '),
+ 'alamat_agunan' => $permohonan->documents?->map(function ($document) {
+ return formatAlamat($document);
+ })->unique()->implode(', '),
+ 'bukti_kepemilikan' => (function () use ($permohonan) {
+ $legalitasItems = $permohonan->documents?->flatMap(function ($document) {
+ return $document->detail->map(function ($detail) {
+ // Jika tidak ada jenis legalitas jaminan, lewati
+ if (empty($detail->jenisLegalitasJaminan)) {
+ return null;
+ }
+
+ // Hanya tampilkan detail yang memiliki dokumen_jaminan
+ if (empty($detail->dokumen_jaminan)) {
+ return null;
+ }
+
+ // Tampilkan nama legalitas jaminan saja
+ return $detail->jenisLegalitasJaminan->name ?? '';
+ });
+ })->filter()->unique()->values()->toArray();
+
+ // Buat daftar bernomor
+ $result = '';
+ foreach ($legalitasItems as $index => $item) {
+ $result .= ($index + 1) . '. ' . $item . "\n";
+ }
+
+ return $result;
+ })(),
+ 'nama_pemilik' => $permohonan->documents?->pluck('pemilik.name')
+ ->unique()
+ ->implode(', '),
+ 'luas_tanah' => $luas_tanah . ' m²',
+ 'nilai_tanah' => formatRupiah($nilai_tanah, 2),
+ 'luas_bangunan' => $luas_bangunan . ' m²',
+ 'nilai_bangunan' => formatRupiah($nilai_bangunan, 2),
+ 'nilai_njop' => formatRupiah($permohonan->nilai_njop, 2),
+ 'nilai_pasar_wajar' => formatRupiah($npw, 2),
+ 'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2),
+ 'tanggal_documen_diterima' => $permohonan->documents?->map(function ($document) {
+ return $document->created_at->format('d-m-Y');
+ }),
+ 'tanggal_spk' => '',
+ 'nomor_spk' => '',
+ 'tanggal_rencana_kunjunagn' => '',
+ 'tanggal_kunjungan' => '',
+ 'taggal_delivered' => '',
+ 'jangka_waktu_sla' => '',
+ 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
+ 'nama_team_leader' => $permohonan->penilaian?->teams,
+ 'saran' => '',
+ 'catatan' => '',
+
+
+ 'tanggal_permohonan' => $permohonan->tanggal_permohonan,
+ 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
+ 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
+ ];
+ });
+
+ // Calculate the page count
+ $pageCount = ceil($totalRecords / $request->get('size'));
+
+ // Calculate the current page number
+ $currentPage = $request->get('page') ?: 1;
+
+ // Return the response data as a JSON object
+ return response()->json([
+ 'draw' => $request->get('draw'),
+ 'recordsTotal' => $totalRecords,
+ 'recordsFiltered' => $filteredRecords,
+ 'pageCount' => $pageCount,
+ 'page' => $currentPage,
+ 'totalCount' => $totalRecords,
+ 'data' => $data,
+ ]);
+ }
+}
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/app/Services/LaporanSLAPenilaiService.php b/app/Services/LaporanSLAPenilaiService.php
new file mode 100644
index 0000000..9010ceb
--- /dev/null
+++ b/app/Services/LaporanSLAPenilaiService.php
@@ -0,0 +1,128 @@
+where('status', 'done');
+
+ // Apply search filter if provided
+ if ($request->has('search') && !empty($request->get('search'))) {
+ $search = json_decode($request->get('search'));
+
+ if (isset($search->start_date) || isset($search->end_date)) {
+ $query->whereBetween('tanggal_permohonan', [
+ $search->start_date ?? '1900-01-01',
+ $search->end_date ?? now()->toDateString()
+ ]);
+ }
+
+
+ if (isset($search->penilai_id) && !empty($search->penilai_id)) {
+ $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($search) {
+ $q->where('user_id', $search->penilai_id);
+ });
+ }
+
+ if (isset($search->search)) {
+
+ $query->where(function ($q) use ($search) {
+ $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
+ $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhere('status', 'LIKE', '%' . $search->search . '%');
+ });
+ }
+ }
+
+ // Apply sorting if provided
+ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
+ $order = $request->get('sortOrder');
+ $column = $request->get('sortField');
+ $query->orderBy($column, $order);
+ }
+
+ // Get the total count of records
+ $totalRecords = $query->count();
+
+ // Apply pagination if provided
+ if ($request->has('page') && $request->has('size')) {
+ $page = $request->get('page');
+ $size = $request->get('size');
+ $offset = ($page - 1) * $size; // Calculate the offset
+
+ $query->skip($offset)->take($size);
+ }
+
+ // Get the filtered count of records
+ $filteredRecords = $query->count();
+
+ // Get the data for the current page
+ $data = $query->with(['debiture.branch'])->get();
+
+ $data = $data->map(function ($permohonan) {
+ $luas_tanah = 0;
+ $luas_bangunan = 0;
+ $nilai_tanah = 0;
+ $nilai_bangunan = 0;
+ $npw = 0;
+ $nilai_liquidasi = 0;
+ if (isset($permohonan->penilai->lpj)) {
+ $lpj = json_decode($permohonan->penilai->lpj, true);
+ $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
+
+ $luas_tanah = $lpj['luas_tanah'] ?? 0;
+ $luas_bangunan = $lpj['luas_bangunan'] ?? 0;
+ // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
+ $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
+
+ $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
+ $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
+ }
+
+ return [
+ 'id' => $permohonan->id,
+ 'nomor_registrasi' => $permohonan->nomor_registrasi,
+ 'tanggal_permohonan' => $permohonan->tanggal_permohonan,
+ 'branch' => $permohonan->debiture?->branch?->name,
+ 'name' => $permohonan->debiture?->name,
+ 'pemohon' => $permohonan->creator?->name,
+ 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
+ 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '),
+
+ 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
+ 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
+ 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
+ ];
+ });
+
+ // Calculate the page count
+ $pageCount = ceil($totalRecords / $request->get('size'));
+
+ // Calculate the current page number
+ $currentPage = $request->get('page', 1);
+
+ // Return the response data as a JSON object
+ return response()->json([
+ 'draw' => $request->get('draw'),
+ 'recordsTotal' => $totalRecords,
+ 'recordsFiltered' => $filteredRecords,
+ 'pageCount' => $pageCount,
+ 'page' => $currentPage,
+ 'totalCount' => $totalRecords,
+ 'data' => $data,
+ ]);
+ }
+}
diff --git a/app/Services/LaporanUserService.php b/app/Services/LaporanUserService.php
new file mode 100644
index 0000000..c53dd59
--- /dev/null
+++ b/app/Services/LaporanUserService.php
@@ -0,0 +1,198 @@
+whereNotNull('permohonan.nomor_registrasi')
+ ->when($search, function ($query) use ($search) {
+ $query->where('users.name', 'like', "%$search%");
+ })
+ ->select('users.id', 'users.name')
+ ->distinct()
+ ->orderBy('users.name')
+ ->limit(20)
+ ->get();
+ }
+
+
+ public function dataForDatatables(Request $request)
+ {
+
+ // Retrieve data from the database
+ $query = Permohonan::query();
+ $query = $query->where('status', 'done');
+
+ // Apply search filter if provided
+ if ($request->has('search') && !empty($request->get('search'))) {
+ $search = json_decode($request->get('search'));
+
+ if (isset($search->start_date) || isset($search->end_date)) {
+ $query->whereBetween('tanggal_permohonan', [
+ $search->start_date ?? '1900-01-01',
+ $search->end_date ?? now()->toDateString()
+ ]);
+ }
+
+ // Filter by branch if provided
+ if (isset($search->user_id) && !empty($search->user_id)) {
+ $query->where('user_id', $search->user_id);
+ }
+
+ if (isset($search->search)) {
+
+ $query->where(function ($q) use ($search) {
+ $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
+ $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
+ $q->orWhere('status', 'LIKE', '%' . $search->search . '%');
+ });
+ }
+ }
+
+ // Apply sorting if provided
+ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
+ $order = $request->get('sortOrder');
+ $column = $request->get('sortField');
+ $query->orderBy($column, $order);
+ }
+
+ // Get the total count of records
+ $totalRecords = $query->count();
+
+ // Apply pagination if provided
+ if ($request->has('page') && $request->has('size')) {
+ $page = $request->get('page');
+ $size = $request->get('size');
+ $offset = ($page - 1) * $size; // Calculate the offset
+
+ $query->skip($offset)->take($size);
+ }
+
+ // Get the filtered count of records
+ $filteredRecords = $query->count();
+
+ // Get the data for the current page
+ $data = $query->with(['debiture.branch'])->get();
+
+ $data = $data->map(function ($permohonan) {
+ $luas_tanah = 0;
+ $luas_bangunan = 0;
+ $nilai_tanah = 0;
+ $nilai_bangunan = 0;
+ $npw = 0;
+ $nilai_liquidasi = 0;
+
+ if (isset($permohonan->penilai->lpj)) {
+ $lpj = json_decode($permohonan->penilai->lpj, true);
+ $npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
+
+ $luas_tanah = $lpj['luas_tanah'] ?? 0;
+ $luas_bangunan = $lpj['luas_bangunan'] ?? 0;
+ // Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
+ $nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
+
+ $nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
+ $nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
+ }
+
+ return [
+ 'id' => $permohonan->id,
+ 'nomor_registrasi' => $permohonan->nomor_registrasi,
+ 'jenis_penilaian' => $permohonan->jenisPenilaian?->name,
+ 'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
+ 'jenis_fasilitas_kredit' => $permohonan->jenisFasilitasKredit?->name,
+ 'branch' => $permohonan->debiture->branch?->name,
+ 'pemohon' => $permohonan->creator?->name,
+ 'cif' => $permohonan->debiture->cif,
+ 'name' => $permohonan->debiture?->name,
+ 'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')
+ ->unique()
+ ->implode(', '),
+ 'alamat_agunan' => $permohonan->documents?->map(function ($document) {
+ return formatAlamat($document);
+ })->unique()->implode(', '),
+ 'bukti_kepemilikan' => (function () use ($permohonan) {
+ $legalitasItems = $permohonan->documents?->flatMap(function ($document) {
+ return $document->detail->map(function ($detail) {
+ // Jika tidak ada jenis legalitas jaminan, lewati
+ if (empty($detail->jenisLegalitasJaminan)) {
+ return null;
+ }
+
+ // Hanya tampilkan detail yang memiliki dokumen_jaminan
+ if (empty($detail->dokumen_jaminan)) {
+ return null;
+ }
+
+ // Tampilkan nama legalitas jaminan saja
+ return $detail->jenisLegalitasJaminan->name ?? '';
+ });
+ })->filter()->unique()->values()->toArray();
+
+ // Buat daftar bernomor
+ $result = '';
+ foreach ($legalitasItems as $index => $item) {
+ $result .= ($index + 1) . '. ' . $item . "\n";
+ }
+
+ return $result;
+ })(),
+ 'nama_pemilik' => $permohonan->documents?->pluck('pemilik.name')
+ ->unique()
+ ->implode(', '),
+ 'luas_tanah' => $luas_tanah . ' m²',
+ 'nilai_tanah' => formatRupiah($nilai_tanah, 2),
+ 'luas_bangunan' => $luas_bangunan . ' m²',
+ 'nilai_bangunan' => formatRupiah($nilai_bangunan, 2),
+ 'nilai_njop' => formatRupiah($permohonan->nilai_njop, 2),
+ 'nilai_pasar_wajar' => formatRupiah($npw, 2),
+ 'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2),
+ 'tanggal_documen_diterima' => $permohonan->documents?->map(function ($document) {
+ return $document->created_at->format('d-m-Y');
+ }),
+ 'tanggal_spk' => '',
+ 'nomor_spk' => '',
+ 'tanggal_rencana_kunjunagn' => '',
+ 'tanggal_kunjungan' => '',
+ 'taggal_delivered' => '',
+ 'jangka_waktu_sla' => '',
+ 'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
+ 'nama_team_leader' => $permohonan->penilaian?->teams,
+ 'saran' => '',
+ 'catatan' => '',
+
+
+ 'tanggal_permohonan' => $permohonan->tanggal_permohonan,
+ 'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
+ 'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
+ ];
+ });
+
+ // Calculate the page count
+ $pageCount = ceil($totalRecords / $request->get('size'));
+
+ // Calculate the current page number
+ $currentPage = $request->get('page') ?: 1;
+
+ // Return the response data as a JSON object
+ return response()->json([
+ 'draw' => $request->get('draw'),
+ 'recordsTotal' => $totalRecords,
+ 'recordsFiltered' => $filteredRecords,
+ 'pageCount' => $pageCount,
+ 'page' => $currentPage,
+ 'totalCount' => $totalRecords,
+ 'data' => $data,
+ ]);
+ }
+}
diff --git a/app/Services/RekapHarianService.php b/app/Services/RekapHarianService.php
new file mode 100644
index 0000000..de3924e
--- /dev/null
+++ b/app/Services/RekapHarianService.php
@@ -0,0 +1,63 @@
+ $jenis) {
+
+ $totalLaporanDebiture = $this->totalLaporanDebiture();
+ $totalKunjunganDebiture = $this->totalKunjunganDebiture();
+ $totalKunjunganLokasi = $this->totalKunjunganLokasi();
+
+
+ $grandTotal = [
+ 'laporan_debiture' => 0,
+ 'debiture' => 0,
+ 'lokasi' => 0,
+ 'pipeline' => 0
+ ];
+ }
+ return $grandTotal;
+
+ }
+
+
+ private function totalLaporanDebiture()
+ {
+ $query = [
+ 'jenis_penilaian_id' => 1,
+ 'total' => 2
+ ];
+ return $query;
+ }
+
+ public function totalKunjunganDebiture()
+ {
+ $query = [
+ 'jenis_penilaian_id' => 1,
+ 'total' => 2
+ ];
+ return $query;
+ }
+
+ public function totalKunjunganLokasi()
+ {
+ $query = [
+ 'jenis_penilaian_id' => 1,
+ 'total' => 2
+ ];
+ return $query;
+ }
+}
diff --git a/app/Services/SaveFormInspesksiService.php b/app/Services/SaveFormInspesksiService.php
index cc88461..1abc932 100644
--- a/app/Services/SaveFormInspesksiService.php
+++ b/app/Services/SaveFormInspesksiService.php
@@ -122,7 +122,7 @@ class SaveFormInspesksiService
}
if ($hasFactaData) {
- $rules = array_merge($rules, $this->getFactData($data, $request));
+ $rules = array_merge($rules, $this->getFactData($data, $request, $inspeksi));
}
return $rules;
diff --git a/database/migrations/2025_05_04_124217_create_nocs_table.php b/database/migrations/2025_05_04_124217_create_nocs_table.php
new file mode 100644
index 0000000..a91fc31
--- /dev/null
+++ b/database/migrations/2025_05_04_124217_create_nocs_table.php
@@ -0,0 +1,52 @@
+id();
+ $table->unsignedBigInteger('permohonan_id');
+ $table->unsignedBigInteger('persetujuan_penawaran_id');
+ $table->string('bukti_bayar')->nullable();
+ $table->decimal('nominal_bayar', 15, 2)->nullable();
+ $table->boolean('status_bayar')->default(false);
+ $table->date('tanggal_pembayaran')->nullable();
+ $table->decimal('nominal_penyelesaian', 15, 2)->nullable();
+ $table->boolean('status_penyelesaiaan')->default(false);
+ $table->date('tanggal_penyelesaian')->nullable();
+ $table->string('bukti_penyelesaian')->nullable();
+ $table->string('bukti_ksl')->nullable();
+ $table->text('memo_penyelesaian')->nullable();
+ $table->boolean('status')->default(true);
+ $table->string('catatan_noc')->nullable();
+ $table->char('authorized_status', 1)->nullable();
+ $table->timestamp('authorized_at')->nullable();
+ $table->unsignedBigInteger('authorized_by')->nullable();
+ $table->unsignedBigInteger('created_by')->nullable();
+ $table->unsignedBigInteger('updated_by')->nullable();
+ $table->unsignedBigInteger('deleted_by')->nullable();
+ $table->timestamps();
+ $table->softDeletes();
+
+ $table->foreign('permohonan_id')->references('id')->on('permohonan');
+ $table->foreign('persetujuan_penawaran_id')->references('id')->on('persetujuan_penawaran');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down()
+ : void
+ {
+ Schema::dropIfExists('noc');
+ }
+ };
diff --git a/module.json b/module.json
index bf9626d..fc81e7f 100644
--- a/module.json
+++ b/module.json
@@ -115,6 +115,122 @@
"EO Appraisal",
"senior-officer"
]
+ },
+ {
+ "title": "Rekap Harian So",
+ "path": "rekap-harian-so",
+ "icon": "ki-filled ki-filter-tablet text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "senior-officer"
+ ]
+ }, {
+ "title": "Laporan Biaya Lpj",
+ "path": "laporan-biaya",
+ "icon": "ki-filled ki-filter-tablet text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "pemohon-ao",
+ "pemohon-eo",
+ "admin",
+ "DD Appraisal",
+ "EO Appraisal",
+ "senior-officer"
+ ],
+ "sub": [
+ {
+ "title": "Intenal",
+ "path": "laporan-biaya.internal",
+ "icon": "ki-filled ki-two-credit-cart text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "pemohon-ao",
+ "pemohon-eo",
+ "admin",
+ "DD Appraisal",
+ "EO Appraisal",
+ "senior-officer"
+ ]
+ },
+ {
+ "title": "External",
+ "path": "laporan-biaya.external",
+ "icon": "ki-filled ki-two-credit-cart text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "pemohon-ao",
+ "pemohon-eo",
+ "admin",
+ "DD Appraisal",
+ "EO Appraisal",
+ "senior-officer"
+ ]
+ }
+ ]
+ },{
+ "title": "Laporan Debitur",
+ "path": "laporan-debiture",
+ "icon": "ki-filled ki-filter-tablet text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "senior-officer"
+ ]
+ },
+ {
+ "title": "Laporan User",
+ "path": "laporan-user",
+ "icon": "ki-filled ki-filter-tablet text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "senior-officer"
+ ]
+ },
+ {
+ "title": "Laporan Monitoring so",
+ "path": "laporan-monitoring",
+ "icon": "ki-filled ki-filter-tablet text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "senior-officer"
+ ]
+ },
+ {
+ "title": "Laporan SLA Penilai",
+ "path": "laporan-sla-penilai",
+ "icon": "ki-filled ki-filter-tablet text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "pemohon-ao",
+ "pemohon-eo",
+ "admin",
+ "DD Appraisal",
+ "EO Appraisal",
+ "senior-officer"
+ ]
}
],
"otorisator": [
@@ -265,13 +381,39 @@
{
"title": "NOC",
"path": "noc",
- "icon": "ki-filled ki-two-credit-cart text-lg text-primary",
+ "icon": "ki-filled ki-briefcase text-lg text-primary",
"classes": "",
"attributes": [],
"permission": "",
"roles": [
"administrator",
- "noc"
+ "admin"
+ ],
+ "sub": [
+ {
+ "title": "Pembayaran",
+ "path": "noc.pembayaran",
+ "icon": "ki-filled ki-two-credit-cart text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "noc"
+ ]
+ },
+ {
+ "title": "Penyelesaian",
+ "path": "noc.penyelesaian",
+ "icon": "ki-filled ki-two-credit-cart text-lg text-primary",
+ "classes": "",
+ "attributes": [],
+ "permission": "",
+ "roles": [
+ "administrator",
+ "noc"
+ ]
+ }
]
},
{
diff --git a/resources/views/component/form-penilai.blade.php b/resources/views/component/form-penilai.blade.php
index 12b2cee..a606f6f 100644
--- a/resources/views/component/form-penilai.blade.php
+++ b/resources/views/component/form-penilai.blade.php
@@ -36,7 +36,7 @@
Informasi dan pembanding
-
Edit Data Pembanding
@@ -553,7 +553,7 @@
const urlParams = new URLSearchParams(window.location.search);
const permohonanId = {{ $permohonan->id }};
- const documentId = urlParams.get('documentId');
+ const documentId = urlParams.get('dokument');
const inspeksiId = urlParams.get('inspeksiId');
const requestUrl =
diff --git a/resources/views/dashboard/index.blade.php b/resources/views/dashboard/index.blade.php
new file mode 100644
index 0000000..5b71ae7
--- /dev/null
+++ b/resources/views/dashboard/index.blade.php
@@ -0,0 +1,293 @@
+@extends('layouts.main')
+
+@section('content')
+
+
+
+
+
+ Dashboard
+
+
+
+ Selamat datang, {{ auth()->user()->name }}
+
+
+
+
+
+
+
+
+ @foreach ($dashboard['count_resume'] as $status => $count)
+ @php
+
+ $gradientFrom = $status === 'batal' ? 'from-red-50' : 'from-amber-50';
+ $gradientTo = $status === 'batal' ? 'to-red-100' : 'to-amber-100';
+ $borderColor = $status === 'batal' ? 'border-red-200' : 'border-amber-200';
+ $iconBg = $status === 'batal' ? 'bg-red-500' : 'bg-amber-500';
+ $iconColor = $status === 'batal' ? 'text-red-500' : 'text-amber-500';
+ $textColor = $status === 'batal' ? 'text-red-800' : 'text-amber-800';
+ $cardTitle = $status === 'batal' ? 'Batal dari Cabang' : 'Menunggu Keputusan Cabang';
+ @endphp
+
+
+
+
+
+
+
+
+
Jabodetabek
+
+ {{ $count['jabodetabek']['count_report'] ?? 0 }}
+
+
+
+
+
+
+
+
+
+
+
Luar Jabodetabek
+
+ {{ $count['non-jabodetabek']['count_report'] ?? 0 }}
+
+
+
+
+
+
+
+
+
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+
+ |
+ Bulan
+ |
+
+ Jumlah
+ |
+
+ Akumulasi
+ |
+
+
+
+ @foreach ($dashboard['count_pendapatan'] as $month => $data)
+
+
+ |
+ {{ ucfirst($month) }}
+ |
+
+
+
+ {{ $data['total_jumlah'] ?? '-' }}
+ |
+
+
+
+ {{ $data['total_akumulasi'] ?? '-' }}
+ |
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ Bulan
+ |
+
+ Jabodetabek
+ |
+
+ Luar Jabodetabek
+ |
+
+
+ |
+ Laporan
+ |
+
+ Debitur
+ |
+
+ Laporan
+ |
+
+ Debitur
+ |
+
+
+
+ @foreach ($dashboard['count_lpj_internal'] as $month => $regions)
+
+ |
+ {{ ucfirst($month) }}
+ |
+
+ {{ $regions['jabodetabek']['total_laporan'] ?? '-' }}
+ |
+
+ {{ $regions['jabodetabek']['total_debiture'] ?? '-' }}
+ |
+
+ {{ $regions['non-jabodetabek']['total_laporan'] ?? '-' }}
+ |
+
+ {{ $regions['non-jabodetabek']['total_debiture'] ?? '-' }}
+ |
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ Bulan
+ |
+
+ Laporan
+ |
+
+ Debitur
+ |
+
+
+
+ @foreach ($dashboard['count_lpj_eksternal'] as $month => $data)
+
+
+ |
+ {{ ucfirst($month) }}
+ |
+
+
+
+ {{ $data['total_laporan'] ?? '-' }}
+ |
+
+
+
+ {{ $data['total_debiture'] ?? '-' }}
+ |
+
+ @endforeach
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/laporan-biaya/external.blade.php b/resources/views/laporan-biaya/external.blade.php
new file mode 100644
index 0000000..bc59c17
--- /dev/null
+++ b/resources/views/laporan-biaya/external.blade.php
@@ -0,0 +1,499 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('laporan-hasil-penilaian-jaminan-internal-external') }}
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/laporan-biaya/internal.blade.php b/resources/views/laporan-biaya/internal.blade.php
new file mode 100644
index 0000000..860f8cc
--- /dev/null
+++ b/resources/views/laporan-biaya/internal.blade.php
@@ -0,0 +1,499 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('laporan-hasil-penilaian-jaminan-internal-external') }}
+@endsection
+
+@section('content')
+
S
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/laporan-debiture/index.blade.php b/resources/views/laporan-debiture/index.blade.php
new file mode 100644
index 0000000..3b36763
--- /dev/null
+++ b/resources/views/laporan-debiture/index.blade.php
@@ -0,0 +1,480 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('laporan-debiture') }}
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/laporan-monitoring/index.blade.php b/resources/views/laporan-monitoring/index.blade.php
new file mode 100644
index 0000000..95ad19e
--- /dev/null
+++ b/resources/views/laporan-monitoring/index.blade.php
@@ -0,0 +1,89 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('laporan-monitoring') }}
+@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..ca836b7
--- /dev/null
+++ b/resources/views/laporan-monitoring/show.blade.php
@@ -0,0 +1,211 @@
+ @extends('layouts.main')
+
+ @section('breadcrumbs')
+ {{ Breadcrumbs::render(request()->route()->getName()) }}
+ @endsection
+
+ @section('content')
+
+ @endsection
+
+ @push('scripts')
+
+ @endpush
diff --git a/resources/views/laporan-sla-penilai/index.blade.php b/resources/views/laporan-sla-penilai/index.blade.php
new file mode 100644
index 0000000..1515a15
--- /dev/null
+++ b/resources/views/laporan-sla-penilai/index.blade.php
@@ -0,0 +1,295 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('laporan-sla-penilai') }}
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/laporan-user/index.blade.php b/resources/views/laporan-user/index.blade.php
new file mode 100644
index 0000000..5f2e629
--- /dev/null
+++ b/resources/views/laporan-user/index.blade.php
@@ -0,0 +1,518 @@
+@extends('layouts.main')
+
+@section('breadcrumbs')
+ {{ Breadcrumbs::render('laporan-user') }}
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+
+
+@endpush
diff --git a/resources/views/laporan/index.blade.php b/resources/views/laporan/index.blade.php
index 9e1d2ee..85193ec 100644
--- a/resources/views/laporan/index.blade.php
+++ b/resources/views/laporan/index.blade.php
@@ -237,8 +237,17 @@
const type = data.penilai?.type || '';
let laporanButton = '';
let resumeButton = '';
+ let penyelesaian = '';
+ if(data.noc) {
+ if (!data.noc?.tanggal_penyelesaian && !data.noc?.memo_penyelesaian) {
+ penyelesaian = `
+
+ Penyelesaian
+ `;
+ }
+ }
if(data.penilai.resume) {
resumeButton = `
@@ -270,7 +279,7 @@
}
- return `
${resumeButton} ${laporanButton}
`;
+ return `
${penyelesaian} ${resumeButton} ${laporanButton}
`;
},
}
},
diff --git a/resources/views/laporan_hasil_penilaian_jaminan_internal_external/index.blade.php b/resources/views/laporan_hasil_penilaian_jaminan_internal_external/index.blade.php
index f67fb41..bc59c17 100644
--- a/resources/views/laporan_hasil_penilaian_jaminan_internal_external/index.blade.php
+++ b/resources/views/laporan_hasil_penilaian_jaminan_internal_external/index.blade.php
@@ -219,10 +219,19 @@
-
-
+
@@ -437,6 +446,7 @@
// Update export URL with filters
function updateExportUrl() {
+ dataTable.goPage(1);
let url = new URL(exportBtn.href);
if (startDateInput.value) {
diff --git a/resources/views/noc/form.blade.php b/resources/views/noc/form.blade.php
index 9d0eb81..34ac92a 100644
--- a/resources/views/noc/form.blade.php
+++ b/resources/views/noc/form.blade.php
@@ -4,21 +4,35 @@
{{ Breadcrumbs::render(request()->route()->getName()) }}
@endsection
+@php
+ $hasMemo = false;
+ try {
+ $memoPath = $persetujuanPenawaran->noc->memo_penyelesaian ?? null;
+ $hasMemo = isset($memoPath) && !empty($memoPath) && Storage::disk('public')->exists($memoPath);
+ } catch (Exception $e) {
+ // Jika terjadi error, $hasMemo tetap false
+ }
+@endphp
+
@section('content')