From 617e6541fa34f8bff79130c59d2ca35ce1afa2a0 Mon Sep 17 00:00:00 2001 From: Andy Chaerudin Date: Wed, 23 Oct 2024 14:25:53 +0700 Subject: [PATCH] add feature Proses Penawaran Ulang --- app/Helpers/Lpj.php | 12 + .../Controllers/ProsesPenawaranController.php | 1 - .../ProsesPenawaranUlangController.php | 373 ++++++++++++++++++ app/Models/PenawaranDetailTenderLog.php | 30 ++ ...204_create_detail_penawaran_logs_table.php | 41 ++ module.json | 8 + .../views/prosespenawaranulang/edit.blade.php | 92 +++++ .../prosespenawaranulang/index.blade.php | 152 +++++++ .../js/editextjs.blade.php | 152 +++++++ .../prosespenawaranulang/js/editjs.blade.php | 112 ++++++ .../views/prosespenawaranulang/show.blade.php | 43 ++ routes/breadcrumbs.php | 15 + routes/registrasi.php | 18 + 13 files changed, 1048 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/ProsesPenawaranUlangController.php create mode 100644 app/Models/PenawaranDetailTenderLog.php create mode 100644 database/migrations/2024_10_15_101204_create_detail_penawaran_logs_table.php create mode 100644 resources/views/prosespenawaranulang/edit.blade.php create mode 100644 resources/views/prosespenawaranulang/index.blade.php create mode 100644 resources/views/prosespenawaranulang/js/editextjs.blade.php create mode 100644 resources/views/prosespenawaranulang/js/editjs.blade.php create mode 100644 resources/views/prosespenawaranulang/show.blade.php diff --git a/app/Helpers/Lpj.php b/app/Helpers/Lpj.php index c49398e..c51457b 100644 --- a/app/Helpers/Lpj.php +++ b/app/Helpers/Lpj.php @@ -94,5 +94,17 @@ function checkKelengkapanDetailKJPP($id) return $allow; } + +// convert +function convertSlug($slug) { + + $words = explode('-', $slug); + + foreach ($words as $index => $word) { + $words[$index] = strtoupper($word); + } + + return implode(' ', $words); +} // andy add diff --git a/app/Http/Controllers/ProsesPenawaranController.php b/app/Http/Controllers/ProsesPenawaranController.php index 243fb9d..a37669b 100644 --- a/app/Http/Controllers/ProsesPenawaranController.php +++ b/app/Http/Controllers/ProsesPenawaranController.php @@ -313,7 +313,6 @@ class ProsesPenawaranController extends Controller public function updateKJPPStatus(Request $request, $id): JsonResponse { - // dd('updateKJPPStatus'); // init $data = array(); $dataDetailPenawaran = array(); diff --git a/app/Http/Controllers/ProsesPenawaranUlangController.php b/app/Http/Controllers/ProsesPenawaranUlangController.php new file mode 100644 index 0000000..4cf278d --- /dev/null +++ b/app/Http/Controllers/ProsesPenawaranUlangController.php @@ -0,0 +1,373 @@ +user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query =PenawaranTender::query() + ->select('penawaran.*',DB::raw("CONCAT(DATE_FORMAT(penawaran.start_date, '%d %M %Y'), ' - ', DATE_FORMAT(penawaran.end_date, '%d %M %Y')) AS date_range"), 'tujuan_penilaian_kjpp.name as tujuan_penilaian_kjpp_name') + ->leftJoin('tujuan_penilaian_kjpp', 'tujuan_penilaian_kjpp.id','=','penawaran.tujuan_penilaian_kjpp_id') + ->where('penawaran.status','=','persetujuan-penawaran') + ->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::prosespenawaranulang.edit', compact('id')); + } + + public function show($id) + { + $prosespenawaran = PenawaranTender::find($id); + return view('lpj::prosespenawaranulang.show', compact('id','prosespenawaran')); + } + + public function setData(Request $request): JsonResponse + { + $data = array(); + $penawaran = array(); + $penawrandetails = array(); + + if (request()->ajax()) { + $id = $request->id; + $penawaran = PenawaranTender::where('status','=','persetujuan-penawaran')->find($id); + + if ($penawaran) { + $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(); + + $i=0; + foreach($penawrandetails as $obj) + { + 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++; + } + + $penawaranString = ""; + if($penawaran->status) + { + $penawaranString = convertSlug($penawaran->status); + $penawaran->status = $penawaranString; + } + + $data['penawaran'] = $penawaran; + $data['penawrandetails'] = $penawrandetails; + $data['status'] = 'success'; + $data['message'] ['message_success'] = array("data successfully found"); + } else { + $data['status'] = 'error'; + $data['penawaran'] = null; + $data['penawrandetails'] = null; + $data['message'] ['message_data'] = array("data not found"); + } + } else { + $data['status'] = 'error'; + $data['message'] ['message_ajax'] = array("no ajax request"); + } + + return response()->json($data); + } + + public function update(Request $request, $id): JsonResponse + { + // init + $data = array(); + $dataDetailPenawaranLog = array(); + $dataDetailPenawaran = array(); + $pleaseCommit= true; + if (request()->ajax()) { + $validator = ProsesPenawaranUlangController::rulesEditnya($request, $id); + + if ($validator['fails']) { + $data['message'] = $validator['errors']; + $data['status'] = 'error'; + } + else + { + // cek masa aktif penawaran + $detailpenawaran = PenawaranDetailTender::find($id); + $checkActiveDateRange = checkActiveDateRangePenawaran($detailpenawaran->penawaran_id); + // cek masa aktif penawaran + if($checkActiveDateRange) + { + DB::beginTransaction(); + try { + + $dataDetailPenawaranLog = [ + 'detail_penawaran_id' =>$detailpenawaran->id, + 'kjpp_rekanan_id' =>$detailpenawaran->kjpp_rekanan_id, + 'penawaran_id' =>$detailpenawaran->penawaran_id, + 'biaya_penawaran' =>$detailpenawaran->biaya_penawaran, + 'attachment' =>$detailpenawaran->attachment, + 'dokumen_persetujuan' =>$detailpenawaran->dokumen_persetujuan, + 'status' =>$detailpenawaran->status, + 'authorized_status' =>$detailpenawaran->authorized_status, + 'authorized_at' =>$detailpenawaran->authorized_at, + 'authorized_at' =>$detailpenawaran->authorized_at, + 'created_at' =>$detailpenawaran->created_at, + 'updated_at' =>$detailpenawaran->updated_at, + 'deleted_at' =>$detailpenawaran->deleted_at, + 'created_by' =>$detailpenawaran->created_by, + 'updated_by' =>$detailpenawaran->updated_by, + 'deleted_by' =>$detailpenawaran->deleted_by + + ]; + + PenawaranDetailTenderLog::create($dataDetailPenawaranLog); + + $biaya_penawaran=""; + if($request->biaya_penawaran) + $biaya_penawaran= str_replace(".","",$request->biaya_penawaran); + $dataDetailPenawaran = ['updated_by' => Auth::id(), + 'updated_at' => now(), + 'biaya_penawaran' => $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; + $dataDetailPenawaran['attachment'] = $myFile; + $dataDetailPenawaran['dokumen_persetujuan'] = $newFileNameWithPath; + } + else + { + $pleaseCommit=false; + $data['status'] = 'error'; + $data['message'] ['check_file_jenis'] = array("Silahkan upload file pdf"); + } + } + else + { + $data['status'] = 'error'; + $data['message'] ['check_file'] = array("Silahkan upload file"); + + } + + $detailpenawaran->update($dataDetailPenawaran); + + if($pleaseCommit) + { + DB::commit(); + + $data['id'] = $id; + $data['detailpenawaran'] = $detailpenawaran; + $data['status'] = 'success'; + $data['message'] ['message_success'] = array('Proses Penawarn KJPP Ulang successfully'); + } + else + { + DB::rollBack(); + $data['status'] = 'error'; + $data['message'] ['message_error'] = array("Proses Penawarn KJPP Ulang failed.."); + } + + } catch (Exception $e) { + DB::rollBack(); + $data['status'] = 'error'; + $data['message'] ['message_error_try_catch'] = array('Proses Penawarn KJPP Ulang failed.'); + } + } + else + { + $data['status'] = 'error'; + $data['message'] ['active_date_range'] = array("Penawaran sudah di tutup"); + } + + } + + } else { + $data['status'] = 'error'; + $data['message'] ['message_ajax'] = array("no ajax request"); + } + + return response()->json($data); + } + + // delete KJPP di detail_penawaran (status di buat 0) + public function updateKJPPStatus(Request $request, $id): JsonResponse + { + // init + $data = array(); + $dataku = array(); + $dataDetailPenawaranLog = array(); + + DB::beginTransaction(); + try { + $model = PenawaranDetailTender::findOrFail($id); + + // log + $dataDetailPenawaranLog = [ + 'detail_penawaran_id' =>$model->id, + 'kjpp_rekanan_id' =>$model->kjpp_rekanan_id, + 'penawaran_id' =>$model->penawaran_id, + 'biaya_penawaran' =>$model->biaya_penawaran, + 'attachment' =>$model->attachment, + 'dokumen_persetujuan' =>$model->dokumen_persetujuan, + 'status' =>0, + 'authorized_status' =>$model->authorized_status, + 'authorized_at' =>$model->authorized_at, + 'authorized_at' =>$model->authorized_at, + 'created_at' =>$model->created_at, + 'updated_at' =>$model->updated_at, + 'deleted_at' =>$model->deleted_at, + 'created_by' =>$model->created_by, + 'updated_by' =>$model->updated_by, + 'deleted_by' =>$model->deleted_by + + ]; + + PenawaranDetailTenderLog::create($dataDetailPenawaranLog); + // log + + $data['id']=$id; + + $dataku = ['status' => '0', + 'updated_by' => Auth::id(), + 'updated_at' => now() + ]; + + $model->update($dataku); + + DB::commit(); + $data['status'] = 'success'; + $data['message'] ['message_success'] = array('Sukses delete Penawaran KJPP '.$request->kjppName); + } catch (Exception $e) { + DB::rollBack(); + // dd($e); + $data['status'] = 'error'; + $data['message'] ['message_error_try_catch'] = array("Gagal delete Penawaran KJPP ".$request->kjppName); + } + 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; + } + +} diff --git a/app/Models/PenawaranDetailTenderLog.php b/app/Models/PenawaranDetailTenderLog.php new file mode 100644 index 0000000..d29ff58 --- /dev/null +++ b/app/Models/PenawaranDetailTenderLog.php @@ -0,0 +1,30 @@ +belongsTo(PenawaranTender::class, 'penawaran_id', 'id'); + } + + public function penawarandetail(): BelongsTo + { + return $this->belongsTo(PenawaranDetailTender::class, 'detail_penawaran_id', 'id'); + } +} diff --git a/database/migrations/2024_10_15_101204_create_detail_penawaran_logs_table.php b/database/migrations/2024_10_15_101204_create_detail_penawaran_logs_table.php new file mode 100644 index 0000000..730a0b1 --- /dev/null +++ b/database/migrations/2024_10_15_101204_create_detail_penawaran_logs_table.php @@ -0,0 +1,41 @@ +id(); + $table->unsignedBigInteger('detail_penawaran_id')->nullable(); + $table->unsignedBigInteger('kjpp_rekanan_id')->nullable(); + $table->unsignedBigInteger('penawaran_id')->nullable(); + $table->string('biaya_penawaran')->nullable(); + $table->string('attachment')->nullable(); + $table->string('dokumen_persetujuan')->nullable(); + $table->boolean('status')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->timestamp('authorized_at')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + $table->timestamps(); + $table->timestamp('deleted_at')->nullable(); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('detail_penawaran_logs'); + } +}; diff --git a/module.json b/module.json index 7977c0c..0390201 100644 --- a/module.json +++ b/module.json @@ -61,6 +61,14 @@ "attributes": [], "permission": "", "roles": ["administrator", "admin"] + }, + { + "title": "Data Proses Penawaran Ulang", + "path": "tender.prosespenawaranulang", + "classes": "", + "attributes": [], + "permission": "", + "roles": ["administrator", "admin"] } ] }, diff --git a/resources/views/prosespenawaranulang/edit.blade.php b/resources/views/prosespenawaranulang/edit.blade.php new file mode 100644 index 0000000..79e5e79 --- /dev/null +++ b/resources/views/prosespenawaranulang/edit.blade.php @@ -0,0 +1,92 @@ +@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 Ulang +

