Membuat Sub Menu Data Penawaran dari Menu Tender part 4

This commit is contained in:
2024-10-03 17:48:21 +07:00
parent 5cc18fa0e1
commit 07c0276c34
9 changed files with 614 additions and 513 deletions

View File

@@ -55,9 +55,12 @@ class TenderController extends Controller
$validated['nomor_registrasi'] = $penawaran->nomor_registrasi; $validated['nomor_registrasi'] = $penawaran->nomor_registrasi;
$validated['nama_kjpp_sebelumnya'] = json_encode($request->input('nama_kjpp_sebelumnya')); // Mengatasi null untuk nama_kjpp_sebelumnya, biaya_kjpp_sebelumnya, dan tanggal_penilaian_sebelumnya
$validated['nama_kjpp_sebelumnya'] = json_encode($request->input('nama_kjpp_sebelumnya') ?? []);
$validated['biaya_kjpp_sebelumnya'] = $request->input('biaya_kjpp_sebelumnya') ?? '';
$validated['tanggal_penilaian_sebelumnya'] = $request->input('tanggal_penilaian_sebelumnya') ?? '';
dd($validated); // dd($validated);
PenawaranTender::create($validated); PenawaranTender::create($validated);
@@ -77,7 +80,9 @@ class TenderController extends Controller
public function penawaran_show($id) public function penawaran_show($id)
{ {
$penawaran = PenawaranTender::find($id); $penawaran = PenawaranTender::find($id);
return view('lpj::penawaran.show', compact('id', 'penawaran')); $kjpps = KJPP::find($id);
return view('lpj::penawaran.show', compact('id', 'penawaran', 'kjpps'));
} }
/** /**
@@ -111,7 +116,7 @@ class TenderController extends Controller
} }
// Retrieve data from the database // Retrieve data from the database
$query = PenawaranTender::query(); $query = PenawaranTender::query()->where('status', '=', 'Registered');
// Apply search filter if provided // Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {

View File

@@ -12,10 +12,10 @@ class TenderPenawaranRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
$rules = [ $rules = [
'nama_kjpp_sebelumnya' => 'required|array', 'nama_kjpp_sebelumnya' => 'nullable|array',
'nama_kjpp_sebelumnya.*' => 'exists:kjpp,name', 'nama_kjpp_sebelumnya.*' => 'exists:kjpp,name',
'biaya_kjpp_sebelumnya' => 'required|numeric', 'biaya_kjpp_sebelumnya' => 'nullable|numeric',
'tanggal_penilaian_sebelumnya' => 'required', 'tanggal_penilaian_sebelumnya' => 'nullable',
'nomor_registrasi' => 'required', 'nomor_registrasi' => 'required',
'tujuan_penilaian_kjpp_id' => 'required', 'tujuan_penilaian_kjpp_id' => 'required',
'jenis_laporan_id' => 'required', 'jenis_laporan_id' => 'required',
@@ -48,10 +48,6 @@ class TenderPenawaranRequest extends FormRequest
'code.required' => 'Kode Penawaran Wajib diisi!', 'code.required' => 'Kode Penawaran Wajib diisi!',
'code.max' => 'Kode Penawaran maksimal 255 huruf!', 'code.max' => 'Kode Penawaran maksimal 255 huruf!',
'code.unique' => 'Kode Penawaran tidak boleh sama!', 'code.unique' => 'Kode Penawaran tidak boleh sama!',
'nama_kjpp_sebelumnya.required' => 'Nama KJPP Sebelumnya Wajib diisi!',
'biaya_kjpp_sebelumnya.required' => 'Biaya KJPP Sebelumnya Wajib diisi!',
'biaya_kjpp_sebelumnya.numeric' => 'Biaya KJPP Sebelumnya harus berupa angka!',
'tanggal_penilaian_sebelumnya.required' => 'Tanggal Penilaian Sebelumnya Wajib diisi!',
'nomor_registrasi.required' => 'Nomor Registrasi Wajib diisi!', 'nomor_registrasi.required' => 'Nomor Registrasi Wajib diisi!',
'tujuan_penilaian_kjpp_id.required' => 'Tujuan Penilaian KJPP Wajib diisi!', 'tujuan_penilaian_kjpp_id.required' => 'Tujuan Penilaian KJPP Wajib diisi!',
'jenis_laporan_id.required' => 'Jenis Laporan Wajib diisi!', 'jenis_laporan_id.required' => 'Jenis Laporan Wajib diisi!',
@@ -70,6 +66,14 @@ class TenderPenawaranRequest extends FormRequest
if ($endDate < $startDate) { if ($endDate < $startDate) {
$validator->errors()->add('end_date', 'Tanggal Akhir tidak boleh lebih awal dari Tanggal Awal.'); $validator->errors()->add('end_date', 'Tanggal Akhir tidak boleh lebih awal dari Tanggal Awal.');
} }
// Validasi minimal 3 pilihan pada nama_kjpp_sebelumnya
$namaKjppSebelumnya = $this->input('nama_kjpp_sebelumnya', []);
// Abaikan jika array kosong, tetapi validasi jika terisi kurang dari 3 item
if (!empty($namaKjppSebelumnya) && is_array($namaKjppSebelumnya) && count($namaKjppSebelumnya) < 3) {
$validator->errors()->add('nama_kjpp_sebelumnya', 'Nama KJPP Sebelumnya harus memiliki minimal 3 pilihan jika diisi.');
}
}); });
} }
} }

View File

@@ -0,0 +1,32 @@
<?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::table('penawaran', function (Blueprint $table) {
$table->string('nama_kjpp_sebelumnya')->nullable()->change();
$table->string('biaya_kjpp_sebelumnya')->nullable()->change();
$table->datetime('tanggal_penilaian_sebelumnya')->nullable()->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('penawaran', function (Blueprint $table) {
$table->string('nama_kjpp_sebelumnya')->change();
$table->string('biaya_kjpp_sebelumnya')->change();
$table->datetime('tanggal_penilaian_sebelumnya')->change();
});
}
};

View File

@@ -0,0 +1,28 @@
<?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::table('penawaran', function (Blueprint $table) {
$table->text('catatan')->nullable()->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('penawaran', function (Blueprint $table) {
$table->text('catatan')->change();
});
}
};

View File

@@ -5,9 +5,7 @@
"description": "", "description": "",
"keywords": [], "keywords": [],
"priority": 0, "priority": 0,
"providers": [ "providers": ["Modules\\Lpj\\Providers\\LpjServiceProvider"],
"Modules\\Lpj\\Providers\\LpjServiceProvider"
],
"files": [], "files": [],
"menu": { "menu": {
"main": [ "main": [
@@ -18,9 +16,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"administrator"
]
}, },
{ {
"title": "Tender", "title": "Tender",
@@ -29,9 +25,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"],
"administrator"
],
"sub": [ "sub": [
{ {
"title": "Data Penawaran", "title": "Data Penawaran",
@@ -66,9 +60,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"administrator"
]
}, },
{ {
"title": "Data Debitur", "title": "Data Debitur",
@@ -77,9 +69,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"administrator"
]
}, },
{ {
"title": "Authorization", "title": "Authorization",
@@ -88,9 +78,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"administrator"
]
}, },
{ {
"title": "Registrasi", "title": "Registrasi",
@@ -99,9 +87,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"Administrator"
]
}, },
{ {
"title": "Assignment", "title": "Assignment",
@@ -110,9 +96,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"Administrator"
]
}, },
{ {
"title": "Activity", "title": "Activity",
@@ -121,9 +105,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"Administrator"
]
}, },
{ {
"title": "Laporan", "title": "Laporan",
@@ -132,9 +114,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"]
"administrator"
]
} }
], ],
"master": [ "master": [
@@ -145,9 +125,7 @@
"classes": "", "classes": "",
"attributes": [], "attributes": [],
"permission": "", "permission": "",
"roles": [ "roles": ["administrator"],
"Administrator"
],
"sub": [ "sub": [
{ {
"title": "Cabang", "title": "Cabang",
@@ -197,6 +175,14 @@
"permission": "", "permission": "",
"roles": [] "roles": []
}, },
{
"title": "Jenis Laporan",
"path": "basicdata.jenis_laporan",
"classes": "",
"attributes": [],
"permission": "",
"roles": []
},
{ {
"title": "Tujuan Penilaian", "title": "Tujuan Penilaian",
"path": "basicdata.tujuan-penilaian", "path": "basicdata.tujuan-penilaian",

View File

@@ -29,7 +29,7 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" value="{{ $penawaran->nomor_registrasi ?? '-' }}" name="nomor_registrasi" <input type="text" value="{{ $penawaran->nomor_registrasi ?? '-' }}" name="nomor_registrasi"
class="flex w-full text-gray-600 font-medium text-sm" readonly> class="flex w-full text-gray-600 font-medium text-sm input-custom" readonly>
@error('nomor_registrasi') @error('nomor_registrasi')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror
@@ -170,8 +170,8 @@
</div> </div>
<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">Status</label> <label class="form-label max-w-56">Status</label>
<select id="status" class="select w-full @error('status') border-danger @enderror" <div class="flex flex-wrap items-baseline w-full">
name="status"> <select class="select w-full @error('status') border-danger @enderror" name="status">
<option value="">Pilih Status</option> <option value="">Pilih Status</option>
@if (isset($status)) @if (isset($status))
@foreach ($status as $s) @foreach ($status as $s)
@@ -182,6 +182,10 @@
@endforeach @endforeach
@endif @endif
</select> </select>
@error('status')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div> </div>
<div class="flex justify-end"> <div class="flex justify-end">
<button type="submit" class="btn btn-primary"> <button type="submit" class="btn btn-primary">
@@ -193,3 +197,12 @@
</form> </form>
</div> </div>
@endsection @endsection
@push('styles')
<style>
input.input-custom:focus {
outline: none;
box-shadow: none;
}
</style>
@endpush

View File

@@ -90,38 +90,6 @@
1]; 1];
} }
</script> </script>
<script type="text/javascript">
function deleteData(data) {
Swal.fire({
title: 'Are you sure?',
text: "You won't be able to revert this!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
}).then((result) => {
if (result.isConfirmed) {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
});
$.ajax(`tender/penawaran/${data}`, {
type: 'DELETE'
}).then((response) => {
swal.fire('Deleted!', 'User has been deleted.', 'success').then(() => {
window.location.reload();
});
}).catch((error) => {
console.error('Error:', error);
Swal.fire('Error!', 'An error occurred while deleting the file.', 'error');
});
}
})
}
</script>
<script type="module"> <script type="module">
const element = document.querySelector('#penawaran-table'); const element = document.querySelector('#penawaran-table');
const searchInput = document.getElementById('search'); const searchInput = document.getElementById('search');
@@ -146,10 +114,26 @@
}, },
nama_kjpp_sebelumnya: { nama_kjpp_sebelumnya: {
title: 'Nama KJPP Sebelumnya', title: 'Nama KJPP Sebelumnya',
render: (item, data) => {
let nama = data.nama_kjpp_sebelumnya;
if (typeof nama === 'string') {
nama = JSON.parse(nama);
}
if (nama.length === 0) {
return `<span class="badge badge-danger badge-xs">Tidak Ada</span>`;
}
return nama.map(n => `<span class="badge badge-primary badge-xs">${n}</span>`).join(' ');
}
}, },
tanggal_penilaian_sebelumnya: { tanggal_penilaian_sebelumnya: {
title: 'Tanggal Penilaian Sebelumnya', title: 'Tanggal Penilaian Sebelumnya',
render: (item, data) => formatDate(new Date(data.tanggal_penilaian_sebelumnya)) render: (item, data) => {
const tanggal = data.tanggal_penilaian_sebelumnya;
if (!tanggal) {
return 'Tidak ada';
}
return formatDate(new Date(tanggal));
}
}, },
actions: { actions: {
title: 'Action', title: 'Action',

View File

@@ -28,8 +28,60 @@
{{ $penawaran->nomor_registrasi }} {{ $penawaran->nomor_registrasi }}
</p> </p>
</div> </div>
<label class="form-label max-w-56">
No. Penawaran
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ $penawaran->code }}
</p>
</div> </div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Nama KJPP Sebelumnya
</label>
<div class="flex flex-wrap items-baseline w-full">
@if (isset($penawaran->nama_kjpp_sebelumnya) && !empty(json_decode($penawaran->nama_kjpp_sebelumnya, true)))
<div class="flex flex-row space-x-4 text-gray-600 font-medium text-sm gap-1">
@foreach (json_decode($penawaran->nama_kjpp_sebelumnya, true) as $penawaran_code)
@php
$kjpp = $kjpps->firstWhere('name', $penawaran_code);
@endphp
@if ($kjpp)
<div
class="flex flex-row space-x-4 text-white font-medium text-sm badge badge-dark dark-mode:badge dark-mode:text-gray-600 badge-xs">
{{ $kjpp->name }}
</div>
@endif
@endforeach
</div>
@else
<div class="flex flex-row space-x-4 text-gray-600 font-medium text-sm">
Tidak ada
</div>
@endif
</div>
<label class="form-label max-w-56">
Biaya KJPP Sebelumnya
</label>
<p class="flex w-full text-gray-600 font-medium text-sm">
@php
function formatRupiah($number)
{
// Convert to float if the input is a string
$number = (float) $number;
return 'Rp ' . number_format($number, 2, ',', '.');
}
@endphp
@if (isset($penawaran->biaya_kjpp_sebelumnya))
{{ formatRupiah($penawaran->biaya_kjpp_sebelumnya) }}
@else
{{ formatRupiah(0) }}
@endif
</p>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -201,9 +201,6 @@
], ],
]); ]);
Route::resource('region', RegionController::class);
Route::name('teams.')->prefix('teams')->group(function () { Route::name('teams.')->prefix('teams')->group(function () {
Route::get('restore/{id}', [TeamsController::class, 'restore'])->name('restore'); Route::get('restore/{id}', [TeamsController::class, 'restore'])->name('restore');
Route::get('datatables', [TeamsController::class, 'dataForDatatables'])->name('datatables'); Route::get('datatables', [TeamsController::class, 'dataForDatatables'])->name('datatables');