Merge branch 'staging' into lpj-db-migratio

This commit is contained in:
majid
2025-06-11 10:00:41 +07:00
41 changed files with 1404 additions and 990 deletions

View File

@@ -134,7 +134,7 @@
if ($penawaran) { if ($penawaran) {
$isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric $isNum = substr($maxCode, 2); // memastikan string ke 3 s/d 8 adalan numiric
$isNP = substr($maxCode, 0, 2); $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); $code_penawaran_last = substr($maxCode, -4);
$year_penawaran_last = Carbon::parse($penawaran->created_at)->year; $year_penawaran_last = Carbon::parse($penawaran->created_at)->year;
$year_now = Carbon::now()->year; $year_now = Carbon::now()->year;
@@ -149,11 +149,6 @@
return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString; return 'NP' . Carbon::now()->format('y') . $noUrutAkhirString;
} }
function isNumeric($str)
{
return ctype_digit($str);
}
// generate last penawaran.no_spk // generate last penawaran.no_spk
function onLastnumberCodePenawaranSPK($jenis_laporan_code) function onLastnumberCodePenawaranSPK($jenis_laporan_code)
: string : string
@@ -188,46 +183,7 @@
function onRomawi(int $bln) function onRomawi(int $bln)
: string : string
{ {
switch ($bln) { return convertToRoman($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;
}
} }
function penyebut($nilai) function penyebut($nilai)
@@ -304,15 +260,6 @@
return $hariKerja; return $hariKerja;
} }
function holidays()
{
return HolidayCalendar::pluck('date')->map(
function ($item) {
return Carbon::parse($item)->format('Y-m-d');
},
)->toArray();
}
function countPermohonanForUser($userId) function countPermohonanForUser($userId)
{ {
$validStatuses = [ $validStatuses = [

View File

@@ -123,7 +123,7 @@ class LaporanController extends Controller
$filteredRecords = $query->count(); $filteredRecords = $query->count();
// Get the data for the current page // 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 // Calculate the page count
$pageCount = ceil($totalRecords / $size); $pageCount = ceil($totalRecords / $size);

View File

@@ -61,7 +61,7 @@ class LaporanHasilPenilaianJaminanInternalExternalController extends Controller
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%'); $q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search->search) . '%');
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%'); $q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhere('status', 'LIKE', '%' . $search->search . '%'); $q->orWhere('status', 'LIKE', '%' . $search->search . '%');
@@ -192,7 +192,7 @@ class LaporanHasilPenilaianJaminanInternalExternalController extends Controller
$pageCount = ceil($totalRecords / $request->get('size')); $pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number // Calculate the current page number
$currentPage = $request->get('page', 1); $currentPage = $request->get('page') ?: 1;
// Return the response data as a JSON object // Return the response data as a JSON object
return response()->json([ return response()->json([

View File

@@ -6,6 +6,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Modules\Lpj\Http\Requests\NocRequest; use Modules\Lpj\Http\Requests\NocRequest;
use Modules\Lpj\Models\Noc;
use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\PenawaranTender;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PersetujuanPenawaran; use Modules\Lpj\Models\PersetujuanPenawaran;
@@ -43,26 +44,35 @@
$status = "persetujuan-penawaran"; $status = "persetujuan-penawaran";
} }
$persetujuanPenawaran = PersetujuanPenawaran::updateOrCreate(
['penawaran_id' => $validated['penawaran_id']], $dataNoc = [
$validated, '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')) { if ($request->hasFile('bukti_ksl')) {
$persetujuanPenawaran->bukti_ksl = $request->file('bukti_ksl')->store( $noc->bukti_ksl = $request->file('bukti_ksl')->store(
$folderPath, $folderPath,
'public', 'public',
); );
} }
$noc->save();
$persetujuanPenawaran->save();
// Update the status of the related permohonan to 'spk' // Update the status of the related permohonan to 'spk'
$permohonan = Permohonan::find(request()->get('permohonan_id')); $permohonan = Permohonan::find(request()->get('permohonan_id'));
if ($permohonan) { if ($permohonan) {
$permohonan->status_bayar = request()->get('status_bayar'); $permohonan->status_bayar = request()->get('status_pembayar');
if ($permohonan->jenis_penilaian_id == 2) { if ($permohonan->jenis_penilaian_id == 2) {
$permohonan->status = $status; $permohonan->status = $status;
} }
@@ -81,7 +91,7 @@
} }
return redirect() return redirect()
->route('noc.index')->with('success', 'Penyelesaian KSL berhasil disimpan.'); ->route('noc.index')->with('success', 'NOC berhasil disimpan.');
} }
/** /**
@@ -89,13 +99,57 @@
*/ */
public function update(NocRequest $request, PersetujuanPenawaran $persetujuanPenawaran) public function update(NocRequest $request, PersetujuanPenawaran $persetujuanPenawaran)
{ {
$validated = $request->validated(); $validated = $request->validated();
$validated['updated_by'] = Auth::id();
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'],
'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() return redirect()
->route('noc.index')->with('success', 'Persetujuan Penawaran updated successfully'); ->route('noc.index')->with('success', 'NOC updated successfully');
} }
/** /**
@@ -109,16 +163,18 @@
/** /**
* Display the specified resource. * 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. * Show the form for editing the specified resource.
*/ */
public function edit($id) public function edit($id)
{ {
$persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->with( $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->first();
['penawaran.detail', 'penawaran.permohonan.debiture', 'permohonan'],
)->first();
return view('lpj::noc.form', compact('persetujuanPenawaran')); return view('lpj::noc.form', compact('persetujuanPenawaran'));
} }
@@ -181,12 +237,28 @@
'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi, 'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi,
'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name, 'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name,
'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name, 'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name,
'tanggal_setor' => formatTanggalIndonesia($persetujuanPenawaran->created_at, true), 'tanggal_pembayaran' => dateFormat(
'nominal_bayar' => format_currency($persetujuanPenawaran->nominal_bayar ?? 0), $persetujuanPenawaran->noc->tanggal_pembayaran ?? $persetujuanPenawaran->noc?->created_at,
'bukti_ksl' => $persetujuanPenawaran->bukti_ksl ?? null, true,
'tanggal_penyelesaian' => formatTanggalIndonesia($persetujuanPenawaran->updated_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 // Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size')); $pageCount = ceil($totalRecords / $request->get('size'));

View File

@@ -152,6 +152,11 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId'); $jaminanId = $request->query('jaminanId');
$permohonan = $this->surveyorController->getPermohonanJaminanId($id, $documentId, $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(); $basicData = $this->surveyorController->getCommonData();
$noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj'); $noLpSederhana = $this->generateNoLaporan($permohonan, $documentId, 'lpj');
@@ -218,6 +223,11 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId'); $jaminanId = $request->query('jaminanId');
$permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $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'); $nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'resume');
$inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first(); $inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
$noLpresume = $this->generateNoLaporan($permohonan, $documentId, 'resume'); $noLpresume = $this->generateNoLaporan($permohonan, $documentId, 'resume');
@@ -253,6 +263,9 @@ class PenilaiController extends Controller
$data = $this->getDataPermohonanWithPenilaiAndInspeksi($req['permohonanId'], $req['documentId'], $req['jaminanId']); $data = $this->getDataPermohonanWithPenilaiAndInspeksi($req['permohonanId'], $req['documentId'], $req['jaminanId']);
$permohonan = $data['permohonan']; $permohonan = $data['permohonan'];
if ($permohonan->status == 'proses-laporan') {
return redirect()->back()->with('error', 'Masih dalam proses laporan');
}
$nomorLaporan = $this->generateNoLaporan($permohonan, $req['documentId'], 'memo'); $nomorLaporan = $this->generateNoLaporan($permohonan, $req['documentId'], 'memo');
$inspeksi = Inspeksi::where('permohonan_id', $req['permohonanId'])->where('dokument_id', $req['documentId'])->first(); $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'); $jaminanId = $request->query('jaminanId');
$provinces = Province::all(); $provinces = Province::all();
$permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $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, 'rap'); $nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'rap');
$basicData = $this->surveyorController->getCommonData(); $basicData = $this->surveyorController->getCommonData();
$inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first(); $inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
@@ -470,6 +488,9 @@ class PenilaiController extends Controller
$jaminanId = $request->query('jaminanId'); $jaminanId = $request->query('jaminanId');
$provinces = Province::all(); $provinces = Province::all();
$permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $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, 'call-report'); $nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'call-report');
$basicData = $this->surveyorController->getCommonData(); $basicData = $this->surveyorController->getCommonData();
$inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first(); $inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
@@ -1056,14 +1077,14 @@ class PenilaiController extends Controller
$data = []; $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) { foreach ($kategoriUnik as $kategori) {
// Dynamically generate keys // Dynamically generate keys
$luasKey = 'luas_' . $kategori; $luasKey = 'luas_' . $kategori;
$nilaiKey1 = 'nilai_' . $kategori . '_1'; $nilaiKey1 = 'nilai_' . $kategori . '_1';
$nilaiKey2 = 'nilai_' . $kategori . '_2'; $nilaiKey2 = 'nilai_' . $kategori . '_2';
// Collect data if exists // Collect data if exists
if ($request->has($luasKey)) { if ($request->has($luasKey)) {
$data[$luasKey] = $request->input($luasKey); $data[$luasKey] = $request->input($luasKey);
@@ -1075,7 +1096,7 @@ class PenilaiController extends Controller
$data[$nilaiKey2] = $request->input($nilaiKey2); $data[$nilaiKey2] = $request->input($nilaiKey2);
} }
} }
$data['total_nilai_pasar_wajar'] = $request->input('total_nilai_pasar_wajar'); $data['total_nilai_pasar_wajar'] = $request->input('total_nilai_pasar_wajar');
$data['likuidasi'] = $request->input('likuidasi'); $data['likuidasi'] = $request->input('likuidasi');
$data['likuidasi_nilai_1'] = $request->input('likuidasi_nilai_1'); $data['likuidasi_nilai_1'] = $request->input('likuidasi_nilai_1');
@@ -1104,8 +1125,7 @@ class PenilaiController extends Controller
$penilai = Penilai::updateOrCreate( $penilai = Penilai::updateOrCreate(
[ [
'permohonan_id' => $request->permohonanId, 'permohonan_id' => $request->permohonanId,
'dokument_id' => $request->documentId, 'dokument_id' => $request->input('dokument_id'),
], ],
[ [
'lpj' => json_encode($data), 'lpj' => json_encode($data),
@@ -1132,20 +1152,9 @@ class PenilaiController extends Controller
{ {
DB::beginTransaction(); DB::beginTransaction();
try { 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(); $validatedData = $request->all();
$result = $this->surveyorController->store($formRequest); $result = $this->inspeksiService->storeInspeksi($validatedData, $request->input('type'), $request);
$data = [ $data = [
'kepada' => $request->input('kepada'), '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) protected function getRequestQueryId(Request $request)
{ {
return [ return [

View File

@@ -1,489 +1,518 @@
<?php <?php
namespace Modules\Lpj\Http\Controllers; namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Barryvdh\DomPDF\Facade\Pdf; use Exception;
use Exception; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel; use Illuminate\Support\Facades\Auth;
use Modules\Location\Models\City; use Illuminate\Support\Facades\DB;
use Modules\Location\Models\District; use Maatwebsite\Excel\Facades\Excel;
use Modules\Location\Models\Province; use Modules\Location\Models\City;
use Modules\Location\Models\Village; use Modules\Location\Models\District;
use Modules\Lpj\Models\PermohonanPembatalan; use Modules\Location\Models\Province;
use Modules\Lpj\Exports\PermohonanExport; use Modules\Location\Models\Village;
use Modules\Lpj\Http\Requests\PermohonanRequest; use Modules\Lpj\Exports\PermohonanExport;
use Modules\Lpj\Models\Branch; use Modules\Lpj\Http\Requests\PermohonanRequest;
use Modules\Lpj\Models\Debiture; use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\DokumenJaminan; use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\JenisFasilitasKredit; use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\NilaiPlafond; use Modules\Lpj\Models\JenisFasilitasKredit;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\NilaiPlafond;
use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\TujuanPenilaian; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Notifications\PermohonanNotif; use Modules\Lpj\Models\PermohonanPembatalan;
use Modules\Lpj\Services\PermohonanHistoryService; use Modules\Lpj\Models\StatusPermohonan;
use Illuminate\Support\Facades\Auth; use Modules\Lpj\Models\TujuanPenilaian;
use Illuminate\Http\JsonResponse; use Modules\Lpj\Services\PermohonanHistoryService;
use Illuminate\Support\Facades\DB;
use Modules\Lpj\Models\Penilaian;
use Modules\Usermanagement\Models\User;
class PermohonanController extends Controller class PermohonanController extends Controller
{
public $user;
protected $historyService;
public function __construct(PermohonanHistoryService $historyService)
{ {
$this->historyService = $historyService; public $user;
} protected $historyService;
public function index() public function __construct(PermohonanHistoryService $historyService)
{ {
return view('lpj::permohonan.index'); $this->historyService = $historyService;
}
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 create() public function index()
{ {
return view('lpj::permohonan.create'); return view('lpj::permohonan.index');
} }
public function createPermohonan($debitur) public function store(PermohonanRequest $request)
{ {
$branches = Branch::all(); $validate = $request->validated();
$debitur = Debiture::find($debitur); if ($validate) {
$tujuanPenilaian = TujuanPenilaian::all(); try {
$status = StatusPermohonan::all(); // Process file upload
$fasilitasKredit = JenisFasilitasKredit::all(); $filePath = null;
$plafond = NilaiPlafond::all(); if ($request->hasFile('attachment')) {
$file = $request->file('attachment');
$fileName = time() . '_' . $file->getClientOriginalName();
$filePath = $file->storeAs('permohonan_attachments', $fileName, 'public');
}
return view( // Get keterangan if provided
'lpj::permohonan.form', $keterangan = $request->input('keterangan') ?? null;
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(); // Save to database
$plafond = NilaiPlafond::all(); $permohonan = Permohonan::create($validate);
return view( // Create history
'lpj::permohonan.form', $this->historyService->createHistory(
compact( $permohonan,
'permohonan', $validate['status'],
'branches', $keterangan,
'debitur', [], // beforeRequest is empty for new permohonan
'tujuanPenilaian', $permohonan->toArray(),
'status', $filePath,
'provinces', );
'cities',
'districts',
'villages',
'documents',
'fasilitasKredit',
'plafond',
),
);
}
public function update(PermohonanRequest $request, $id) $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get();
{ if (count($documents) < 1) {
$permohonan = Permohonan::findOrFail($id); return redirect()->route(
$beforeRequest = $permohonan->toArray(); 'debitur.jaminan.create',
array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]),
$validate = $request->validated(); )->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu');
if ($validate) { }
try { return redirect()
// Update in database ->route('permohonan.index')->with('success', 'Permohonan created successfully');
} catch (Exception $e) {
if ($permohonan->status == 'revisi') { return redirect()
$validate['status'] = 'order'; ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage());
} }
$permohonan->update($validate); } else {
$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() return redirect()
->route('permohonan.index')->with('success', 'Permohonan updated successfully'); ->route('permohonan.create')->with('success', 'error naon iye')->withInput();
} catch (Exception $e) {
return redirect()
->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan');
} }
} }
}
public function destroy($id) public function create()
{ {
try { return view('lpj::permohonan.create');
// Delete from database }
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 = Permohonan::find($id);
$permohonan->delete(); return view('lpj::permohonan.authorization.show', compact('permohonan'));
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 public function updateAuthorization(Request $request, $id)
$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()) {
try { try {
$penilaian = Penilaian::findOrFail($id); $permohonan = Permohonan::find($id);
$penilaian->update([ $permohonan->status = $request->status;
'authorized_status' => 1, $permohonan->keterangan = $request->keterangan;
]); $permohonan->save();
} catch (Exception $e) {
$permohonan = Permohonan::findOrFail($request->permohonan_id); return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan');
$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 { return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully');
$data['status'] = 'error';
$data['message'] = "no ajax request";
} }
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) public function print($id)
{ {
try { $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([ $validatedData = $request->validate([
'permohonan_id' => 'required|exists:permohonan,id', 'permohonan_id' => 'required|exists:permohonan,id',
'penilaian_id' => 'nullable', 'alasan_pembatalan' => 'required|string',
'nomor_registrasi' => 'required', 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048',
'reschedule_note' => 'required',
'reschedule_date' => 'required',
'keterangan' => 'required'
]); ]);
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); // Add created_by
$permohonan->update([ $validatedData['created_by'] = auth()->id();
'status' => 'request-reschedule'
]);
$penilaian = Penilaian::findOrFail($id); // Create new PermohonanPembatalan
$pembatalan = PermohonanPembatalan::create($validatedData);
$penilaian->update([ return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval');
'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(),
]);
} }
}
} 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(),
]);
}
}
}

View File

@@ -6,6 +6,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest; use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest;
use Modules\Lpj\Models\Noc;
use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Models\PenawaranDetailTender;
use Modules\Lpj\Models\PenawaranDetailTenderLog; use Modules\Lpj\Models\PenawaranDetailTenderLog;
use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\PenawaranTender;
@@ -67,6 +68,22 @@
$persetujuanPenawaran->save(); $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() return redirect()
->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.'); ->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.');
} }

View File

@@ -1556,11 +1556,11 @@ class SurveyorController extends Controller
{ {
$validated = $request->validate([ $validated = $request->validate([
'dokument' => 'required', 'documentId' => 'required',
'jenis_jaminan' => 'required' 'jenis_jaminan' => 'required'
]); ]);
$dokumentId = $validated['dokument']; $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan']; $jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
@@ -1644,11 +1644,11 @@ class SurveyorController extends Controller
public function denah(Request $request, $id) public function denah(Request $request, $id)
{ {
$validated = $request->validate([ $validated = $request->validate([
'dokument' => 'required', 'documentId' => 'required',
'jenis_jaminan' => 'required' 'jenis_jaminan' => 'required'
]); ]);
$dokumentId = $validated['dokument']; $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan']; $jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);
@@ -1672,11 +1672,11 @@ class SurveyorController extends Controller
public function foto(Request $request, $id) public function foto(Request $request, $id)
{ {
$validated = $request->validate([ $validated = $request->validate([
'dokument' => 'required', 'documentId' => 'required',
'jenis_jaminan' => 'required' 'jenis_jaminan' => 'required'
]); ]);
$dokumentId = $validated['dokument']; $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan']; $jaminanId = $validated['jenis_jaminan'];
$fotoObjekJaminan = FotoObjekJaminan::all(); $fotoObjekJaminan = FotoObjekJaminan::all();
@@ -1707,11 +1707,11 @@ class SurveyorController extends Controller
// Ambil data permohonan dengan eager loading // Ambil data permohonan dengan eager loading
$validated = $request->validate([ $validated = $request->validate([
'dokument' => 'required', 'documentId' => 'required',
'jenis_jaminan' => 'required' 'jenis_jaminan' => 'required'
]); ]);
$dokumentId = $validated['dokument']; $dokumentId = $validated['documentId'];
$jaminanId = $validated['jenis_jaminan']; $jaminanId = $validated['jenis_jaminan'];
$permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId); $permohonan = $this->getPermohonanJaminanId($id, $dokumentId, $jaminanId);

View File

@@ -4,20 +4,150 @@
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
/**
* Form Request untuk validasi data NOC (Notice of Completion)
*/
class NocRequest extends FormRequest 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() public function authorize()
{ {
return true; return true;
} }
/**
* Mengumpulkan semua aturan validasi
*
* @return array
*/
public function rules() 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 [ return [
'penawaran_id' => 'nullable|exists:penawaran,id', 'permohonan_id' => 'required|exists:permohonan,id',
'nominal_bayar' => 'nullable|numeric|min:0', 'persetujuan_penawaran_id' => 'required|exists:persetujuan_penawaran,id',
'bukti_ksl' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240', 'status' => 'nullable|boolean',
'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',
]; ];
} }
} }

View File

@@ -23,8 +23,6 @@
'sla_final' => 'nullable|numeric|min:0', 'sla_final' => 'nullable|numeric|min:0',
'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240', 'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240',
'surat_representasi' => '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', 'status' => 'nullable|boolean',
'authorized_status' => 'boolean', 'authorized_status' => 'boolean',
'authorized_at' => 'nullable|date', 'authorized_at' => 'nullable|date',
@@ -52,9 +50,6 @@
'surat_representasi.file' => 'Surat Representasi harus berupa file.', 'surat_representasi.file' => 'Surat Representasi harus berupa file.',
'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.', 'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.',
'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.', '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.required' => 'Region ID wajib diisi.',
'region_id.exists' => 'Region ID tidak valid.', 'region_id.exists' => 'Region ID tidak valid.',
'status.required' => 'Status wajib diisi.', 'status.required' => 'Status wajib diisi.',
@@ -62,8 +57,6 @@
'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.', 'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.',
'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.', 'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.',
'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak 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".',
]; ];
} }
} }

62
app/Models/Noc.php Normal file
View File

@@ -0,0 +1,62 @@
<?php
namespace Modules\Lpj\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
// use Modules\Lpj\Database\Factories\NocFactory;
class Noc extends Base
{
protected $table = 'noc';
protected $fillable = [
'permohonan_id',
'persetujuan_penawaran_id',
'bukti_bayar',
'nominal_bayar',
'status_bayar',
'tanggal_pembayaran',
'nominal_penyelesaian',
'status_penyelesaiaan',
'tanggal_penyelesaian',
'bukti_penyelesaian',
'bukti_ksl',
'memo_penyelesaian',
'catatan_noc',
'status',
'authorized_status',
'authorized_at',
'authorized_by',
];
protected $casts = [
'nominal_bayar' => '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');
}
}

View File

@@ -259,4 +259,10 @@
return $this->belongsTo(Inspeksi::class, 'permohonan_id'); return $this->belongsTo(Inspeksi::class, 'permohonan_id');
} }
// Add this relationship
public function noc()
{
return $this->hasOne(Noc::class, 'permohonan_id');
}
} }

