- Ubah validasi permohonan_id dari required menjadi nullable di NocRequest - Hapus pesan error required untuk permohonan_id di validation messages - Tambahkan logika kondisional di NocController->store() untuk updateOrCreate berdasarkan keberadaan permohonan_id - Perbaiki null safety dengan operator ?-> di form.blade.php untuk akses nested properties - Update logika status pembayar untuk mendukung pembayaran dengan nomor_tiket - Tambahkan kondisi khusus untuk menentukan status bayar berdasarkan nomor_tiket - Perbaiki formatting dan spacing di controller untuk readability
168 lines
7.2 KiB
PHP
168 lines
7.2 KiB
PHP
<?php
|
|
|
|
namespace Modules\Lpj\Http\Requests;
|
|
|
|
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 [
|
|
'permohonan_id' => 'nullable|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',
|
|
'total_pembukuan' => 'nullable|numeric|min:0',
|
|
'bukti_ksl' => $fileRule,
|
|
'bukti_bayar' => $fileRule,
|
|
'status_bayar' => 'nullable|boolean',
|
|
'tanggal_pembayaran' => 'nullable|date',
|
|
'status_kurang_bayar' => 'nullable|boolean',
|
|
'status_lebih_bayar' => 'nullable|boolean',
|
|
'nominal_kurang_bayar' => 'nullable|numeric|min:0',
|
|
'nominal_lebih_bayar' => 'nullable|numeric|min:0',
|
|
'bukti_pengembalian' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:2048',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 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',
|
|
'nomor_tiket' => 'nullable|string',
|
|
'nomor_rekening_lebih_bayar' => 'nullable|string',
|
|
'bukti_ksl_lebih_bayar' => 'nullable|string',
|
|
'bukti_ksl_kurang_bayar' => '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.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',
|
|
'status_kurang_bayar.boolean' => 'Status Kurang Bayar harus berupa boolean',
|
|
'status_lebih_bayar.boolean' => 'Status Lebih Bayar harus berupa boolean',
|
|
'nominal_kurang_bayar.numeric' => 'Nominal Kurang Bayar harus berupa angka',
|
|
'nominal_kurang_bayar.min' => 'Nominal Kurang Bayar minimal 0',
|
|
'nominal_lebih_bayar.numeric' => 'Nominal Lebih Bayar harus berupa angka',
|
|
];
|
|
}
|
|
}
|