'required|integer|exists:users,id', 'base_date' => 'required|date', 'status' => 'nullable|in:onTime,late,absent,vacation,businessTrip,fieldWork,overtime,remote', 'remarks' => 'nullable|string|max:500', // json_details 필드 'check_in' => 'nullable|date_format:H:i:s', 'check_out' => 'nullable|date_format:H:i:s', 'gps_data' => 'nullable|array', 'gps_data.check_in' => 'nullable|array', 'gps_data.check_in.latitude' => 'nullable|numeric', 'gps_data.check_in.longitude' => 'nullable|numeric', 'gps_data.check_out' => 'nullable|array', 'gps_data.check_out.latitude' => 'nullable|numeric', 'gps_data.check_out.longitude' => 'nullable|numeric', 'external_work' => 'nullable|array', 'external_work.location' => 'nullable|string|max:255', 'external_work.purpose' => 'nullable|string|max:500', 'work_minutes' => 'nullable|integer|min:0', 'overtime_minutes' => 'nullable|integer|min:0', 'late_minutes' => 'nullable|integer|min:0', 'early_leave_minutes' => 'nullable|integer|min:0', 'vacation_type' => 'nullable|string|max:50', ]; } public function messages(): array { return [ 'user_id.required' => __('validation.required', ['attribute' => '사용자']), 'base_date.required' => __('validation.required', ['attribute' => '기준일']), ]; } }