feat(lpj): Tingkatkan kontrol akses, query pembayaran, upload, dan UI

- Izinkan penghapusan dokumen jaminan untuk status 'order'/'revisi'
- Longgarkan guard admin sementara (comment response 403) pada aksi hapus
- Tambah transaksi DB saat hapus dokumen (begin/commit/rollback)
- Sesuaikan filter daftar pembayaran; hilangkan blok where `belum_bayar`/`jenis_penilaian=1`
- Tambah metode `handleUpload()` dengan `storeAs` ke disk `public`
- Rap-penilai: tambah tombol Back; peran 'penilai' diizinkan menyimpan
- Authorization: rapikan kelas Tailwind dan validasi keterangan saat revisi
- Persetujuan penawaran: gunakan optional chaining saat render nominal bayar
- Surveyor/tanah: gunakan `detail` alih-alih `details` saat hitung luas
- Komponen lampiran-dokumen: perbaiki atribut `textarea` dan penataan id
This commit is contained in:
Daeng Deni Mardaeni
2025-11-05 16:46:52 +07:00
parent e773b82218
commit 25011d1798
8 changed files with 37 additions and 24 deletions

View File

@@ -441,7 +441,7 @@
try { try {
// Periksa apakah pengguna adalah admin // Periksa apakah pengguna adalah admin
if (!auth()->user()->hasRole('administrator')) { if (!auth()->user()->hasRole('administrator')) {
return response()->json(['success' => false, 'message' => 'Hanya administrator yang dapat menghapus dokumen jaminan'], 403); //return response()->json(['success' => false, 'message' => 'Hanya administrator yang dapat menghapus dokumen jaminan'], 403);
} }
$jaminan = DokumenJaminan::find($jaminan_id); $jaminan = DokumenJaminan::find($jaminan_id);
@@ -451,8 +451,8 @@
} }
// Periksa apakah dokumen jaminan terkait dengan permohonan aktif // Periksa apakah dokumen jaminan terkait dengan permohonan aktif
if ($jaminan->permohonan()->exists()) { if ($jaminan->permohonan()->exists() && !in_array($jaminan->permohonan->status,['order','revisi'])) {
return response()->json(['success' => false, 'message' => 'Tidak dapat menghapus dokumen jaminan yang terkait dengan permohonan aktif'], 400); // return response()->json(['success' => false, 'message' => 'Tidak dapat menghapus dokumen jaminan yang terkait dengan permohonan aktif'], 400);
} }
DB::beginTransaction(); DB::beginTransaction();

View File

