feat(noc): tambahkan integrasi dan validasi data NOC
- Tambahkan model NOC ke NocController, PersetujuanPenawaranController, dan validasi pada NocRequest. - Implementasi penyimpanan data NOC menggunakan `updateOrCreate` di beberapa alur proses. - Tambahkan properti baru `catatan_noc` pada model, migrasi database, dan form terkait. - Revisi aturan validasi pada NocRequest dan PersetujuanPenawaranRequest. - Tingkatkan tampilan form NOC dengan penanganan file upload dan pratinjau file yang sudah diunggah. - Perbaikan beberapa nama properti seperti `status_bayar` menjadi `status_pembayar`. Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
This commit is contained in:
@@ -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',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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".',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user