belongsTo(User::class); } /* * custom_list_conditionsとのリレーションを定義 */ public function customListFields() { return $this->hasMany(CustomListField::class)->orderBy('column_number'); } /* * custom_list_fieldsとのリレーションを定義 */ public function customListConditions() { return $this->hasMany(CustomListCondition::class); } /* * custom_list_sortsとのリレーションを定義 */ public function customListSorts() { return $this->hasMany(CustomListSort::class); } public function __construct($fncName = null) { parent::__construct(); if(!$fncName){ $fncName = $this->getCurrentRouteFncName(); } if($fncName){ $this->setFncParams($fncName); } } public static function getCurrentRouteFncName() { return Route::getCurrentRoute()->__get('fnc_name'); } protected static function boot() { parent::boot(); static::saving(function ($model) { $model->function = $model->fncKey; $model->user_id = Auth::user()->id; }); static::deleting(function($model) { foreach ($model->customListFields()->get() as $customListField) { $customListField->delete(); } foreach ($model->customListSorts()->get() as $customListSort) { $customListSort->delete(); } foreach ($model->customListConditions()->get() as $customListCondition) { $customListCondition->delete(); } }); } /* * モデル結合ルートのカスタマイズ * URLの$fncNameがそのIDの表示とあっていない場合は404ページへ遷移させる */ public function resolveRouteBinding($value) { $customList = $this->where([ 'id' => $value, 'function' => self::getFncKey($this->fncName) ])->first(); if(!$customList){ abort(404); } return $customList; } // 表示作成を利用する機能 const COMPANY = 1; const STAFFU = 2; const JOB = 3; const CONTRACT = 4; const APPLY = 5; const STAFF_CARE = 6; const STATUS = 7; const APPLICANT = 8; const STAFF = 9; const STAFF2000_CONTRACT = 10; const STAFF2000_ALLOCATION = 11; const STAFF2000_ORDER = 12; const STAFF2000_COMPANY = 13; const STAFF2000_STAFFU = 14; const LISTING_MAIL = 16; // AWS-556 参照元のテーブルが変わったため変更 // 表示作成を利用する機能のモデル名 const MODEL_LIST = [ self::COMPANY => 'Company', // クライアント self::STAFFU => 'Staffu', //※スタッフ管理 self::JOB => 'Job', // 募集 self::CONTRACT => 'Contract', // 契約 self::APPLY => 'Apply', // 応募 self::STAFF_CARE => 'StaffCare', // スタッフケア self::STATUS => 'Status', // 現状 self::APPLICANT => '', // 応募者進捗管理 self::STAFF => '', // スタッフ進捗管理 self::STAFF2000_CONTRACT => 'Staff2000Contract', // スタッフ2000契約 self::STAFF2000_ALLOCATION => 'Staff2000Allocation', // スタッフ2000引当データ self::STAFF2000_ORDER => 'Staff2000Order', // スタッフ2000受注データ self::STAFF2000_COMPANY => 'Staff2000Company', // スタッフ2000派遣先マスタ self::STAFF2000_STAFFU => 'Staff2000Staffu', // スタッフ2000スタッフマスタ self::LISTING_MAIL => 'ListingMail', // 一斉メール ]; // 各機能表示名 const FNC_NAME = [ self::COMPANY => 'クライアント', self::STAFFU => 'スタッフ', self::JOB => '募集', self::CONTRACT => '契約', self::APPLY => '応募', self::STAFF_CARE => 'スタッフケア', self::STATUS => '現状', self::APPLICANT => '応募者進捗管理', self::STAFF => 'スタッフ進捗管理', self::STAFF2000_CONTRACT => 'Staff2000契約', self::STAFF2000_ALLOCATION => 'Staff2000引当データ', self::STAFF2000_ORDER => 'Staff2000受注データ', self::STAFF2000_COMPANY => 'Staff2000派遣先マスタ', self::STAFF2000_STAFFU => 'Staff2000スタッフマスタ', self::LISTING_MAIL => '一斉メール', ]; // 演算子ID const AND_SEARCH = 1; const OR_SEARCH = 2; public $fncKey; public $fncName; public $fncNameJa; public $customListArray; private function setFncParams($fncName) { $this->fncName = $fncName; $this->fncKey = self::getFncKey($fncName); $this->fncNameJa = self::getFncName($fncName); $this->customListArray = $this->getInstance()::DEFAULT_LIST; } public static function getFncKey($fncName) { $modelName = Str::studly($fncName); $keys = array_keys(self::MODEL_LIST, $modelName); return $keys[0]; } public static function getFncName($fncName) { return self::FNC_NAME[self::getFncKey($fncName)]; } public function getInstance() { $model = __NAMESPACE__ . '\\' . self::MODEL_LIST[$this->fncKey]; return new $model; } /* * 自分の作成した一覧及び全員に公開されている一覧を取得 */ public function getAvailableLists() { $customLists = self::query() ->where('function', '=', $this->fncKey) ->where(function ($query){ $query->orWhere('user_id', '=', Auth::user()->id) ->orWhere('published_flag', '=', true); })->get(); return $customLists; } /* * CustomListを保存する */ public function saveCustomList($requestData) { $requestData['function'] = $this->fncKey; $requestData['user_id'] = Auth::user()->id; $this->fill($requestData)->save(); } /* * 子レコード(CustomListFields/CustomListConditions/CustomListSorts)を保存する */ public function saveExcludeRelation($requestData) { CustomListCondition::saveConditions($this, $requestData); CustomListField::saveFields($this, $requestData); CustomListSort::saveSorts($this, $requestData); } /* * 子レコード(CustomListFields/CustomListConditions/CustomListSorts)を更新する */ public function updateExcludeRelation($requestData) { CustomListCondition::deleteConditions($this, $requestData); CustomListCondition::saveConditions($this, $requestData); CustomListField::deleteFields($this, $requestData); CustomListField::saveFields($this, $requestData); CustomListSort::deleteSorts($this, $requestData); CustomListSort::saveSorts($this, $requestData); } public static function copyRequestData($requestData) { foreach ($requestData as $field => $datum){ if(is_array($datum)) { foreach ($datum as $key => $value) { $requestData[$field][$key] = collect($value)->forget('id')->toArray(); } } } return $requestData; } /* * 表示選択の選択肢を取得 */ public function getCustomListOptions() { return $this->getAvailableLists()->pluck('name', 'id'); } public function getConditions(): array { $conditions = []; foreach ($this->customListConditions as $condition) { $conditions[] = [ 'field' => $condition->field, 'comparison_operator_id' => $condition->comparison_operator_id, 'condition' => $condition->value, ]; } return $conditions; } public function getSearchMethod(): int { return $this->search_method; } public function getPaginateLimit(): int { return $this->number; } public function getPaginateOrder() { if (empty($this->customListSorts)) { return []; } $sorts = []; foreach ($this->customListSorts as $sort) { $sorts[] = [ 'field' => $sort->field, 'sort' => $sort->sort, ]; } return $sorts; } /* * リストをメンバ変数としてセットする */ private function setCustomListArrayWithCons(Request $request) { $customListArray = $this->customListArray; $conditions = $request->input('custom_list_conditions'); if($conditions && is_array($conditions)){ $filtered = collect($conditions)->filter(function($val) { return array_key_exists('comparison_operator_id', $val) && array_key_exists('field', $val) && array_key_exists('condition', $val); })->toArray(); $customListArray['custom_list_conditions'] = $filtered; } if($request->has('search_method')){ $customListArray['search_method'] = $request->input('search_method'); } $this->customListArray = $customListArray; } /* * リクエストパラメータに応じてメンバ変数にセット これは各コントローラーから呼ぶ(暫定) */ public function setCustomListArray(Request $request) { if($request->input('custom_list')){ $customList = $this->getCustomList($request); if($customList){ $this->customListArray = $customList->toArray(); } } if($request->input('custom_list_conditions')){ $this->setCustomListArrayWithCons($request); } } /* * リクエストパラメータのIDからリストを取得 */ private function getCustomList(Request $request) { return CustomList::query() ->where('id', $request->input('custom_list')) ->where('function', '=', $this->fncKey) ->with([ 'customListConditions', 'customListSorts' => function($q) { $q->orderBy('priority'); }, 'customListFields' => function($q) { $q->orderBy('column_number'); }, ])->get()->first(); } }