diff --git a/app/Http/Controllers/NocController.php b/app/Http/Controllers/NocController.php index 3186d82..d7fb9ce 100644 --- a/app/Http/Controllers/NocController.php +++ b/app/Http/Controllers/NocController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Modules\Lpj\Http\Requests\NocRequest; + use Modules\Lpj\Models\Noc; use Modules\Lpj\Models\PenawaranTender; use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\PersetujuanPenawaran; @@ -43,26 +44,34 @@ $status = "persetujuan-penawaran"; } - $persetujuanPenawaran = PersetujuanPenawaran::updateOrCreate( - ['penawaran_id' => $validated['penawaran_id']], - $validated, + + $dataNoc = [ + 'nominal_bayar' => $validated['nominal_bayar'], + 'tanggal_pembayaran' => date('Y-m-d'), + 'status_bayar' => $validated['nominal_bayar'] < $validated['total_harus_bayar'] ? false : true, + 'catatan_noc' => $validated['catatan_noc'], + ]; + $noc = Noc::updateOrCreate( + [ + 'permohonan_id' => $validated['permohonan_id'], + 'persetujuan_penawaran_id' => $validated['persetujuan_penawaran_id'] + ],$dataNoc ); - $folderPath = 'noc/' . $validated['penawaran_id']; + $folderPath = 'noc/' . request()->get('penawaran_id'); if ($request->hasFile('bukti_ksl')) { - $persetujuanPenawaran->bukti_ksl = $request->file('bukti_ksl')->store( + $noc->bukti_ksl = $request->file('bukti_ksl')->store( $folderPath, 'public', ); } - - $persetujuanPenawaran->save(); + $noc->save(); // Update the status of the related permohonan to 'spk' $permohonan = Permohonan::find(request()->get('permohonan_id')); if ($permohonan) { - $permohonan->status_bayar = request()->get('status_bayar'); + $permohonan->status_bayar = request()->get('status_pembayar'); if ($permohonan->jenis_penilaian_id == 2) { $permohonan->status = $status; } @@ -116,9 +125,7 @@ */ public function edit($id) { - $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->with( - ['penawaran.detail', 'penawaran.permohonan.debiture', 'permohonan'], - )->first(); + $persetujuanPenawaran = PersetujuanPenawaran::where('id', $id)->first(); return view('lpj::noc.form', compact('persetujuanPenawaran')); } @@ -181,13 +188,23 @@ 'nomor_registrasi' => $persetujuanPenawaran->permohonan->nomor_registrasi ?? $persetujuanPenawaran->penawaran->nomor_registrasi, 'nama_debitur' => $persetujuanPenawaran->permohonan->debiture->name ?? $persetujuanPenawaran->penawaran->permohonan->debiture->name, 'cabang' => $persetujuanPenawaran->permohonan->branch->name ?? $persetujuanPenawaran->penawaran->permohonan->branch->name, - 'tanggal_setor' => dateFormat($persetujuanPenawaran->moc->created_at ?? $persetujuanPenawaran->created_at, true), - 'nominal_bayar' => currencyFormat($persetujuanPenawaran->noc->nominal_bayar ?? $persetujuanPenawaran->nominal_bayar ?? 0), + 'tanggal_setor' => dateFormat( + $persetujuanPenawaran->moc->created_at ?? $persetujuanPenawaran->created_at, + true, + ), + 'nominal_bayar' => currencyFormat( + $persetujuanPenawaran->noc->nominal_bayar ?? $persetujuanPenawaran->nominal_bayar ?? 0, + ), 'bukti_ksl' => $persetujuanPenawaran->noc->bukti_ksl ?? $persetujuanPenawaran->bukti_ksl ?? null, 'memo_penyelesaian' => $persetujuanPenawaran->noc->memo_penyelesaian ?? $persetujuanPenawaran->memo_penyelesaian ?? null, - 'nominal_penyelesaian' => currencyFormat($persetujuanPenawaran->noc->nominal_penyelesaian ?? $persetujuanPenawaran->nominal_penyelesaian ?? 0), + 'nominal_penyelesaian' => currencyFormat( + $persetujuanPenawaran->noc->nominal_penyelesaian ?? $persetujuanPenawaran->nominal_penyelesaian ?? 0, + ), 'bukti_penyelesaian' => $persetujuanPenawaran->noc->bukti_penyelesaian ?? $persetujuanPenawaran->bukti_penyelesaian ?? null, - 'tanggal_penyelesaian' => dateFormat($persetujuanPenawaran->noc->tanggal_penyelesaian ?? $persetujuanPenawaran->updated_at, true), + 'tanggal_penyelesaian' => dateFormat( + $persetujuanPenawaran->noc->tanggal_penyelesaian ?? $persetujuanPenawaran->updated_at, + true, + ), ]; }); diff --git a/app/Http/Controllers/PersetujuanPenawaranController.php b/app/Http/Controllers/PersetujuanPenawaranController.php index 1486fbe..3838167 100644 --- a/app/Http/Controllers/PersetujuanPenawaranController.php +++ b/app/Http/Controllers/PersetujuanPenawaranController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Modules\Lpj\Http\Requests\PersetujuanPenawaranRequest; + use Modules\Lpj\Models\Noc; use Modules\Lpj\Models\PenawaranDetailTender; use Modules\Lpj\Models\PenawaranDetailTenderLog; use Modules\Lpj\Models\PenawaranTender; @@ -67,6 +68,22 @@ $persetujuanPenawaran->save(); + + // Save NOC + try { + $noc = Noc::updateOrCreate([ + 'permohonan_id' => $persetujuanPenawaran->permohonan_id, + 'persetujuan_penawaran_id' => $persetujuanPenawaran->id + ],[ + 'bukti_bayar' => $persetujuanPenawaran->bukti_bayar, + ]); + } catch (\Exception $e) { + \Log::error('Failed to create or update NOC: ' . $e->getMessage()); + return redirect() + ->route('persetujuan-penawaran.index') + ->with('error', 'Persetujuan Penawaran berhasil disimpan tetapi gagal membuat NOC: ' . $e->getMessage()); + } + return redirect() ->route('persetujuan-penawaran.index')->with('success', 'Persetujuan Penawaran berhasil disimpan.'); } diff --git a/app/Http/Requests/NocRequest.php b/app/Http/Requests/NocRequest.php index 0cb7e66..13b76af 100644 --- a/app/Http/Requests/NocRequest.php +++ b/app/Http/Requests/NocRequest.php @@ -4,20 +4,150 @@ use Illuminate\Foundation\Http\FormRequest; + /** + * Form Request untuk validasi data NOC (Notice of Completion) + */ class NocRequest extends FormRequest { + /** + * Konstanta untuk jenis file yang diizinkan + */ + private const ALLOWED_FILE_TYPES = 'pdf,jpg,jpeg,png'; + + /** + * Konstanta untuk ukuran file maksimum (dalam KB) + */ + private const MAX_FILE_SIZE = 10240; + + /** + * Menentukan apakah pengguna berwenang untuk melakukan request ini + * + * @return bool + */ public function authorize() { return true; } + /** + * Mengumpulkan semua aturan validasi + * + * @return array + */ public function rules() + { + return array_merge( + $this->getBasicInfoRules(), + $this->getPaymentRules(), + $this->getSettlementRules(), + $this->getAuthorizationRules(), + ); + } + + /** + * Aturan validasi untuk informasi dasar + * + * @return array + */ + private function getBasicInfoRules() { return [ - 'penawaran_id' => 'nullable|exists:penawaran,id', - 'nominal_bayar' => 'nullable|numeric|min:0', - 'bukti_ksl' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240', - 'status' => 'nullable|boolean', + 'permohonan_id' => 'required|exists:permohonan,id', + 'persetujuan_penawaran_id' => 'required|exists:persetujuan_penawaran,id', + 'status' => 'nullable|boolean', + 'created_by' => 'nullable|exists:users,id', + 'updated_by' => 'nullable|exists:users,id', + ]; + } + + /** + * Aturan validasi untuk data pembayaran + * + * @return array + */ + private function getPaymentRules() + { + $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE; + + return [ + 'total_harus_bayar' => 'nullable|numeric|min:0', + 'nominal_bayar' => 'nullable|numeric|min:0', + 'bukti_ksl' => $fileRule, + 'bukti_bayar' => $fileRule, + 'status_bayar' => 'nullable|boolean', + 'tanggal_pembayaran' => 'nullable|date', + ]; + } + + /** + * Aturan validasi untuk data penyelesaian + * + * @return array + */ + private function getSettlementRules() + { + $fileRule = 'nullable|file|mimes:' . self::ALLOWED_FILE_TYPES . '|max:' . self::MAX_FILE_SIZE; + + return [ + 'nominal_penyelesaian' => 'nullable|numeric|min:0', + 'status_penyelesaian' => 'nullable|boolean', + 'tanggal_penyelesaian' => 'nullable|date', + 'bukti_penyelesaian' => $fileRule, + 'memo_penyelesaian' => $fileRule, + 'catatan_noc' => 'nullable|string', + ]; + } + + /** + * Aturan validasi untuk otorisasi + * + * @return array + */ + private function getAuthorizationRules() + { + return [ + 'authorized_status' => 'nullable|boolean', + 'authorized_at' => 'nullable|date', + 'authorized_by' => 'nullable|exists:users,id', + ]; + } + + /** + * Pesan khusus untuk validasi + * + * @return array + */ + public function messages() + { + return [ + 'permohonan_id.required' => 'ID Permohonan harus diisi', + 'permohonan_id.exists' => 'ID Permohonan tidak valid', + 'persetujuan_penawaran_id.required' => 'ID Persetujuan Penawaran harus diisi', + 'persetujuan_penawaran_id.exists' => 'ID Persetujuan Penawaran tidak valid', + 'nominal_bayar.numeric' => 'Nominal Bayar harus berupa angka', + 'nominal_bayar.min' => 'Nominal Bayar minimal 0', + 'bukti_ksl.file' => 'Bukti KSL harus berupa file', + 'bukti_ksl.mimes' => 'Bukti KSL harus berformat pdf, jpg, jpeg, atau png', + 'bukti_ksl.max' => 'Ukuran Bukti KSL maksimal 10MB', + 'bukti_bayar.file' => 'Bukti Bayar harus berupa file', + 'bukti_bayar.mimes' => 'Bukti Bayar harus berformat pdf, jpg, jpeg, atau png', + 'bukti_bayar.max' => 'Ukuran Bukti Bayar maksimal 10MB', + 'status.boolean' => 'Status harus berupa boolean', + 'status_bayar.boolean' => 'Status Bayar harus berupa boolean', + 'tanggal_pembayaran.date' => 'Format Tanggal Pembayaran tidak valid', + 'nominal_penyelesaian.numeric' => 'Nominal Penyelesaian harus berupa angka', + 'nominal_penyelesaian.min' => 'Nominal Penyelesaian minimal 0', + 'status_penyelesaian.boolean' => 'Status Penyelesaian harus berupa boolean', + 'tanggal_penyelesaian.date' => 'Format Tanggal Penyelesaian tidak valid', + 'bukti_penyelesaian.file' => 'Bukti Penyelesaian harus berupa file', + 'bukti_penyelesaian.mimes' => 'Bukti Penyelesaian harus berformat pdf, jpg, jpeg, atau png', + 'bukti_penyelesaian.max' => 'Ukuran Bukti Penyelesaian maksimal 10MB', + 'memo_penyelesaian.file' => 'Memo Penyelesaian harus berupa file', + 'memo_penyelesaian.mimes' => 'Memo Penyelesaian harus berformat pdf, jpg, jpeg, atau png', + 'memo_penyelesaian.max' => 'Ukuran Memo Penyelesaian maksimal 10MB', + 'authorized_status.boolean' => 'Status Otorisasi harus berupa boolean', + 'authorized_at.date' => 'Format Tanggal Otorisasi tidak valid', + 'authorized_by.exists' => 'User Otorisasi tidak valid', ]; } } diff --git a/app/Http/Requests/PersetujuanPenawaranRequest.php b/app/Http/Requests/PersetujuanPenawaranRequest.php index 8d04940..d1f87f8 100644 --- a/app/Http/Requests/PersetujuanPenawaranRequest.php +++ b/app/Http/Requests/PersetujuanPenawaranRequest.php @@ -23,8 +23,6 @@ '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', - 'bukti_bayar' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:10240', - 'nominal_bayar' => 'nullable|numeric|min:0', 'status' => 'nullable|boolean', 'authorized_status' => 'boolean', 'authorized_at' => 'nullable|date', @@ -52,9 +50,6 @@ '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.', - 'bukti_bayar.file' => 'Bukti Bayar harus berupa file.', - 'bukti_bayar.mimes' => 'Bukti Bayar harus berupa file PDF, JPG, JPEG, atau PNG.', - 'bukti_bayar.max' => 'Ukuran Bukti Bayar tidak boleh lebih dari 10MB.', 'region_id.required' => 'Region ID wajib diisi.', 'region_id.exists' => 'Region ID tidak valid.', 'status.required' => 'Status wajib diisi.', @@ -62,8 +57,6 @@ '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.', - 'status_bayar.required' => 'Status bayar wajib diisi.', - 'status_bayar.in' => 'Status bayar harus berupa "sudah_bayar", "belum_bayar" atau "tidak bayar".', ]; } } diff --git a/app/Models/Noc.php b/app/Models/Noc.php index a9104fd..16a0342 100644 --- a/app/Models/Noc.php +++ b/app/Models/Noc.php @@ -23,6 +23,7 @@ class Noc extends Base 'bukti_penyelesaian', 'bukti_ksl', 'memo_penyelesaian', + 'catatan_noc', 'status', 'authorized_status', 'authorized_at', diff --git a/database/migrations/2025_05_04_124217_create_nocs_table.php b/database/migrations/2025_05_04_124217_create_nocs_table.php index 4630297..a91fc31 100644 --- a/database/migrations/2025_05_04_124217_create_nocs_table.php +++ b/database/migrations/2025_05_04_124217_create_nocs_table.php @@ -26,6 +26,7 @@ $table->string('bukti_ksl')->nullable(); $table->text('memo_penyelesaian')->nullable(); $table->boolean('status')->default(true); + $table->string('catatan_noc')->nullable(); $table->char('authorized_status', 1)->nullable(); $table->timestamp('authorized_at')->nullable(); $table->unsignedBigInteger('authorized_by')->nullable(); diff --git a/resources/views/noc/form.blade.php b/resources/views/noc/form.blade.php index 9d0eb81..9721c50 100644 --- a/resources/views/noc/form.blade.php +++ b/resources/views/noc/form.blade.php @@ -19,6 +19,7 @@