View File

@@ -25,7 +25,6 @@
'authorized_status', 'authorized_status',
'authorized_at', 'authorized_at',
'authorized_by', 'authorized_by',
'status',
'catatan', 'catatan',
]; ];
@@ -58,4 +57,10 @@
{ {
return $this->belongsTo(User::class, 'authorized_by'); return $this->belongsTo(User::class, 'authorized_by');
} }
// Relationship with Noc
public function noc()
{
return $this->hasOne(Noc::class, 'persetujuan_penawaran_id');
}
} }

View File

@@ -122,7 +122,7 @@ class SaveFormInspesksiService
} }
if ($hasFactaData) { if ($hasFactaData) {
$rules = array_merge($rules, $this->getFactData($data, $request)); $rules = array_merge($rules, $this->getFactData($data, $request, $inspeksi));
} }
return $rules; return $rules;

View File

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

View File

@@ -36,7 +36,7 @@
Informasi dan pembanding Informasi dan pembanding
</h3> </h3>
<div class="card-tools"> <div class="card-tools">
<a href="{{ route('penilai.showDataPembanding', ['id' => $permohonan->id]) }}?dokument={{ request()->documentId }}&jenis_jaminan={{ request()->jaminanId }}" <a href="{{ route('penilai.showDataPembanding', ['id' => $permohonan->id]) }}?documentId={{ request()->documentId }}&jenis_jaminan={{ request()->jaminanId }}"
class="btn btn-primary" data-bs-toggle="modal"> class="btn btn-primary" data-bs-toggle="modal">
Edit Data Pembanding Edit Data Pembanding
</a> </a>
@@ -553,7 +553,7 @@
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const permohonanId = {{ $permohonan->id }}; const permohonanId = {{ $permohonan->id }};
const documentId = urlParams.get('documentId'); const documentId = urlParams.get('dokument');
const inspeksiId = urlParams.get('inspeksiId'); const inspeksiId = urlParams.get('inspeksiId');
const requestUrl = const requestUrl =

