diff --git a/app/Http/Controllers/ProsesPenawaranController.php b/app/Http/Controllers/ProsesPenawaranController.php new file mode 100644 index 0000000..7dacc41 --- /dev/null +++ b/app/Http/Controllers/ProsesPenawaranController.php @@ -0,0 +1,406 @@ +user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query =PenawaranTender::query()->where('status','=','tender')->withCount('penawarandetails'); + + // 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->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(); + $data = $query->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 edit($id) + { + return view('lpj::prosespenawaran.edit', compact('id')); + } + + public function setData(Request $request): JsonResponse + { + $data = array(); + $penawaran = array(); + $penawrandetails = array(); + + if (request()->ajax()) { + $id = $request->id; + $penawaran = PenawaranTender::findOrFail($id); + $penawrandetails = PenawaranDetailTender::where('penawaran_id','=',$id) + ->leftJoin('kjpp', 'kjpp.id', '=', 'detail_penawaran.kjpp_rekanan_id') + ->select('detail_penawaran.*', 'kjpp.code AS kjpp_code', 'kjpp.name AS kjpp_name') + ->where('detail_penawaran.status','=',1) + ->get(); + $data['status'] = 'success'; + if ($penawaran) { + $i=0; + foreach($penawrandetails as $obj) + { + // dd($obj->dokumen_persetujuan); + if($obj->dokumen_persetujuan && Storage::disk('public')->exists($obj->dokumen_persetujuan)) + { + $penawrandetails_path = Storage::url($obj->dokumen_persetujuan); + $penawrandetails[$i]->dokumen_persetujuan = $penawrandetails_path; + $i++; + } + } + + $kjpp=null; + $kjpp = KJPP::pluck('name', 'id'); + $data['penawaran'] = $penawaran; + $data['penawrandetails'] = $penawrandetails; + $data['message'] = 'data successfully found'; + } else { + $data['penawaran'] = null; + $data['penawrandetails'] = null; + $data['message'] = 'data not found'; + } + } else { + $data['status'] = 'error'; + $data['message'] = 'no ajax request'; + } + + return response()->json($data); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id): JsonResponse + { + // init + $data = array(); + $dataku = array(); + $tindakan = null; + if (request()->ajax()) { + $validator = ProsesPenawaranController::rulesEditnya($request, $id); + + if ($validator['fails']) { + $data['message'] = $validator['errors']; + $data['status'] = 'error'; + } + else + { + try { + + $dataku = ['updated_by' => Auth::id(), + 'updated_at' => now(), + 'biaya_penawaran' => str_replace(".","",$request->biaya_penawaran) + ]; + + if ($request->hasFile('dokumen_persetujuan')) + { + $file_tmp = $request->file('dokumen_persetujuan'); + $folderPath = 'uploads/penawaran/'; + if ($file_tmp->isValid()) + { + $myFile=$file_tmp->getClientOriginalName(); // nama file with extension + $file_name = pathinfo($myFile, PATHINFO_FILENAME); // nama file without extension + + $extension = $file_tmp->getClientOriginalExtension(); + // kjppID_penawaranID_namaFile_userID_time + $newFileName = $request->kjpp_rekanan_id.'_'.$id.'_'.$file_name.'_'.Auth::user()->id."_".time() .'.'. $extension; + Storage::disk('public')->put($folderPath.'/'.$newFileName,file_get_contents($file_tmp)); + + $newFileNameWithPath = $folderPath . $newFileName; + $dataku['attachment'] = $myFile; + $dataku['dokumen_persetujuan'] = $newFileNameWithPath; + + $model = PenawaranDetailTender::findOrFail($id); + $model->update($dataku); + + $data['status'] = 'success'; + $data['detailpenawaran_id'] = $id; + $data['message'] = 'Proses Penawarn KJPP successfully'; + } + else + { + $data['status'] = 'error'; + $data['message'] = 'Silahkan upload file pdf'; + } + } + else + { + $data['status'] = 'error'; + $data['message'] = 'Silahkan upload file'; + } + + } catch (Exception $e) { + + $data['status'] = 'error'; + $data['message'] = 'Proses Penawarn KJPP failed.'; + } + } + + } else { + $data['status'] = 'error'; + $data['message'] = 'no ajax request'; + } + + return response()->json($data); + } + + public function rulesEditnya($request, $id) + { + $validateIt = [ + // 'name' diambil dari definisi parameter yang di kirim pada POST Data + 'biaya_penawaran' => 'required', + 'dokumen_persetujuan' => 'required|file|mimes:pdf' + ]; + + $messageIt = [ + 'biaya_penawaran.required' => 'Silahkan isi Biaya Penawaran', + 'dokumen_persetujuan.required' => 'Silahkan isi dokumen', + 'dokumen_persetujuan.file' => 'Silahkan isi file', + 'dokumen_persetujuan.mimes' => 'Silahkan upload pdf' + ]; + + $validator = Validator::make($request->all(), $validateIt, $messageIt); + + $data['fails'] = $validator->fails(); + $data['errors'] = $validator->errors(); + + return $data; + } + + /** + * Update the specified resource in storage. + */ + public function updateAll(Request $request, $id): JsonResponse + { + // init + $data = array(); + $dataku = array(); + $model = PenawaranTender::findOrFail($id); + $checkActiveDateRange = $this->checkActiveDateRangePenawaran($model->start_date, $model->end_date); + + // cek masa aktif penawaran + if($checkActiveDateRange) + { + + $checkKelengkapanDetailKJPP = $this->checkKelengkapanDetailKJPP($id); + if($checkKelengkapanDetailKJPP) + { + DB::beginTransaction(); + try { + $dataku = ['status' => 'tendered', + 'updated_by' => Auth::id(), + 'updated_at' => now() + ]; + + $dataPermohonan = ['status' => 'tendered', + 'updated_by' => Auth::id(), + 'updated_at' => now() + ]; + + $permohonan = Permohonan::where('nomor_registrasi','=', $model->nomor_registrasi)->first(); + + $model->update($dataku); + $permohonan->update($dataPermohonan); + + DB::commit(); + + $data['message'] = "Sukses melakukan Proses Penawaran"; + $data['status'] = 'success'; + + } catch (Exception $e) { + DB::rollBack(); + // dd($e); + $data['message'] = "Gagal melakukan Proses Penawaran"; + $data['status'] = 'error'; + } + + } + else + { + $data['message'] = "Silahkan lengkapi data KJPP"; + $data['status'] = 'error'; + } + + } + else + { + $data['message'] = "Penawaran sudah di tutup"; + $data['status'] = 'error'; + } + + return response()->json($data); + } + + public function checkActiveDateRangePenawaran($start_date1, $end_date1) + { + $start_date = strtotime($start_date1); + $end_date = strtotime($end_date1); + $todays_date = strtotime(now()); + + $allow=true; + if ($todays_date >= $start_date && $todays_date <= $end_date) + { + //Penawaran dibuka + $allow=true; + } + else + { + if($todays_date < $start_date) + { + //Penawaran Belum dibuka + $allow=true; + } + else + { + //Penawaran sudah ditutup + $allow=false; + } + } + + return $allow; + + } + + public function checkKelengkapanDetailKJPP($id) + { + $allow=true; + // DB::enableQueryLog(); + // detail_penawaran apakah isian biaya_penawaran, attachment, dokumen_persetujuan sudah lengkap? + $query = PenawaranDetailTender::select('id') + ->where('penawaran_id','=',$id) + ->where(function($query) { + $query->orWhere('biaya_penawaran', '', ""); + $query->orWhereNull('biaya_penawaran'); + + $query->orWhere('attachment', '', ""); + $query->orWhereNull('attachment'); + + $query->orWhere('dokumen_persetujuan', '', ""); + $query->orWhereNull('dokumen_persetujuan'); + })->get(); + // $sql = DB::getQueryLog(); + + + if (sizeof($query)>0) + { + $allow=false; + } + + return $allow; + + } + + public function updateStatusPenawaranKJPP(Request $request, $id): JsonResponse + { + // init + $data = array(); + $dataku = array(); + + try { + $model = PenawaranDetailTender::findOrFail($id); + $data['id']=$id; + + $dataku = ['status' => '0', + 'updated_by' => Auth::id(), + 'updated_at' => now() + ]; + + $model->update($dataku); + + $data['message'] = "Sukses delete Penawaran KJPP"; + $data['status'] = 'success'; + } catch (Exception $e) { + + // dd($e); + $data['message'] = "Gagal delete Penawaran KJPP"; + $data['status'] = 'error'; + } + return response()->json($data); + } + + public function show($id) + { + $prosespenawaran = PenawaranTender::find($id); + return view('lpj::prosespenawaran.show', compact('id','prosespenawaran')); + } +} diff --git a/app/Models/PenawaranDetailTender.php b/app/Models/PenawaranDetailTender.php new file mode 100644 index 0000000..af7d73b --- /dev/null +++ b/app/Models/PenawaranDetailTender.php @@ -0,0 +1,24 @@ +belongsTo(PenawaranTender::class, 'penawaran_id', 'id'); + } +} diff --git a/app/Models/PenawaranTender.php b/app/Models/PenawaranTender.php index ece9b07..405c751 100644 --- a/app/Models/PenawaranTender.php +++ b/app/Models/PenawaranTender.php @@ -4,6 +4,7 @@ namespace Modules\Lpj\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; // andy add class PenawaranTender extends Model { @@ -15,4 +16,11 @@ class PenawaranTender extends Model protected $table = 'penawaran'; protected $guarded = ['id']; + + // andy add + public function penawarandetails(): HasMany + { + return $this->hasMany(PenawaranDetailTender::class, 'penawaran_id', 'id')->where('status', '=', 1); + } + // andy add } diff --git a/module.json b/module.json index d3775b8..69a36d2 100644 --- a/module.json +++ b/module.json @@ -19,7 +19,7 @@ "attributes": [], "permission": "", "roles": [ - "administrator" + "Administrator" ] }, { @@ -30,7 +30,7 @@ "attributes": [], "permission": "", "roles": [ - "administrator" + "Administrator" ], "sub": [ { @@ -43,7 +43,7 @@ }, { "title": "Data Proses Penawaran", - "path": "tender.proses_penawaran", + "path": "tender.prosespenawaran", "classes": "", "attributes": [], "permission": "", @@ -67,7 +67,7 @@ "attributes": [], "permission": "", "roles": [ - "administrator" + "Administrator" ] }, { @@ -78,7 +78,7 @@ "attributes": [], "permission": "", "roles": [ - "administrator" + "Administrator" ] }, { @@ -89,7 +89,7 @@ "attributes": [], "permission": "", "roles": [ - "administrator" + "Administrator" ] }, { @@ -133,7 +133,7 @@ "attributes": [], "permission": "", "roles": [ - "administrator" + "Administrator" ] } ], diff --git a/resources/views/assetsku/includenya.blade.php b/resources/views/assetsku/includenya.blade.php index b8a8fcf..6507007 100644 --- a/resources/views/assetsku/includenya.blade.php +++ b/resources/views/assetsku/includenya.blade.php @@ -1,7 +1,104 @@ + \ No newline at end of file diff --git a/resources/views/prosespenawaran/edit.blade.php b/resources/views/prosespenawaran/edit.blade.php new file mode 100644 index 0000000..53c318a --- /dev/null +++ b/resources/views/prosespenawaran/edit.blade.php @@ -0,0 +1,82 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endsection +@php + // $route = Route::currentRouteName(); + // dd($route); + $route = explode('.', Route::currentRouteName()); +@endphp + +@section('content') +
+ + + + +
+
+

