|string> */ public function rules() : array { $rules = [ 'branch_code' => ['required', 'string', 'exists:branches,code'], 'account_number' => ['required', 'string'], 'is_period_range' => ['sometimes', 'boolean'], 'period_from' => [ 'required', 'string', 'regex:/^\d{6}$/', // YYYYMM format // Prevent duplicate requests with same account number and period function ($attribute, $value, $fail) { $query = Statement::where('account_number', $this->input('account_number')) ->where('authorization_status', '!=', 'rejected') ->where('period_from', $value); // If this is an update request, exclude the current record if ($this->route('statement')) { $query->where('id', '!=', $this->route('statement')); } // If period_to is provided, check for overlapping periods if ($this->input('period_to')) { $query->where(function ($q) use ($value) { $q->where('period_from', '<=', $this->input('period_to')) ->where('period_to', '>=', $value); }); } if ($query->exists()) { $fail('A statement request with this account number and period already exists.'); } } ], ]; // If it's a period range, require period_to if ($this->input('period_to')) { $rules['period_to'] = [ 'required', 'string', 'regex:/^\d{6}$/', // YYYYMM format 'gte:period_from' // period_to must be greater than or equal to period_from ]; } return $rules; } /** * Get custom messages for validator errors. * * @return array */ public function messages() : array { return [ 'branch_code.required' => 'Branch code is required', 'branch_code.exists' => 'Selected branch does not exist', 'account_number.required' => 'Account number is required', 'period_from.required' => 'Period is required', 'period_from.regex' => 'Period must be in YYYYMM format', 'period_to.required' => 'End period is required for period range', 'period_to.regex' => 'End period must be in YYYYMM format', 'period_to.gte' => 'End period must be after or equal to start period', ]; } /** * Prepare the data for validation. * * @return void */ protected function prepareForValidation() : void { if($this->has('period_from')){ //conver to YYYYMM format $this->merge([ 'period_from' => substr($this->period_from, 0, 4).substr($this->period_from, 5, 2), ]); } if($this->has('period_to')){ //conver to YYYYMM format $this->merge([ 'period_to' => substr($this->period_to, 0, 4).substr($this->period_to, 5, 2), ]); } // Convert is_period_range to boolean if it exists if ($this->has('period_to')) { $this->merge([ 'is_period_range' => true, ]); } } }