View File

@@ -237,8 +237,17 @@
const type = data.penilai?.type || ''; const type = data.penilai?.type || '';
let laporanButton = ''; let laporanButton = '';
let resumeButton = ''; let resumeButton = '';
let penyelesaian = '';
if(data.noc) {
if (!data.noc?.tanggal_penyelesaian && !data.noc?.memo_penyelesaian) {
penyelesaian = `
<a href="{{ route('noc.penyelesaian') }}?id=${data.noc.id}&permohonanId=${data.noc.permohonan_id}&persetujuanPenawaranId=${data.noc.persetujuan_penawaran_id}" class="btn btn-sm btn-warning">
Penyelesaian
</a>`;
}
}
if(data.penilai.resume) { if(data.penilai.resume) {
resumeButton = ` resumeButton = `
@@ -270,7 +279,7 @@
} }
return `<div class="flex flex-wrap justify-end gap-1.5"> ${resumeButton} ${laporanButton} </div>`; return `<div class="flex flex-wrap justify-end gap-1.5"> ${penyelesaian} ${resumeButton} ${laporanButton} </div>`;
}, },
} }
}, },

View File

@@ -219,10 +219,19 @@
</th> </th>
</tr> </tr>
</thead> </thead>
<tbody data-datatable-body="true">
</tbody>
</table> </table>
</div> </div>
<div class="card-footer justify-center md:justify-between flex-col md:flex-row gap-3 text-gray-600 text-2sm font-medium">
<div class="flex items-center gap-2">
Show
<select class="select select-sm w-16" data-datatable-size="true" name="perpage"> </select> per page
</div>
<div class="flex items-center gap-4">
<span data-datatable-info="true"> </span>
<div class="pagination" data-datatable-pagination="true">
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -437,6 +446,7 @@
// Update export URL with filters // Update export URL with filters
function updateExportUrl() { function updateExportUrl() {
dataTable.goPage(1);
let url = new URL(exportBtn.href); let url = new URL(exportBtn.href);
if (startDateInput.value) { if (startDateInput.value) {

View File

@@ -4,21 +4,35 @@
{{ Breadcrumbs::render(request()->route()->getName()) }} {{ Breadcrumbs::render(request()->route()->getName()) }}
@endsection @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') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card border border-agi-100 pb-2.5"> <div class="card border border-agi-100 pb-2.5">
<div class="card-header bg-agi-50" id="basic_settings"> <div class="card-header bg-agi-50" id="basic_settings">
<div class="card-title flex flex-row gap-1.5"> <div class="card-title flex flex-row gap-1.5">
NOC {{ $hasMemo ? 'Proses Penyelesaian NOC' : 'NOC' }}
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<a href="{{ route('noc.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a> <a href="{{ route('noc.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a>
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<form action="{{ route('noc.store') }}" method="POST" class="grid gap-5" enctype="multipart/form-data"> <form action="{{ !$hasMemo ? route('noc.store') : route('noc.update',$persetujuanPenawaran) }}" method="POST" class="grid gap-5" enctype="multipart/form-data">
@csrf @csrf
@if($hasMemo)
@method('PUT')
@endif
<input type="hidden" name="penawaran_id" value="{{ $persetujuanPenawaran->penawaran_id ?? old('penawaran_id') }}"> <input type="hidden" name="penawaran_id" value="{{ $persetujuanPenawaran->penawaran_id ?? old('penawaran_id') }}">
<input type="hidden" name="persetujuan_penawaran_id" value="{{ $persetujuanPenawaran->id ?? old('persetujuan_penawaran_id') }}">
<input type="hidden" name="permohonan_id" value="{{ $persetujuanPenawaran->penawaran->permohonan->id ?? $persetujuanPenawaran->permohonan->id }}"> <input type="hidden" name="permohonan_id" value="{{ $persetujuanPenawaran->penawaran->permohonan->id ?? $persetujuanPenawaran->permohonan->id }}">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@@ -26,10 +40,10 @@
Status Bayar Status Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status_bayar') border-danger bg-danger-light @enderror" name="status_bayar" id="status_bayar"> <select class="input tomselect w-full @error('status_pembayar') border-danger bg-danger-light @enderror" name="status_pembayar" id="status_pembayar" {{ $hasMemo ? 'disabled' : '' }}>
<option value="">Pilih Status Bayar</option> <option value="">Pilih Status Bayar</option>
<option value="sudah_bayar" {{ (old('status_bayar') == 'sudah_bayar') || (isset($persetujuanPenawaran->penawaran->permohonan) && $persetujuanPenawaran->penawaran->permohonan->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option> <option value="sudah_bayar" {{ (old('status_pembayar') == 'sudah_bayar') || ($persetujuanPenawaran?->penawaran?->permohonan?->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option>
<option value="belum_bayar" {{ (old('status_bayar') == 'belum_bayar') || (isset($persetujuanPenawaran->penawaran->permohonan) && $persetujuanPenawaran->penawaran->permohonan->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option> <option value="belum_bayar" {{ (old('status_pembayar') == 'belum_bayar') || ($persetujuanPenawaran?->penawaran?->permohonan?->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option>
</select> </select>
@error('status_bayar') @error('status_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@@ -39,13 +53,16 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Bukti KSL Bukti Pembayaran
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="file" name="bukti_ksl" id="bukti_ksl" class="file-input w-full @error('bukti_ksl') border-danger bg-danger-light @enderror" accept=".pdf,.doc,.docx"> @if(!empty($persetujuanPenawaran->bukti_bayar))
@error('bukti_ksl') <div class="mt-2 flex items-center">
<em class="alert text-danger text-sm">{{ $message }}</em> <a href="{{ Storage::url($persetujuanPenawaran->bukti_bayar) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
@enderror <i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
</div>
@endif
</div> </div>
</div> </div>
@@ -54,19 +71,127 @@
Nominal Bayar Nominal Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_bayar" id="nominal_bayar" class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror" value="{{ old('nominal_bayar', $persetujuanPenawaran->nominal_bayar ?? '') }}" placeholder="Masukkan nominal bayar"> <input type="number" name="total_harus_bayar" id="total_harus_bayar" class="input w-full @error('total_harus_bayar') border-danger bg-danger-light @enderror" value="{{ old('total_harus_bayar', $persetujuanPenawaran->nominal_bayar ?? '') }}" readonly>
@error('total_harus_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nominal Diterima
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_bayar" id="nominal_bayar" class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror" value="{{ old('nominal_bayar', $persetujuanPenawaran->noc->nominal_bayar ?? '') }}" placeholder="Masukkan nominal bayar" {{ $hasMemo ? 'readonly' : '' }}>
@error('nominal_bayar') @error('nominal_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tanggal Pembayaran
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="date" name="tanggal_pembayaran" id="tanggal_pembayaran" class="input w-full @error('tanggal_pembayaran') border-danger bg-danger-light @enderror" value="{{ old('tanggal_pembayaran', isset($persetujuanPenawaran->noc->tanggal_pembayaran) ? date('Y-m-d', strtotime($persetujuanPenawaran->noc->tanggal_pembayaran)) : '') }}" {{ $hasMemo ? 'readonly' : '' }}>
@error('tanggal_pembayaran')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Bukti KSL
</label>
<div class="flex flex-wrap items-baseline w-full">
@if(!$hasMemo)
<input type="file" name="bukti_ksl" id="bukti_ksl" class="file-input w-full @error('bukti_ksl') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png">
@error('bukti_ksl')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
@endif
@if(isset($persetujuanPenawaran->noc->bukti_ksl) && !empty($persetujuanPenawaran->noc->bukti_ksl))
<div class="mt-2 flex items-center">
<a href="{{ Storage::url($persetujuanPenawaran->noc->bukti_ksl) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
</div>
@endif
</div>
</div>
@if($hasMemo)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Memo Penyelesaian
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="flex items-center">
<a href="{{ Storage::url($persetujuanPenawaran->noc->memo_penyelesaian) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
<input type="hidden" name="memo_penyelesaian_existing" value="{{ $persetujuanPenawaran->noc->memo_penyelesaian }}">
</div>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Bukti Penyelesaian
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="file" name="bukti_penyelesaian" id="bukti_penyelesaian" class="file-input w-full @error('bukti_penyelesaian') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png">
@error('bukti_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
@if(isset($persetujuanPenawaran->noc->bukti_penyelesaian) && !empty($persetujuanPenawaran->noc->bukti_penyelesaian))
<div class="mt-2 flex items-center">
<a href="{{ Storage::url($persetujuanPenawaran->noc->bukti_penyelesaian) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
<input type="hidden" name="bukti_penyelesaian_existing" value="{{ $persetujuanPenawaran->noc->bukti_penyelesaian }}">
</div>
@endif
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nominal Penyelesaian
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_penyelesaian" id="nominal_penyelesaian" class="input w-full @error('nominal_penyelesaian') border-danger bg-danger-light @enderror" value="{{ old('nominal_penyelesaian', $persetujuanPenawaran->noc->nominal_penyelesaian ?? '') }}" placeholder="Masukkan nominal penyelesaian">
@error('nominal_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tanggal Penyelesaian
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="date" name="tanggal_penyelesaian" id="tanggal_penyelesaian" class="input w-full @error('tanggal_penyelesaian') border-danger bg-danger-light @enderror" value="{{ old('tanggal_penyelesaian', isset($persetujuanPenawaran->noc->tanggal_penyelesaian) ? date('Y-m-d', strtotime($persetujuanPenawaran->noc->tanggal_penyelesaian)) : '') }}">
@error('tanggal_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
@endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Catatan Catatan
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan" id="catatan" rows="4" class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea> <textarea name="catatan" id="catatan" rows="4" class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" readonly placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea>
@error('catatan') @error('catatan')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
@@ -78,7 +203,7 @@
Catatan NOC Catatan NOC
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan_noc" id="catatan_noc" rows="4" class="textarea w-full @error('catatan_noc') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan noc">{{ old('catatan_noc', $persetujuanPenawaran->catatan_noc ?? '') }}</textarea> <textarea name="catatan_noc" id="catatan_noc" rows="4" class="textarea w-full @error('catatan_noc') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan noc">{{ old('catatan_noc', $persetujuanPenawaran->noc->catatan_noc ?? '') }}</textarea>
@error('catatan_noc') @error('catatan_noc')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror

View File

@@ -53,10 +53,34 @@
<span class="sort"> <span class="sort-label"> Nominal bayar </span> <span class="sort"> <span class="sort-label"> Nominal bayar </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="bukti_bayar">
<span class="sort"> <span class="sort-label"> Bukti Bayar </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nominal_diterima">
<span class="sort"> <span class="sort-label"> Nominal Diterima </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="bukti_ksl"> <th class="min-w-[150px]" data-datatable-column="bukti_ksl">
<span class="sort"> <span class="sort-label"> Bukti KSL </span> <span class="sort"> <span class="sort-label"> Bukti KSL </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_pembayaran">
<span class="sort"> <span class="sort-label"> Tanggal Pembayaran </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="memo_penyelesaian">
<span class="sort"> <span class="sort-label"> Memo Penyelesaian </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="bukti_penyelesaian">
<span class="sort"> <span class="sort-label"> Bukti Penyelesaian </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nominal_penyelesaian">
<span class="sort"> <span class="sort-label"> Nominal Penyelesaian </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_penyelesaian"> <th class="min-w-[150px]" data-datatable-column="tanggal_penyelesaian">
<span class="sort"> <span class="sort-label"> Tanggal Penyelesaian </span> <span class="sort"> <span class="sort-label"> Tanggal Penyelesaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
@@ -137,6 +161,21 @@
nominal_bayar: { nominal_bayar: {
title: 'Nominal Bayar', title: 'Nominal Bayar',
}, },
bukti_bayar: {
title: 'Bukti KSL',
render: (item, data) => {
if (data.bukti_bayar) {
return `<a href="storage/${data.bukti_bayar}" download="storage/${data.bukti_bayar}" target="_blank" class="badge badge-sm badge-outline">
Download <i class="ki-filled ki-cloud-download"></i>
</a>`;
} else {
return '-';
}
},
},
nominal_diterima: {
title: 'Nominal Diterima',
},
bukti_ksl: { bukti_ksl: {
title: 'Bukti KSL', title: 'Bukti KSL',
render: (item, data) => { render: (item, data) => {
@@ -149,6 +188,36 @@
} }
}, },
}, },
tanggal_pembayaran: {
title: 'Tanggal Pembayaran',
},
memo_penyelesaian: {
title: 'Memo Penyelesaian',
render: (item, data) => {
if (data.memo_penyelesaian) {
return `<a href="storage/${data.memo_penyelesaian}" download="storage/${data.memo_penyelesaian}" target="_blank" class="badge badge-sm badge-outline">
Download <i class="ki-filled ki-cloud-download"></i>
</a>`;
} else {
return '-';
}
},
},
bukti_penyelesaian: {
title: 'Bukti Penyelesaian',
render: (item, data) => {
if (data.bukti_penyelesaian) {
return `<a href="storage/${data.bukti_penyelesaian}" download="storage/${data.bukti_penyelesaian}" target="_blank" class="badge badge-sm badge-outline">
Download <i class="ki-filled ki-cloud-download"></i>
</a>`;
} else {
return '-';
}
},
},
nominal_penyelesaian: {
title: 'Nominal Penyelesaian',
},
tanggal_penyelesaian: { tanggal_penyelesaian: {
title: 'Tanggal Penyelesaian', title: 'Tanggal Penyelesaian',
}, },

View File

@@ -0,0 +1,163 @@
@extends('layouts.main')
@section('breadcrumbs')
{{ Breadcrumbs::render(request()->route()->getName()) }}
@endsection
@section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card border border-agi-100 pb-2.5">
<div class="card-header bg-agi-50" id="basic_settings">
<div class="card-title flex flex-row gap-1.5">
Memo Penyelesaian NOC
</div>
<div class="flex items-center gap-2">
<a href="{{ route('noc.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a>
</div>
</div>
<div class="card-body">
<form action="{{ route('noc.update',$noc) }}" method="POST" class="grid gap-5" enctype="multipart/form-data">
@csrf
@method('PUT')
<input type="hidden" name="persetujuan_penawaran_id" value="{{ $noc->persetujuan_penawaran_id }}">
<input type="hidden" name="permohonan_id" value="{{ $noc->permohonan_id }}">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Status Bayar
</label>
<div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status_pembayar') border-danger bg-danger-light @enderror" name="status_pembayar" id="status_pembayar" disabled>
<option value="">Pilih Status Bayar</option>
<option value="sudah_bayar" {{ (old('status_pembayar') == 'sudah_bayar') || ($noc?->permohonan?->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option>
<option value="belum_bayar" {{ (old('status_pembayar') == 'belum_bayar') || ($noc?->permohonan?->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option>
</select>
@error('status_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Bukti Pembayaran
</label>
<div class="flex flex-wrap items-baseline w-full">
@if(!empty($noc->persetujuanPenawaran->bukti_bayar))
<div class="mt-2 flex items-center">
<a href="{{ Storage::url($noc->persetujuanPenawaran->bukti_bayar) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
</div>
@endif
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nominal Bayar
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="number" name="total_harus_bayar" id="total_harus_bayar" class="input w-full @error('total_harus_bayar') border-danger bg-danger-light @enderror" value="{{ old('total_harus_bayar', $noc->nominal_bayar ?? '') }}" readonly>
@error('total_harus_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nominal Diterima
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_bayar" id="nominal_bayar" class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror" value="{{ old('nominal_bayar', $noc->nominal_bayar ?? '') }}" placeholder="Masukkan nominal bayar" readonly>
@error('nominal_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tanggal Pembayaran
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="date" name="tanggal_pembayaran" id="tanggal_pembayaran" class="input w-full @error('tanggal_pembayaran') border-danger bg-danger-light @enderror" value="{{ old('tanggal_pembayaran', isset($noc->tanggal_pembayaran) ? date('Y-m-d', strtotime($noc->tanggal_pembayaran)) : '') }}" readonly>
@error('tanggal_pembayaran')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Bukti KSL
</label>
<div class="flex flex-wrap items-baseline w-full">
@if(isset($noc->bukti_ksl) && !empty($noc->bukti_ksl))
<div class="mt-2 flex items-center">
<a href="{{ Storage::url($noc->bukti_ksl) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
</div>
@endif
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Memo Penyelesaian
</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="hidden" name="is_memo" value="{{ $noc->id }}">
<input type="file" name="memo_penyelesaian" id="memo_penyelesaian" class="file-input w-full @error('memo_penyelesaian') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png">
@error('memo_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
@if(isset($noc->memo_penyelesaian) && !empty($noc->memo_penyelesaian))
<div class="mt-2 flex items-center">
<a href="{{ Storage::url($noc->memo_penyelesaian) }}" target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="ki-filled ki-eye mr-2"></i> Lihat File
</a>
</div>
@endif
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Catatan
</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan" id="catatan" rows="4" class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" readonly placeholder="Masukkan catatan">{{ old('catatan', $noc->catatan ?? '') }}</textarea>
@error('catatan')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Catatan NOC
</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan_noc" id="catatan_noc" rows="4" class="textarea w-full @error('catatan_noc') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan noc">{{ old('catatan_noc', $noc->catatan_noc ?? '') }}</textarea>
@error('catatan_noc')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex justify-end">
<button type="submit" class="btn btn-primary">
Proses
</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View File

@@ -60,7 +60,7 @@
<i class="ki-filled ki-printer"></i> Cetak Hasil Inspeksi <i class="ki-filled ki-printer"></i> Cetak Hasil Inspeksi
</a> </a>
<a class="btn btn-success" <a class="btn btn-success"
onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', {{ request('jaminanId') }}, )"> onclick="checkLaporan('{{ $permohonan->id }}', '{{ request('documentId') }}', {{ request('jaminanId') }}, 0)">
<i class="ki-filled ki-printer"></i> Cetak Laporan <i class="ki-filled ki-printer"></i> Cetak Laporan
</a> </a>
@endif @endif

View File

@@ -19,7 +19,7 @@
@endphp @endphp
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Route::currentRouteName('otorisator.show')) Route::currentRouteName('otorisator.show'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => 'Pelaporan']) }}" <a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => request('header')]) }}"
class="btn btn-xs btn-info"> class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>

View File

@@ -18,7 +18,7 @@
<hr /> <hr />
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td style="vertical-align: top;"> <td style="width: 50%; vertical-align: top;">
<table style="width: 100%; border-collapse: collapse;"> <table style="width: 100%; border-collapse: collapse;">
<tr> <tr>
<td style=" padding: 2px; vertical-align: top;">Nama Debitur</td> <td style=" padding: 2px; vertical-align: top;">Nama Debitur</td>
@@ -60,7 +60,7 @@
<td style="padding: 2px; vertical-align: top;">Tanggal Survey</td> <td style="padding: 2px; vertical-align: top;">Tanggal Survey</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ formatTanggalIndonesia($permohonan->penilaian->updated_at) }}</td> {{ formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) }}</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">User</td> <td style="padding: 2px; vertical-align: top;">User</td>
@@ -118,11 +118,11 @@
<td style="padding: 2px; vertical-align: top;">Waktu Penyelesaian</td> <td style="padding: 2px; vertical-align: top;">Waktu Penyelesaian</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ hitungHariKerja($permohonan->penilaian->updated_at, $tanggalLaporan) }}</td> {{ hitungHariKerja($permohonan->penilaian->tanggal_kunjungan, $tanggalLaporan) }}</td>
</tr> </tr>
</table> </table>
</td> </td>
<td style="vertical-align: top"> <td style="width: 50%; vertical-align: top">
<table style="width: 100%; border-collapse: collapse;"> <table style="width: 100%; border-collapse: collapse;">
<tr> <tr>
<td style=" padding: 2px; vertical-align: top;">Fasilitas Kredit</td> <td style=" padding: 2px; vertical-align: top;">Fasilitas Kredit</td>
@@ -213,32 +213,31 @@
<table> <table>
<tr> <tr>
<td style="width: 50%; border: 1px solid #000;"> <td style="width: 50%; border: 1px solid #000;">
A. STATUS KEPEMILIKAN, HUBUNGAN DAN PENGHUNI STATUS KEPEMILIKAN, HUBUNGAN DAN PENGHUNI
</td> </td>
<td style="width: 50%; border: 1px solid #000;"> <td style="width: 50%; border: 1px solid #000;">
C. SARANA PELENGKAP DAN LINGKUNGAN SARANA PELENGKAP DAN LINGKUNGAN
</td> </td>
</tr> </tr>
<tr> <tr>
<td> <td style="vertical-align: top;">
<table> <table style="vertical-align: top;">
<tr> <tr>
@php @php
$cekHubDebitur = isset($forminspeksi['asset']['hub_cadeb']) &&
$forminspeksi['asset']['hub_cadeb'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$cekHub = $hubCadebDebitur = isset($forminspeksi['asset']['hub_cadeb'][$cekHubDebitur])
isset($forminspeksi['asset']['hub_cadeb']) && $forminspeksi['asset']['hub_cadeb'] === 'sesuai' ? $forminspeksi['asset']['hub_cadeb']['tidak sesuai']
? 'sesuai' : $forminspeksi['asset']['hub_cadeb']['sesuai'];
: 'tidak sesuai'; @endphp
<td style=" width:49%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitur</td>
$hubCadeb = $cekHub === 'sesuai' <td style=" width:1%; padding: 2px; vertical-align: top;">:</td>
? ($forminspeksi['asset']['hub_cadeb']['sesuai'] ?? null) <td style=" width:50%; padding: 2px; vertical-align: top;">{{ $hubCadebDebitur ?? '' }}</td>
: ($forminspeksi['asset']['hub_cadeb']['tidak sesuai'] ?? null);
@endphp
<td style=" padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitur</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td>
</tr> </tr>
<tr> <tr>
@php @php
@@ -258,328 +257,6 @@
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td> <td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td>
</tr> </tr>
</table> </table>
<table style="width: 100%; border: 1px solid #000; text-transform: uppercase;">
<tr>
<td>
B. ANALISA {{ $data }}
</td>
</tr>
</table>
@foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan)
@php
$formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true);
@endphp
@if (isset($formKategori) && $formKategori)
@php
$kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori];
$kategoriUnik = array_unique($kategoriArray);
@endphp
@foreach ($kategoriUnik as $kategori)
@if ($kategori === 'tanah')
<table>
<tr>
@php
$cekLuas = isset($forminspeksi['tanah']['luas_tanah']['tidak sesuai'])
? 'tidak sesuai'
: 'sesuai';
$luas = $forminspeksi['tanah']['luas_tanah'][$cekLuas] ?? null;
@endphp
<td style="padding: 2px; vertical-align: top;">Luas Tanah</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $luas ?? '' }} <span></span></td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Bentuk Tanah</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$bentukTanah = isset(
$forminspeksi['tanah']['bentuk_tanah']['bentuk_tanah'],
)
? $forminspeksi['tanah']['bentuk_tanah']['bentuk_tanah']
: [];
$lainnya = isset($forminspeksi['tanah']['bentuk_tanah']['lainnya'])
? $forminspeksi['tanah']['bentuk_tanah']['lainnya']
: null;
@endphp
{{ !empty($bentukTanah) ? implode(', ', $bentukTanah) : '' }}
@if (in_array('lainnya', array_map('strtolower', $bentukTanah)) && !empty($lainnya))
({{ $lainnya }})
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Kontur Tanah</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$konturTanah = $forminspeksi['tanah']['kontur_tanah'] ?? [];
@endphp
@if (!empty($konturTanah))
{{ implode(', ', $konturTanah) }}
@else
-
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Permukaan dengan Jalan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$ketinggianTanah = $forminspeksi['tanah']['ketinggian_tanah'];
$ketinggian = $ketinggianTanah['ketinggian'][0] ?? '-';
$lebihTinggi = $ketinggianTanah['lebih_tinggi'];
$lebihRendah = $ketinggianTanah['lebih_rendah'];
@endphp
{{ $ketinggian }}
@if ($ketinggian === 'Lebih Tinggi' && $lebihTinggi !== null)
(Ketinggian: {{ $lebihTinggi }} cm)
@elseif($ketinggian === 'Lebih Rendah' && $lebihRendah !== null)
(Kerendahan: {{ $lebihRendah }} cm)
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Peruntukan Tanah</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">Perumahan bukan Real Estate
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Fisik Tanah</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$kondisiFisikTanah =
$forminspeksi['tanah']['kondisi_fisik_tanah'][
'kondisi_fisik_tanah'
][0] ?? '-';
$lainnya =
$forminspeksi['tanah']['kondisi_fisik_tanah']['lainnya'] ??
null;
@endphp
{{ $kondisiFisikTanah }}
@if (strcasecmp($kondisiFisikTanah, 'Lainnya') === 0 && $lainnya)
({{ $lainnya }})
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Luas Bangunan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$luasTanahBangunan =
$forminspeksi['bangunan']['luas_tanah_bagunan'];
$output = !empty($luasTanahBangunan['sesuai'])
? $luasTanahBangunan['sesuai']
: (!empty($luasTanahBangunan['tidak sesuai'])
? $luasTanahBangunan['tidak sesuai']
: '-');
@endphp
{{ $output }} <span></span>
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Jenis Bangunan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$jenisBangunan = $forminspeksi['bangunan']['jenis_bangunan'] ?? [];
@endphp
@if (!empty($jenisBangunan))
{{ implode(', ', $jenisBangunan) }}
@else
-
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Kondisi Bangunan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$kondisiBangunan =
$forminspeksi['bangunan']['kondisi_bangunan'] ?? [];
@endphp
@if (!empty($kondisiBangunan))
{{ implode(', ', $kondisiBangunan) }}
@else
-
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Sifat Bangunan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$sifatBangunan =
$forminspeksi['bangunan']['sifat_bangunan'][0] ?? '-';
$sifatBangunanInput =
$forminspeksi['bangunan']['sifat_bangunan_input'];
// Filter input yang tidak null
$inputTambahan = array_filter($sifatBangunanInput, function (
$value,
) {
return $value !== null && $value !== '';
});
// Gabungkan sifat bangunan dengan input tambahan
$output = $sifatBangunan;
if (!empty($inputTambahan)) {
$output .= ' (' . implode(', ', $inputTambahan) . ')';
}
@endphp
{{ $output }}
</td>
</tr>
@php
$spesifikasiBangunan =
$forminspeksi['bangunan']['spesifikasi_bangunan'] ?? [];
@endphp
@if (!empty($spesifikasiBangunan))
@foreach ($spesifikasiBangunan as $index => $bangunan)
@php
$spekKategori = $bangunan['spek_kategori_bangunan'] ?? [];
@endphp
@if (count($spesifikasiBangunan) > 1)
<tr>
<td colspan="3"
style="padding: 2px; vertical-align: top; font-weight: bold;">
{{ $bangunan['bagunan'] ?? 'Bangunan ' . ($index + 1) }}
</td>
</tr>
@endif
@foreach ($spekKategori as $kategori => $nilaiKategori)
@if (!empty($nilaiKategori))
<tr>
<td style="padding: 2px; vertical-align: top;">
{{ $kategori }}</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $nilaiKategori) }}</td>
</tr>
@endif
@endforeach
@endforeach
@else
<tr>
<td colspan="3" style="padding: 2px; vertical-align: top;">Tidak
ada data
spesifikasi bangunan</td>
</tr>
@endif
</table>
@elseif ($kategori === 'apartemen-kantor')
<table>
<tr>
@php
$cekLuas = isset($forminspeksi['luas_unit']['tidak sesuai'])
? 'tidak sesuai'
: 'sesuai';
$luas = $forminspeksi['luas_unit'][$cekLuas] ?? null;
@endphp
<td style="padding: 2px; vertical-align: top;">Luas Unit</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $luas ?? '' }} m<sup>2</sup> </td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Bentuk Unit</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$bentukUnit = $forminspeksi['bentuk_unit'] ?? [];
@endphp
@if (!empty($bentukUnit))
{{ implode(', ', $bentukUnit) }}
@else
-
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Kondisi Unit</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$bentukUnit = $forminspeksi['kondisi_unit'] ?? [];
@endphp
@if (!empty($bentukUnit))
{{ implode(', ', $bentukUnit) }}
@else
-
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Posisi Unit</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$bentukUnit = $forminspeksi['posisi_unit'] ?? [];
@endphp
@if (!empty($bentukUnit))
{{ implode(', ', $bentukUnit) }}
@else
-
@endif
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">View Unit</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@php
$bentukUnit = $forminspeksi['view'] ?? [];
@endphp
@if (!empty($bentukUnit))
{{ implode(', ', $bentukUnit) }}
@else
-
@endif
</td>
</tr>
</table>
@endif
@endforeach
@endif
@endif
@endforeach
</td> </td>
<td style="width: 50%; vertical-align: top;"> <td style="width: 50%; vertical-align: top;">
@@ -721,11 +398,36 @@
</tr> </tr>
</table> </table>
</div> </div>
@foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan)
@php
$formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true);
@endphp
@if (isset($formKategori) && $formKategori)
@php
$kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori];
$kategoriUnik = array_unique($kategoriArray);
@endphp
@foreach ($kategoriUnik as $kategori)
@if ($kategori !== 'lingkungan')
@include('lpj::penilai.components.analisa.' . str_replace('-', '-', $kategori), [
'dokumen' => $dokumen,
])
@endif
@endforeach
@endif
@endif
@endforeach
<div class="no-break"> <div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td style=" border: 1px solid #000;"> <td style=" border: 1px solid #000; text-align: center;">
D. INFORMASI HARGA INFORMASI HARGA
</td> </td>
</tr> </tr>
</table> </table>
@@ -734,7 +436,7 @@
<div class="no-break"> <div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td style="border: 1px solid #000; "> <strong>E. INFORMASI NILAI</strong> <td style="border: 1px solid #000; text-align: center;"> INFORMASI NILAI
</td> </td>
</tr> </tr>
</table> </table>

View File

@@ -106,8 +106,13 @@
<tr> <tr>
<td style="width: 25%; padding: 2px; vertical-align: top;">Debitur / Wakil Debitur</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Debitur / Wakil Debitur</td>
<td style="width: 1%; vertical-align: top;">:</td> <td style="width: 1%; vertical-align: top;">:</td>
<td>{{ $forminspeksi['asset']['debitur_perwakilan'] ??$permohonan->debiture->name ?? '' }} @if (isset($forminspeksi['asset']['debitur_perwakilan']))
</td> <td>
@foreach ($forminspeksi['asset']['debitur_perwakilan'] as $item)
{{ $item ?? $permohonan->debiture->name ?? '' }}<br>
@endforeach
</td>
@endif
</tr> </tr>
<tr> <tr>
<td style="width: 25%; padding: 2px; vertical-align: top;">Pihak Bank selain Appraisal</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Pihak Bank selain Appraisal</td>
@@ -200,20 +205,18 @@
<table style="width:100%"> <table style="width:100%">
<tr> <tr>
@php @php
$cekHubDebitur = isset($forminspeksi['asset']['hub_cadeb']) &&
$forminspeksi['asset']['hub_cadeb'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$cekHub = $hubCadebDebitur = isset($forminspeksi['asset']['hub_cadeb'][$cekHubDebitur])
isset($forminspeksi['asset']['hub_cadeb']) && $forminspeksi['asset']['hub_cadeb'] === 'sesuai' ? $forminspeksi['asset']['hub_cadeb']['tidak sesuai']
? 'sesuai' : $forminspeksi['asset']['hub_cadeb']['sesuai'];
: 'tidak sesuai'; @endphp
$hubCadeb = $cekHub === 'sesuai'
? ($forminspeksi['asset']['hub_cadeb']['sesuai'] ?? null)
: ($forminspeksi['asset']['hub_cadeb']['tidak sesuai'] ?? null);
@endphp
<td style="width:25%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitur</td> <td style="width:25%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitur</td>
<td style="width:1%; padding: 2px; vertical-align: top;">:</td> <td style="width:1%; padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td> <td style=" padding: 2px; vertical-align: top;">{{ $cekHubDebitur ?? '' }}</td>
</tr> </tr>
<tr> <tr>
@php @php

View File

@@ -14,14 +14,13 @@
<input type="hidden" name="action" value="rap"> <input type="hidden" name="action" value="rap">
<input type="hidden" name="type" value="rap"> <input type="hidden" name="type" value="rap">
@include('lpj::assetsku.includenya') @include('lpj::assetsku.includenya')
@include('lpj::surveyor.components.header')
@include('lpj::surveyor.components.rap')
<div class="card"> <div class="card">
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
<h3 class="card-title uppercase"> <h3 class="card-title uppercase">
RAP RAP
</h3> </h3>
</div> </div>
<div class="card-body grid gap-5"> <div class="card-body grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@@ -64,24 +63,27 @@
</div> </div>
</div> </div>
</div> </div>
@include('lpj::surveyor.components.header')
@include('lpj::surveyor.components.rap')
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px"> <div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
<button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()" {{ $permohonan->status == 'proses-paparan' || $permohonan->status == 'proses-laporan' && Auth::user()->hasAnyRole(['surveyor']) ? 'disabled' : '' }}> <button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()"
<i class="ki-filled ki-save-2"></i> {{ $permohonan->status == 'proses-paparan' || ($permohonan->status == 'proses-laporan' && Auth::user()->hasAnyRole(['surveyor'])) ? 'disabled' : '' }}>
<span id="saveButtonText" >Save</span> <i class="ki-filled ki-save-2"></i>
<div class="spinner-border spinner-border-sm text-light" role="status" style="display: none;" <span id="saveButtonText">Save</span>
id="saveButtonSpinner"> <div class="spinner-border spinner-border-sm text-light" role="status" style="display: none;"
id="saveButtonSpinner">
</div> </div>
</button> </button>
@endif @endif
@if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'EO Appraisal', 'DD Appraisal', 'administrator']))
<a class="btn btn-info" <a class="btn btn-info"
href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1"> href="{{ route('penilai.lampiran') }}?permohonanId={{ request('permohonanId') }}&documentId={{ request('documentId') }}&jaminanId={{ request('jaminanId') }}&statusLpj=1">
Lampiran Foto dan Dokumen Lampiran Foto dan Dokumen
</a> </a>
<a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jaminanId')]) }}" class="btn btn-light" <a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jaminanId')]) }}"
> class="btn btn-light">
<i class="ki-filled ki-printer"></i> Cetak Hasil Inspeksi <i class="ki-filled ki-printer"></i> Cetak Hasil Inspeksi
</a> </a>
<a class="btn btn-success" <a class="btn btn-success"

View File

@@ -57,7 +57,7 @@
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Route::currentRouteName('otorisator.show')) Route::currentRouteName('otorisator.show'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => $paparan]) }}" <a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => request('header')]) }}"
class="btn btn-xs btn-info"> class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>

View File

@@ -159,7 +159,7 @@
@if ($dataHeader == 'pelaporan') @if ($dataHeader == 'pelaporan')
<a class="btn btn-success" <a class="btn btn-success"
href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}"> href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}&header={{ $header ?? '' }}">
Lihat Laporan Lihat Laporan
</a> </a>
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $permohonan->approval_so == 0) @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $permohonan->approval_so == 0)
@@ -203,7 +203,7 @@
<a class="btn btn-success" <a class="btn btn-success"
href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}"> href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}&header={{ $header ?? '' }}">
Lihat resume Lihat resume
</a> </a>

