✨ 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:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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: {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user