+ Tambah Data Proses Penawaran +

+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+

Data KJPP

+
+
+ + + + + + + + + + + + +
NoKJPPBiaya PenawaranUpload PenawaranAction
+
+
+
+ +
+ +
+
+
+
+@endsection +@include('lpj::prosespenawaran.js.editjs') \ No newline at end of file diff --git a/resources/views/prosespenawaran/index.blade.php b/resources/views/prosespenawaran/index.blade.php new file mode 100644 index 0000000..d07fe91 --- /dev/null +++ b/resources/views/prosespenawaran/index.blade.php @@ -0,0 +1,153 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('tender.prosespenawaran') }} +@endsection + +@section('content') +
+
+
+

+ Daftar Proses Penawaran +

+
+
+ +
+ +
+
+
+
+ + + + + + + + + + + + + +
+ + + Nomor Registrasi + + + Kode Penawaran + + + Tanggal Penawaran + + + Tujuan Penilaian + + + Total KJPP + + + Status + + Action
+
+ +
+
+
+@endsection + +@push('scripts') + + +@endpush diff --git a/resources/views/prosespenawaran/js/editextjs.blade.php b/resources/views/prosespenawaran/js/editextjs.blade.php new file mode 100644 index 0000000..cc9580e --- /dev/null +++ b/resources/views/prosespenawaran/js/editextjs.blade.php @@ -0,0 +1,147 @@ + \ No newline at end of file diff --git a/resources/views/prosespenawaran/js/editjs.blade.php b/resources/views/prosespenawaran/js/editjs.blade.php new file mode 100644 index 0000000..fb460fd --- /dev/null +++ b/resources/views/prosespenawaran/js/editjs.blade.php @@ -0,0 +1,136 @@ +@push('scripts') + @include('lpj::assetsku.includenya') + @include('lpj::prosespenawaran.js.editextjs') + +@endpush \ No newline at end of file diff --git a/resources/views/prosespenawaran/show.blade.php b/resources/views/prosespenawaran/show.blade.php new file mode 100644 index 0000000..1ef200f --- /dev/null +++ b/resources/views/prosespenawaran/show.blade.php @@ -0,0 +1,43 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render(request()->route()->getName()) }} +@endsection +@php + $route = explode('.', Route::currentRouteName()); +@endphp +@section('content') +
+
+
+