View File

@@ -161,7 +161,7 @@
@if ($dataHeader == 'pelaporan') @if ($dataHeader == 'pelaporan')
<a class="btn btn-success" <a class="btn btn-success"
href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&inspeksiId={{ $inspeksiId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}"> href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&inspeksiId={{ $inspeksiId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}&header={{ $header }}">
Lihat Laporan Lihat Laporan
</a> </a>
@endif @endif

View File

@@ -49,11 +49,11 @@
<span class="sort"> <span class="sort-label"> Tanggal Permohonan </span> <span class="sort"> <span class="sort-label"> Tanggal Permohonan </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="user_id"> <th class="min-w-[150px]" data-datatable-column="pemohon">
<span class="sort"> <span class="sort-label"> User Pemohon </span> <span class="sort"> <span class="sort-label"> User Pemohon </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="branch_id"> <th class="min-w-[150px]" data-datatable-column="branch">
<span class="sort"> <span class="sort-label"> Cabang Pemohon </span> <span class="sort"> <span class="sort-label"> Cabang Pemohon </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
@@ -201,8 +201,7 @@
status: { status: {
title: 'Status', title: 'Status',
render: (item, data) => { render: (item, data) => {
console.log(data.documents.length); if (data.documents > 0) {
if (data.documents.length > 0) {
return `<span class="badge badge-sm badge-default uppercase flex justify-center">${data.status}</span>`; return `<span class="badge badge-sm badge-default uppercase flex justify-center">${data.status}</span>`;
} }
return `<span class="badge badge-sm badge-danger uppercase flex justify-center">Lengkapi Aset Jaminan</span>`; return `<span class="badge badge-sm badge-danger uppercase flex justify-center">Lengkapi Aset Jaminan</span>`;

View File

@@ -14,7 +14,7 @@
'url' => 'url' =>
route('surveyor.inspeksi', [ route('surveyor.inspeksi', [
'id' => $permohonan->id, 'id' => $permohonan->id,
]) . "?dokument={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}", ]) . "?documentId={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}",
'show' => true, 'show' => true,
'icon' => !empty($currentInspeksi['data_form']), 'icon' => !empty($currentInspeksi['data_form']),
], ],
@@ -27,7 +27,7 @@
'url' => 'url' =>
route('surveyor.denah', [ route('surveyor.denah', [
'id' => $permohonan->id, 'id' => $permohonan->id,
]) . "?dokument={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}", ]) . "?documentId={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}",
'show' => true, 'show' => true,
'icon' => !empty($currentInspeksi['denah_form']), 'icon' => !empty($currentInspeksi['denah_form']),
]; ];
@@ -39,7 +39,7 @@
'url' => 'url' =>
route('surveyor.foto', [ route('surveyor.foto', [
'id' => $permohonan->id, 'id' => $permohonan->id,
]) . "?dokument={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}", ]) . "?documentId={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}",
'show' => true, 'show' => true,
'icon' => !empty($currentInspeksi['foto_form']), 'icon' => !empty($currentInspeksi['foto_form']),
], ],
@@ -48,7 +48,7 @@
'url' => 'url' =>
route('surveyor.data-pembanding', [ route('surveyor.data-pembanding', [
'id' => $permohonan->id, 'id' => $permohonan->id,
]) . "?dokument={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}", ]) . "?documentId={$jaminanId}&jenis_jaminan={$dokumen->jenisJaminan->id}",
'show' => true, 'show' => true,
'icon' => !empty($currentInspeksi['data_pembanding']), 'icon' => !empty($currentInspeksi['data_pembanding']),
], ],
@@ -84,7 +84,7 @@
<a href="{{ route('surveyor.inspeksi', ['id' => $permohonan->id]) . <a href="{{ route('surveyor.inspeksi', ['id' => $permohonan->id]) .
'?' . '?' .
http_build_query([ http_build_query([
'dokument' => $jaminanId, 'documentId' => $jaminanId,
'jenis_jaminan' => $dokumen->jenisJaminan->id, 'jenis_jaminan' => $dokumen->jenisJaminan->id,
]) }}" ]) }}"
class="flex items-center justify-between border border-gray-200 rounded-xl gap-2 px-4 py-4 btn-outline {{ !empty($currentInspeksi['data_form']) ? 'btn-success' : 'btn-primary' }} hover:btn-light"> class="flex items-center justify-between border border-gray-200 rounded-xl gap-2 px-4 py-4 btn-outline {{ !empty($currentInspeksi['data_form']) ? 'btn-success' : 'btn-primary' }} hover:btn-light">
@@ -109,7 +109,7 @@
<a href="{{ route('surveyor.foto', ['id' => $permohonan->id]) . <a href="{{ route('surveyor.foto', ['id' => $permohonan->id]) .
'?' . '?' .
http_build_query([ http_build_query([
'dokument' => $jaminanId, 'documentId' => $jaminanId,
'jenis_jaminan' => $dokumen->jenisJaminan->id, 'jenis_jaminan' => $dokumen->jenisJaminan->id,
]) }}" ]) }}"
class="flex items-center justify-between border border-gray-200 rounded-xl gap-2 px-4 py-4 btn-outline {{ !empty($currentInspeksi['foto_form']) ? 'btn-success' : 'btn-primary' }} hover:btn-light"> class="flex items-center justify-between border border-gray-200 rounded-xl gap-2 px-4 py-4 btn-outline {{ !empty($currentInspeksi['foto_form']) ? 'btn-success' : 'btn-primary' }} hover:btn-light">

View File

@@ -20,7 +20,7 @@
@csrf @csrf
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}"> <input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
<input type="hidden" name="dokument_id" value="{{ request('dokument') }}"> <input type="hidden" name="dokument_id" value="{{ request('documentId') }}">
<input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}"> <input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">

View File

@@ -35,7 +35,7 @@
<form id="formDenah" method="POST" enctype="multipart/form-data" class="w-full"> <form id="formDenah" method="POST" enctype="multipart/form-data" class="w-full">
@csrf @csrf
<input type="hidden" value="{{ $permohonan->id }}" name="permohonan_id"> <input type="hidden" value="{{ $permohonan->id }}" name="permohonan_id">
<input type="hidden" name="dokument_id" value="{{ request('dokument') }}"> <input type="hidden" name="dokument_id" value="{{ request('documentId') }}">
<input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}"> <input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}">
<!-- Container untuk daftar denah --> <!-- Container untuk daftar denah -->
<div id="denah-container"> <div id="denah-container">

View File

@@ -171,7 +171,7 @@
<form id="formFoto" method="POST" class="grid gap-5" enctype="multipart/form-data"> <form id="formFoto" method="POST" class="grid gap-5" enctype="multipart/form-data">
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}"> <input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
<input type="hidden" name="dokument_id" value="{{ request('dokument') }}"> <input type="hidden" name="dokument_id" value="{{ request('documentId') }}">
<input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}"> <input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}">
@@ -303,7 +303,7 @@
params: { params: {
permohonan_id: {{ $permohonan->id ?? 0 }}, permohonan_id: {{ $permohonan->id ?? 0 }},
dokument_id: '{{ request('dokument') ?? '' }}', dokument_id: '{{ request('documentId') ?? '' }}',
param_name: paramName, param_name: paramName,
nomor_registrasi: '{{ $permohonan->nomor_registrasi ?? '' }}', nomor_registrasi: '{{ $permohonan->nomor_registrasi ?? '' }}',
}, },
@@ -531,7 +531,7 @@
method: 'GET', method: 'GET',
data: { data: {
permohonan_id: {{ $permohonan->id ?? 0 }}, permohonan_id: {{ $permohonan->id ?? 0 }},
dokument_id: '{{ request('dokument') ?? '' }}', dokument_id: '{{ request('documentId') ?? '' }}',
param_name: paramName param_name: paramName
}, },
headers: { headers: {
@@ -881,7 +881,7 @@
data: { data: {
path: response.path, path: response.path,
permohonan_id: {{ $permohonan->id ?? 0 }}, permohonan_id: {{ $permohonan->id ?? 0 }},
dokument_id: '{{ request('dokument') ?? '' }}', dokument_id: '{{ request('documentId') ?? '' }}',
param_name: response.param_name param_name: response.param_name
}, },
headers: { headers: {
@@ -916,7 +916,7 @@
}, },
data: { data: {
permohonan_id: {{ $permohonan->id }}, permohonan_id: {{ $permohonan->id }},
dokument_id: '{{ request('dokument') ?? '' }}', dokument_id: '{{ request('documentId') ?? '' }}',
name: $('#editDataName').val(), name: $('#editDataName').val(),
description: $('#editDataDescription').val(), description: $('#editDataDescription').val(),
category: $('#editDataCategory').val(), category: $('#editDataCategory').val(),

View File

@@ -9,6 +9,8 @@
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
@php @php
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
// dd(request('header'));
@endphp @endphp
@if (isset($id)) @if (isset($id))
<a href="{{ route($backLink, ['id' => $id]) }}" class="btn btn-xs btn-info"> <a href="{{ route($backLink, ['id' => $id]) }}" class="btn btn-xs btn-info">
@@ -16,13 +18,13 @@
</a> </a>
@else @else
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer', 'EO Appraisal', 'DD Appraisal']) &&
Request::is('otorisator/show/*/Pelaporan')) Request::is('otorisator/*'))
<a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => 'Pelaporan']) }}" <a href="{{ route('otorisator.show', ['id' => $permohonan->id, 'type' => request('header') ?? 'Pelaporan']) }}"
class="btn btn-xs btn-info"> class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor', 'penilai'])) @elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor', 'penilai']))
@if (Request::is('surveyor/inspeksi/*/create') && request()->has('dokument') && request()->has('jenis_jaminan')) @if (Request::is('surveyor/inspeksi/*/create') && request()->has('documentId') && request()->has('jenis_jaminan'))
<a href="{{ route('surveyor.show', $permohonan->id) }}" class="btn btn-xs btn-info"> <a href="{{ route('surveyor.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>