+ +
+
+
+

+ Nomor Register Permohonan: +

+ + + +
+ +
+

+ Kode Penawaran: +

+ + + +
+ +
+

+ Status Penawaran: +

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

Data KJPP

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

+ Daftar Proses Penawaran Ulang +

+
+
+ +
+ +
+
+
+
+ + + + + + + + + + + + + +
+ + + Nomor Registrasi + + + Kode Penawaran + + + Tanggal Penawaran + + + Tujuan Penilaian + + + Total KJPP + + + Status + + Action
+
+ +
+
+
+@endsection + +@push('scripts') + + +@endpush diff --git a/resources/views/prosespenawaranulang/js/editextjs.blade.php b/resources/views/prosespenawaranulang/js/editextjs.blade.php new file mode 100644 index 0000000..1e17943 --- /dev/null +++ b/resources/views/prosespenawaranulang/js/editextjs.blade.php @@ -0,0 +1,152 @@ + \ No newline at end of file diff --git a/resources/views/prosespenawaranulang/js/editjs.blade.php b/resources/views/prosespenawaranulang/js/editjs.blade.php new file mode 100644 index 0000000..7d8d9da --- /dev/null +++ b/resources/views/prosespenawaranulang/js/editjs.blade.php @@ -0,0 +1,112 @@ +@push('scripts') + @include('lpj::assetsku.includenya') + @include('lpj::prosespenawaranulang.js.editextjs') + +@endpush \ No newline at end of file diff --git a/resources/views/prosespenawaranulang/show.blade.php b/resources/views/prosespenawaranulang/show.blade.php new file mode 100644 index 0000000..74a361e --- /dev/null +++ b/resources/views/prosespenawaranulang/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 Ulang +

