File: /var/www/ipsremont-demo/app/Http/Requests/Repair/UpdateRequest.php
<?php
namespace App\Http\Requests\Repair;
use App\Models\Repair\Repair;
use Illuminate\Validation\Rule;
/**
* @property $status
* @property $category_id
* @property $work_description
* @property $closed_at
* @property $error_code
*/
class UpdateRequest extends CreateRequest
{
/**
* @return array
*/
public function rules(): array
{
$rules = parent::rules();
unset($rules['order_id']);
$rules['status'] = ['required', 'string'];
$rules['category_id'] = [Rule::requiredIf(fn() => $this->status === Repair::STATUS_COMPLETED && empty($this->custom_price)), 'integer', 'between:1,4', 'nullable'];
$rules['work_description'] = ['required_if:status,==,completed', 'string', 'nullable'];
$rules['closed_at'] = ['required_if:status,==,completed', 'date_format:Y-m-d', 'nullable'];
$rules['error_code'] = ['required_if:status,==,completed', 'integer', 'nullable'];
$rules['error_category'] = ['required_if:status,==,completed', 'integer', 'nullable'];
$rules['custom_price'] = ['regex:/^\d{1,7}(?:(?:\.|,)\d{1,2})?$/', 'nullable', 'min:0', 'not_in:0'];
$rules['parts'] = ['array', 'required'];
$rules['parts.*.repair_id'] = ['integer', 'required'];
$rules['parts.*.vendor_code'] = ['required_with:parts.*.amount', 'required_with:parts.*.price', 'string', 'nullable'];
$rules['parts.*.amount'] = ['required_with:parts.*.vendor_code', 'required_with:parts.*.price', 'integer', 'nullable'];
$rules['parts.*.price'] = ['required_with:parts.*.amount', 'required_with:parts.*.vendor_code', 'regex:/^\d{1,7}(?:(?:\.|,)\d{1,2})?$/', 'nullable', 'min:0', 'not_in:0'];
return $rules;
}
protected function prepareForValidation()
{
parent::prepareForValidation();
$isCompleted = $this->status == Repair::STATUS_COMPLETED;
$this->merge([
'category_id' => $isCompleted ? $this->category_id : null,
'work_description' => $isCompleted ? $this->work_description : null,
'closed_at' => $isCompleted ? $this->dateFromJs($this->closed_at) : null,
'error_code' => $isCompleted ? $this->error_code : null,
]);
}
}