View File

@@ -342,7 +342,7 @@
// Buat FormData untuk mengirim file // Buat FormData untuk mengirim file
const formData = new FormData(); const formData = new FormData();
const dokument = "{{ request('dokument') }}"; const dokument = "{{ request('documentId') }}";
const permohonan = "{{ $permohonan->id }}"; const permohonan = "{{ $permohonan->id }}";
formData.append('file', file); formData.append('file', file);
formData.append('dokument_id', dokument); formData.append('dokument_id', dokument);

View File

@@ -10,7 +10,7 @@
<form id="formInspeksi" method="POST" enctype="multipart/form-data" class="grid gap-5"> <form id="formInspeksi" method="POST" enctype="multipart/form-data" class="grid gap-5">
@csrf @csrf
<input id="permohonan_id" type="hidden" name="permohonan_id" value="{{ $permohonan->id }}"> <input id="permohonan_id" type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
<input id="dokument_id" type="hidden" name="dokument_id" value="{{ request('dokument') }}"> <input id="dokument_id" type="hidden" name="dokument_id" value="{{ request('documentId') }}">
<input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}"> <input type="hidden" name="nomor_registrasi" value="{{ $permohonan->nomor_registrasi }}">
@if (strtolower($permohonan->tujuanPenilaian->name) == 'rap') @if (strtolower($permohonan->tujuanPenilaian->name) == 'rap')
@@ -70,7 +70,7 @@
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>
<span id="saveButtonText">Simpan</span> <span id="saveButtonText">Simpan</span>
</button> </button>
<a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('dokument'), 'jenis_jaminan_id' => request('jenis_jaminan')]) }}" <a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => request('documentId'), 'jenis_jaminan_id' => request('jenis_jaminan')]) }}"
class="btn btn-info" id="saveButton"> class="btn btn-info" id="saveButton">
<i class="ki-filled ki-printer"></i> <i class="ki-filled ki-printer"></i>
<span>Cetak Form Inspeksi</span> <span>Cetak Form Inspeksi</span>