+ Detail Data Proses Penawaran +

+ +
+
+
+

+ Nomor Register Permohonan: +

+ + {{ $prosespenawaran->nomor_registrasi }} + +
+
+

+ Kode Penawaran: +

+ + {{ $prosespenawaran->code }} + +
+
+
+
+ + +@endsection diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 80e4d87..37ebef7 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -428,3 +428,19 @@ Breadcrumbs::for('registrasi.show', function (BreadcrumbTrail $trail) { $trail->push('Detail Permohona'); }); // andy add +// andy add 20241009 +Breadcrumbs::for('tender.prosespenawaran', function (BreadcrumbTrail $trail) { + $trail->parent('tender'); + $trail->push('Data Proses Penawaran', route('tender.prosespenawaran.index')); +}); + +Breadcrumbs::for('tender.prosespenawaran.edit', function (BreadcrumbTrail $trail) { + $trail->parent('tender.prosespenawaran'); + $trail->push('Tambah Data Proses Penawaran'); +}); + +Breadcrumbs::for('tender.prosespenawaran.show', function (BreadcrumbTrail $trail) { + $trail->parent('tender.prosespenawaran'); + $trail->push('Detail Data Proses Penawaran'); +}); +// andy add 20241009 diff --git a/routes/registrasi.php b/routes/registrasi.php index 8beb9ae..e57bb56 100644 --- a/routes/registrasi.php +++ b/routes/registrasi.php @@ -1,6 +1,7 @@ group(function () { @@ -21,5 +22,28 @@ Route::middleware(['auth'])->group(function () { }); // andy add + + + Route::name('tender.')->prefix('tender')->group(function () { + + // Proses Penawaran + Route::controller(ProsesPenawaranController::class)->group(function(){ + + Route::get('prosespenawaran', 'index')->name('prosespenawaran.index'); + Route::get('prosespenawaran/datatables', 'dataForDatatables')->name('prosespenawaran.datatables'); + Route::get('prosespenawaran/datatableskjppList_1', 'dataForDatatablesKJPPList_1')->name('prosespenawaran.datatableskjppList_1'); + + // show data + Route::get('/prosespenawaran/{prosespenawaran}', 'show')->name('prosespenawaran.show'); + Route::post('prosespenawaran/setData', 'setData')->name('prosespenawaran.setData'); + + Route::get('prosespenawaran/{prosespenawaran}/edit', 'edit')->name('prosespenawaran.edit'); + + Route::put('/prosespenawaran/{prosespenawaran}', 'update')->name('prosespenawaran.update'); + Route::put('/prosespenawaranAll/{prosespenawaran}', 'updateAll')->name('prosespenawaran.updateAll'); + Route::put('/prosespenawaranStatusKJPP/{prosespenawaran}', 'updateStatusPenawaranKJPP')->name('prosespenawaran.updateStatusPenawaranKJPP'); + + }); + }); });