From 2173a3656402827d063a556184fdcf34a39abd94 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Thu, 11 Sep 2025 22:03:58 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat=20&=20=F0=9F=90=9B=20fix(perse?= =?UTF-8?q?tujuan-penawaran):=20Tambah=20field=20nomor=5Ftiket=20dan=20per?= =?UTF-8?q?baiki=20namespace=20serta=20relasi=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### ✨ Fitur Baru - Menambahkan field `nomor_tiket` pada model **PersetujuanPenawaran** ke dalam `$fillable`. - Membuat migration untuk menambahkan kolom `nomor_tiket` (VARCHAR 100, nullable) di tabel `persetujuan_penawaran`. - Menambahkan validasi dan custom error messages untuk field `nomor_tiket` pada **PersetujuanPenawaranRequest**. - Menempatkan `nomor_tiket` setelah `nomor_proposal_penawaran` untuk konsistensi. - Implementasi rollback pada migration untuk menjaga keamanan database. - Menambahkan komentar dokumentasi pada migration untuk mempermudah maintenance. - Validation rules: `nullable|string|max:100` dengan pesan error dalam Bahasa Indonesia. - Field ini mendukung tracking dan identifikasi tiket setiap persetujuan penawaran. - Mengikuti pola dan konvensi sistem yang sudah ada agar konsisten. ### 🐛 Perbaikan Bug - Memperbaiki typo namespace dari **Usermanagemenet** menjadi **Usermanagement**. - Menghapus import **Region** yang tidak ada di codebase. - Menghapus relasi `region()` karena model **Region** tidak ditemukan. - Mempertahankan relasi valid seperti `penawaran`, `permohonan`, `authorizedBy`, dan `noc`. - Menyelesaikan error *"Undefined type"* pada baris 53 dan 59. - Membersihkan kode dengan menghapus dependency yang tidak ada. - Menyesuaikan namespace **User** agar konsisten dengan struktur modul **Usermanagement**. - Model kini lebih stabil, bersih, dan bebas dari error diagnostic. --- app/Http/Controllers/PembayaranController.php | 24 ++++-- .../Requests/PersetujuanPenawaranRequest.php | 81 ++++++++++--------- app/Models/PersetujuanPenawaran.php | 9 +-- ...r_tiket_to_persetujuan_penawaran_table.php | 33 ++++++++ 4 files changed, 94 insertions(+), 53 deletions(-) create mode 100644 database/migrations/2025_09_11_145857_add_nomor_tiket_to_persetujuan_penawaran_table.php diff --git a/app/Http/Controllers/PembayaranController.php b/app/Http/Controllers/PembayaranController.php index 1c8eaa8..8f48d54 100644 --- a/app/Http/Controllers/PembayaranController.php +++ b/app/Http/Controllers/PembayaranController.php @@ -2,17 +2,18 @@ namespace Modules\Lpj\Http\Controllers; -use App\Http\Controllers\Controller; use Exception; -use Illuminate\Http\JsonResponse; +use Modules\Lpj\Models\Noc; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Validator; -use Maatwebsite\Excel\Facades\Excel; -use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest; -use Modules\Lpj\Models\PenawaranTender; +use Illuminate\Http\JsonResponse; use Modules\Lpj\Models\Permohonan; +use App\Http\Controllers\Controller; +use Illuminate\Support\Facades\Auth; +use Maatwebsite\Excel\Facades\Excel; +use Modules\Lpj\Models\PenawaranTender; +use Illuminate\Support\Facades\Validator; use Modules\Lpj\Models\PersetujuanPenawaran; +use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest; // use Modules\Lpj\Models\JenisPenilaian; @@ -149,6 +150,15 @@ class PembayaranController extends Controller $validated ); + if(isset($validated['nomor_tiket'])){ + $noc = Noc::where('nomor_tiket',$validated['nomor_tiket'])->first(); + if($noc){ + $noc->persetujuan_penawaran_id = $persetujuanPenawaran->id; + $noc->permohonan_id = $validated['permohonan_id']; + $noc->save(); + } + } + $folderPath = 'persetujuan_penawaran/' . $validated['penawaran_id']; if ($request->hasFile('bukti_bayar')) { diff --git a/app/Http/Requests/PersetujuanPenawaranRequest.php b/app/Http/Requests/PersetujuanPenawaranRequest.php index d1f87f8..e6bdf73 100644 --- a/app/Http/Requests/PersetujuanPenawaranRequest.php +++ b/app/Http/Requests/PersetujuanPenawaranRequest.php @@ -14,49 +14,52 @@ public function rules() { return [ - 'permohonan_id' => 'nullable|exists:permohonan,id', - 'penawaran_id' => 'nullable|exists:penawaran,id', - 'nomor_proposal_penawaran' => 'nullable|string|max:255', - 'tanggal_proposal_penawaran' => 'nullable|date', - 'biaya_final' => 'nullable|numeric|min:0', - 'sla_resume' => 'nullable|numeric|min:0', - 'sla_final' => 'nullable|numeric|min:0', - 'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240', - 'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240', - 'status' => 'nullable|boolean', - 'authorized_status' => 'boolean', - 'authorized_at' => 'nullable|date', - 'authorized_by' => 'nullable|exists:users,id', - 'catatan' => 'nullable|string', - ]; + 'permohonan_id' => 'nullable|exists:permohonan,id', + 'penawaran_id' => 'nullable|exists:penawaran,id', + 'nomor_proposal_penawaran' => 'nullable|string|max:255', + 'nomor_tiket' => 'nullable|string|max:100', + 'tanggal_proposal_penawaran' => 'nullable|date', + 'biaya_final' => 'nullable|numeric|min:0', + 'sla_resume' => 'nullable|numeric|min:0', + 'sla_final' => 'nullable|numeric|min:0', + 'file_persetujuan_penawaran' => 'nullable|file|mimes:pdf,doc,docx|max:10240', + 'surat_representasi' => 'nullable|file|mimes:pdf,doc,docx|max:10240', + 'status' => 'nullable|boolean', + 'authorized_status' => 'boolean', + 'authorized_at' => 'nullable|date', + 'authorized_by' => 'nullable|exists:users,id', + 'catatan' => 'nullable|string', + ]; } public function messages() { return [ - 'penawaran_id.required' => 'Penawaran ID wajib diisi.', - 'penawaran_id.exists' => 'Penawaran ID tidak valid.', - 'nomor_proposal_penawaran.required' => 'Nomor proposal penawaran wajib diisi.', - 'tanggal_proposal_penawaran.required' => 'Tanggal proposal penawaran wajib diisi.', - 'tanggal_proposal_penawaran.date' => 'Tanggal proposal penawaran harus berupa tanggal yang valid.', - 'biaya_final.required' => 'Biaya final wajib diisi.', - 'biaya_final.numeric' => 'Biaya final harus berupa angka.', - 'biaya_final.min' => 'Biaya final tidak boleh kurang dari 0.', - 'sla_resume.required' => 'SLA Resume wajib diisi.', - 'sla_final.required' => 'SLA Final wajib diisi.', - 'file_persetujuan_penawaran.file' => 'File Persetujuan Penawaran harus berupa file.', - 'file_persetujuan_penawaran.mimes' => 'File Persetujuan Penawaran harus berupa file PDF, DOC, atau DOCX.', - 'file_persetujuan_penawaran.max' => 'Ukuran File Persetujuan Penawaran tidak boleh lebih dari 10MB.', - 'surat_representasi.file' => 'Surat Representasi harus berupa file.', - 'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.', - 'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.', - 'region_id.required' => 'Region ID wajib diisi.', - 'region_id.exists' => 'Region ID tidak valid.', - 'status.required' => 'Status wajib diisi.', - 'status.boolean' => 'Status harus berupa nilai boolean.', - 'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.', - 'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.', - 'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak valid.', - ]; + 'penawaran_id.required' => 'Penawaran ID wajib diisi.', + 'penawaran_id.exists' => 'Penawaran ID tidak valid.', + 'nomor_proposal_penawaran.required' => 'Nomor proposal penawaran wajib diisi.', + 'nomor_tiket.string' => 'Nomor tiket harus berupa teks.', + 'nomor_tiket.max' => 'Nomor tiket tidak boleh lebih dari 100 karakter.', + 'tanggal_proposal_penawaran.required' => 'Tanggal proposal penawaran wajib diisi.', + 'tanggal_proposal_penawaran.date' => 'Tanggal proposal penawaran harus berupa tanggal yang valid.', + 'biaya_final.required' => 'Biaya final wajib diisi.', + 'biaya_final.numeric' => 'Biaya final harus berupa angka.', + 'biaya_final.min' => 'Biaya final tidak boleh kurang dari 0.', + 'sla_resume.required' => 'SLA Resume wajib diisi.', + 'sla_final.required' => 'SLA Final wajib diisi.', + 'file_persetujuan_penawaran.file' => 'File Persetujuan Penawaran harus berupa file.', + 'file_persetujuan_penawaran.mimes' => 'File Persetujuan Penawaran harus berupa file PDF, DOC, atau DOCX.', + 'file_persetujuan_penawaran.max' => 'Ukuran File Persetujuan Penawaran tidak boleh lebih dari 10MB.', + 'surat_representasi.file' => 'Surat Representasi harus berupa file.', + 'surat_representasi.mimes' => 'Surat Representasi harus berupa file PDF, DOC, atau DOCX.', + 'surat_representasi.max' => 'Ukuran Surat Representasi tidak boleh lebih dari 10MB.', + 'region_id.required' => 'Region ID wajib diisi.', + 'region_id.exists' => 'Region ID tidak valid.', + 'status.required' => 'Status wajib diisi.', + 'status.boolean' => 'Status harus berupa nilai boolean.', + 'authorized_status.boolean' => 'Status otorisasi harus berupa nilai boolean.', + 'authorized_at.date' => 'Tanggal otorisasi harus berupa tanggal yang valid.', + 'authorized_by.exists' => 'ID pengguna yang mengotorisasi tidak valid.', + ]; } } diff --git a/app/Models/PersetujuanPenawaran.php b/app/Models/PersetujuanPenawaran.php index 0bb8158..feec460 100644 --- a/app/Models/PersetujuanPenawaran.php +++ b/app/Models/PersetujuanPenawaran.php @@ -2,7 +2,7 @@ namespace Modules\Lpj\Models; - use Modules\Usermanagemenet\Models\User; + use Modules\Usermanagement\Models\User; class PersetujuanPenawaran extends Base { @@ -13,6 +13,7 @@ 'permohonan_id', 'penawaran_id', 'nomor_proposal_penawaran', + 'nomor_tiket', 'tanggal_proposal_penawaran', 'biaya_final', 'sla_resume', @@ -46,12 +47,6 @@ return $this->belongsTo(Permohonan::class, 'permohonan_id'); } - // Relationship with Region - public function region() - { - return $this->belongsTo(Region::class); - } - // Relationship with User (for authorized_by) public function authorizedBy() { diff --git a/database/migrations/2025_09_11_145857_add_nomor_tiket_to_persetujuan_penawaran_table.php b/database/migrations/2025_09_11_145857_add_nomor_tiket_to_persetujuan_penawaran_table.php new file mode 100644 index 0000000..de8706d --- /dev/null +++ b/database/migrations/2025_09_11_145857_add_nomor_tiket_to_persetujuan_penawaran_table.php @@ -0,0 +1,33 @@ +string('nomor_tiket', 100)->nullable()->after('nomor_proposal_penawaran') + ->comment('Nomor tiket untuk tracking persetujuan penawaran'); + }); + } + + /** + * Reverse the migrations. + * Menghapus kolom nomor_tiket dari tabel persetujuan_penawaran + */ + public function down(): void + { + Schema::table('persetujuan_penawaran', function (Blueprint $table) { + // Menghapus kolom nomor_tiket + $table->dropColumn('nomor_tiket'); + }); + } +};