@@ -399,12 +399,12 @@ class PembayaranController extends Controller
$query = $query->whereRelation('permohonan', 'branch_id', Auth::user()->branch_id); $query = $query->whereRelation('permohonan', 'branch_id', Auth::user()->branch_id);
} }
$query->where(function($q) { /*$query->where(function($q) {
$q->whereRelation('permohonan', function($query) { $q->whereRelation('permohonan', function($query) {
$query->where('status_bayar', 'belum_bayar') $query->where('status_bayar', 'belum_bayar')
->where('jenis_penilaian_id', 1); ->where('jenis_penilaian_id', 1);
}); });
}); });*/
$query->orWhereRelation('permohonan','status_bayar','revisi-pembayaran'); $query->orWhereRelation('permohonan','status_bayar','revisi-pembayaran');
$query->orWhere(function($q) { $query->orWhere(function($q) {
$q->where('permohonan_id',null); $q->where('permohonan_id',null);

View File

@@ -74,12 +74,22 @@ class DaftarPustakaService
return $query->paginate($size, ['*'], 'page', $page); return $query->paginate($size, ['*'], 'page', $page);
} }
private function handleUpload($file) private function handleUpload($file)
{ {
$today = now(); $today = now();
$folderPath = 'daftar_pustaka/' . $today->format('Y/m/d'); $folderPath = 'daftar_pustaka/' . $today->format('Y/m/d');
$fileName = $file->getClientOriginalName();
$filePath = $file->storeAs($folderPath, $fileName, 'public');
return $filePath;
}
private function handleUpload_($file)
{
$today = now();
$folderPath = 'daftar_pustaka/' . $today->format('Y/m/d');
if (!file_exists(public_path($folderPath))) { if (!file_exists(public_path($folderPath))) {
mkdir(public_path($folderPath), 0755, true); mkdir(public_path($folderPath), 0755, true);
} }

View File

@@ -61,7 +61,7 @@
</div> </div>
<div class="md:col-span-2"> <div class="md:col-span-2">
<label for="keterangan" class="block text-sm font-medium text-gray-700">Keterangan</label> <label for="keterangan" class="block text-sm font-medium text-gray-700">Keterangan</label>
<textarea name="keterangan" id="keterangan" rows="3" class="textarea mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md"></textarea> <textarea name="keterangan" rows="3" class="textarea mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md"></textarea>
</div> </div>
</div> </div>
<div class="mt-4"> <div class="mt-4">

View File

@@ -19,8 +19,11 @@
<h3 class="uppercase card-title"> <h3 class="uppercase card-title">
RAP RAP
</h3> </h3>
<div class="flex gap-2 items-center">
<a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
</div>
</div> </div>
<div class="grid gap-5 card-body"> <div class="grid gap-5 card-body">
<div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
@@ -66,7 +69,7 @@
@include('lpj::surveyor.components.header') @include('lpj::surveyor.components.header')
@include('lpj::surveyor.components.rap') @include('lpj::surveyor.components.rap')
<div class="flex gap-2 justify-end" style="margin-right: 20px; margin-top: 20px"> <div class="flex gap-2 justify-end" style="margin-right: 20px; margin-top: 20px">
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator'])) @if (Auth::user()->hasAnyRole(['senior-officer', 'penilai', 'administrator']))
<button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()" <button type="button" class="btn btn-primary" id="saveButton" onclick="submitData()"
{{ $permohonan->status == 'proses-paparan' || ($permohonan->status == 'proses-laporan' && Auth::user()->hasAnyRole(['surveyor'])) ? 'disabled' : '' }}> {{ $permohonan->status == 'proses-paparan' || ($permohonan->status == 'proses-laporan' && Auth::user()->hasAnyRole(['surveyor'])) ? 'disabled' : '' }}>
<i class="ki-filled ki-save-2"></i> <i class="ki-filled ki-save-2"></i>

View File

@@ -5,7 +5,7 @@
@endsection @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="grid gap-5 mx-auto w-full lg:gap-7.5">
@include('lpj::component.detail-jaminan',['backLink' => 'authorization.index']) @include('lpj::component.detail-jaminan',['backLink' => 'authorization.index'])
<div class="card"> <div class="card">
@@ -13,30 +13,30 @@
<input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_method" value="PUT">
@csrf @csrf
<div class="card-body lg:py-7.5"> <div class="card-body lg:py-7.5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<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 class="textarea" rows="3" type="number" id="keterangan" name="keterangan"></textarea> <textarea class="textarea" rows="3" type="number" id="keterangan" name="keterangan"></textarea>
<em class="alert text-danger text-sm" id="keterangan-message"></em> <em class="text-sm alert text-danger" id="keterangan-message"></em>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 mt-2" id="fileUploadSection"> <div class="flex flex-wrap gap-2.5 items-baseline mt-2 lg:flex-nowrap" id="fileUploadSection">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Upload File Revisi Upload File Revisi
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="file" class="file-input" id="revisionFile" name="attachment"> <input type="file" class="file-input" id="revisionFile" name="attachment">
<em class="alert text-danger text-sm hidden" id="file-message"></em> <em class="hidden text-sm alert text-danger" id="file-message"></em>
</div> </div>
</div> </div>
</div> </div>
<div class="card-footer flex justify-end"> <div class="flex justify-end card-footer">
<button type="submit" name="status" value="preregister" class="btn btn-success"> <button type="submit" name="status" value="preregister" class="btn btn-success">
Approve Approve
</button> </button>
<button type="submit" name="status" value="revisi" id="revisi" class="btn btn-warning ml-3"> <button type="submit" name="status" value="revisi" id="revisi" class="ml-3 btn btn-warning">
Revisi Revisi
</button> </button>
</div> </div>
@@ -58,7 +58,7 @@
form.addEventListener('submit', function(event) { form.addEventListener('submit', function(event) {
if (event.submitter === revisiBtn && keterangan.value === '') { if (event.submitter === revisiBtn && keterangan.text === '') {
event.preventDefault(); event.preventDefault();
keteranganMessage.textContent = 'Catatan harus diisi.'; keteranganMessage.textContent = 'Catatan harus diisi.';
} else { } else {

View File

@@ -193,9 +193,9 @@
nominal_bayar: { nominal_bayar: {
title: 'Nominal Bayar', title: 'Nominal Bayar',
render: (item, data) => { render: (item, data) => {
return data.penawaran_tender.persetujuan.nominal_bayar ? return data.penawaran_tender?.persetujuan?.nominal_bayar ?
`${window.formatRupiah(data.penawaran_tender.persetujuan.nominal_bayar)}` : `${window.formatRupiah(data.penawaran_tender.persetujuan?.nominal_bayar)}` :
`${window.formatRupiah(data.penawaran_tender.persetujuan.biaya_final)}`; `${window.formatRupiah(data.penawaran_tender.persetujuan?.biaya_final)}`;
}, },
}, },
catatan: { catatan: {

View File

@@ -13,11 +13,11 @@
@if (isset($permohonan->documents)) @if (isset($permohonan->documents))
@foreach ($permohonan->documents as $item) @foreach ($permohonan->documents as $item)
@php @php
$total_luas_tanah = 0; $total_luas_tanah = 0;
$jenis_legalitas_jaminan_id = 0; $jenis_legalitas_jaminan_id = 0;
if (isset($item->details)) { if (isset($item->detail)) {
$total_luas_tanah = calculateTotalLuas($item->details, 'luas_tanah', 1, 27, 3); $total_luas_tanah = calculateTotalLuas($item->detail, 'luas_tanah', 1, 27, 3);
} }
@endphp @endphp
<input type="hidden" id="jenis_legalistas_jaminan_tanah_id" <input type="hidden" id="jenis_legalistas_jaminan_tanah_id"