+ +
+
+
+

+ Nomor Register Permohonan: +

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

+ Kode Penawaran: +

+ + {{ $prosespenawaran->code }} + +
+
+
+
+ + +@endsection diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 8e753e1..5ae30ec 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -482,7 +482,22 @@ Breadcrumbs::for('tender.prosespenawaran.show', function (BreadcrumbTrail $trail $trail->push('Detail Data Proses Penawaran'); }); // andy add 20241009 +// andy add Proses Penawaran Ulang +Breadcrumbs::for('tender.prosespenawaranulang', function (BreadcrumbTrail $trail) { + $trail->parent('tender'); + $trail->push('Data Proses Penawaran Ulang', route('tender.prosespenawaranulang.index')); +}); +Breadcrumbs::for('tender.prosespenawaranulang.edit', function (BreadcrumbTrail $trail) { + $trail->parent('tender.prosespenawaranulang'); + $trail->push('Tambah Data Proses Penawaran Ulang'); +}); + +Breadcrumbs::for('tender.prosespenawaranulang.show', function (BreadcrumbTrail $trail) { + $trail->parent('tender.prosespenawaranulang'); + $trail->push('Detail Data Proses Penawaran Ulang'); +}); +// andy add Proses Penawaran Ulang Breadcrumbs::for('otorisator.pelaporan.index', function (BreadcrumbTrail $trail) { diff --git a/routes/registrasi.php b/routes/registrasi.php index 311da52..dd14aa5 100644 --- a/routes/registrasi.php +++ b/routes/registrasi.php @@ -2,6 +2,7 @@ use Modules\Lpj\Http\Controllers\RegistrasiController; use Modules\Lpj\Http\Controllers\ProsesPenawaranController; +use Modules\Lpj\Http\Controllers\ProsesPenawaranUlangController; Route::middleware(['auth'])->group(function () { @@ -47,6 +48,23 @@ Route::middleware(['auth'])->group(function () { Route::put('/prosespenawaranKJPPStatus/{prosespenawaranKJPPStatus}', 'updateKJPPStatus')->name('prosespenawaran.updateKJPPStatus'); }); + + // Proses Penawaran Ulang + Route::controller(ProsesPenawaranUlangController::class)->group(function(){ + Route::get('prosespenawaranulang', 'index')->name('prosespenawaranulang.index'); + Route::get('prosespenawaranulang/datatables', 'dataForDatatables')->name('prosespenawaranulang.datatables'); + Route::get('prosespenawaranulang/{prosespenawaranulang}/edit', 'edit')->name('prosespenawaranulang.edit'); + + // show data + Route::get('/prosespenawaranulang/{prosespenawaranulang}', 'show')->name('prosespenawaranulang.show'); + Route::post('prosespenawaranulang/setData', 'setData')->name('prosespenawaranulang.setData'); + + // update KJPP data, detail penawaran + Route::put('/prosespenawaranulang/{prosespenawaranulang}', 'update')->name('prosespenawaranulang.update'); + // delete KJPP, status set = 0 + Route::put('/prosespenawaranulangKJPPStatus/{prosespenawaranulangKJPPStatus}', 'updateKJPPStatus')->name('prosespenawaranulang.updateKJPPStatus'); + + }); }); });