View File

@@ -1,7 +1,7 @@
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
<h3 class="card-title">Data Pembanding</h3> <h3 class="card-title">Data Pembanding</h3>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
@if (Request::is('penilai/show-data-pembanding/*/edit') && request()->has('dokument') && request()->has('jenis_jaminan')) @if (Request::is('penilai/show-data-pembanding/*/edit') && request()->has('documentId') && request()->has('jenis_jaminan'))
<a href="{{ url()->previous() }}" class="btn btn-xs btn-info"> <a href="{{ url()->previous() }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>

View File

@@ -1,7 +1,7 @@
<div class="card-header bg-agi-50"> <div class="card-header bg-agi-50">
<h3 class="card-title">Data Pembanding</h3> <h3 class="card-title">Data Pembanding</h3>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
@if (Request::is('penilai/show-data-pembanding/*/edit') && request()->has('dokument') && request()->has('jenis_jaminan')) @if (Request::is('penilai/show-data-pembanding/*/edit') && request()->has('documentId') && request()->has('jenis_jaminan'))
<a href="{{ url()->previous() }}" class="btn btn-xs btn-info"> <a href="{{ url()->previous() }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>

View File

@@ -678,6 +678,11 @@ Breadcrumbs::for('noc.edit', function (BreadcrumbTrail $trail) {
$trail->push('Proses NOC'); $trail->push('Proses NOC');
}); });
Breadcrumbs::for('noc.penyelesaian', function (BreadcrumbTrail $trail) {
$trail->parent('noc');
$trail->push('Proses Memo Penyelesaian NOC');
});
Breadcrumbs::for('laporan-external', function (BreadcrumbTrail $trail) { Breadcrumbs::for('laporan-external', function (BreadcrumbTrail $trail) {
$trail->push('Laporan External', route('laporan-external.index')); $trail->push('Laporan External', route('laporan-external.index'));
}); });

View File

@@ -654,6 +654,9 @@ Route::middleware(['auth'])->group(function () {
Route::get('noc/datatables', [NocController::class, 'dataForDatatables']) Route::get('noc/datatables', [NocController::class, 'dataForDatatables'])
->name('noc.datatables'); ->name('noc.datatables');
Route::get('noc/penyelesaian',[NocController::class, 'show'])->name('noc.penyelesaian');
Route::post('noc/penyelesaian',[NocController::class, 'penyelesaian'])->name('noc.store.penyelesaian');
Route::resource('noc', NocController::class); Route::resource('noc', NocController::class);