<?php

namespace App;

use App\Traits\StaffuCommon;
use Carbon\Carbon;
use http\Env\Request;
use Validator;

class Staffu extends RichSearchableModel
{
    use StaffuCommon;

    /**
     * モデルと関連しているテーブル
     *
     * @var string
     */
    protected $table = 'tcd_staffu_new';
    const CREATED_AT = 'st_Createdate';
    const UPDATED_AT = 'st_Updatedate';
    public $incrementing = false;
    protected $primaryKey = 'st_Id';
    public static $function_id = CustomList::STAFFU;

    protected $fillable = [
        'st_Id',
        'st_Usertype',
        'st_Userpass',
        'st_Mailad',
        'st_Createdate',
        'st_Updatedate',
        'st_Age',
        'st_Approach',
        'st_Birthday',
        'st_Fromdate',
        'st_Doukyo',
        'st_Genkyou',
        'st_Haigu',
        'st_Handyp',
        'st_Handypmail',
        'st_Jitumu',
        'st_Jitumuy',
        'st_Keikenbu',
        'st_Keikensyokusyu',
        'st_Kentou',
        'st_Kiboubu',
        'st_Kiboucad',
        'st_Kiboucity',
        'st_Kibousyokusyu',
        'st_Kibouzikyu',
        'st_Koutuu',
        'st_MailService',
        'st_Mypr',
        'st_Mypr_file',
        'st_Os',
        'st_Oubo',
        'st_ReissueFlag',
        'st_Rireki',
        'st_Sex',
        'st_Shigotosyokai',
        'st_Skcad',
        'st_Skill',
        'st_Staffaddress',
        'st_Staffaddress2',
        'st_Staffaddress3',
        'st_Staffcity',
        'st_Staffkana',
        'st_Staffname',
        'st_TempPass',
        'st_Yubin',
        'st_Zitaku',
        'st_Zkiboucad2',
        'st_Zkiboukeitai',
        'st_Zskcad2',
        'st_Zzaccess',
        'st_Zzaccess2',
        'st_ZzbDom',
        'st_ZzbHandypMailService',
        'st_Country',
        'st_StatusResidence',
        'st_remarks',
        'st_businessname',
        'st_businesskana',
    ];

    /*
     * tcd_staffu_historyとのリレーションを定義
     */
    public function staffu_history()
    {
        return $this->hasOne(StaffuHistory::class, 'sh_Id', 'st_Id');
    }

    /*
     * tcd_admin_memoとのリレーションを定義
     */
    public function admin_memo()
    {
        return $this->hasOne(AdminMemo::class, 'am_id', 'st_Id');
    }

    /*
     * tcd_admin_memo_updatedとのリレーションを定義
     */
    public function admin_memo_updated()
    {
        return $this->hasOne(AdminMemoUpdated::class, 'amu_id', 'st_Id');
    }

    /*
     * duplicate_staffuとのリレーションを定義
     */
    public function duplicate_staffu()
    {
        return $this->hasOne(DuplicateStaffu::class, 'staffu_id', 'st_Id');
    }

    public function status()
    {
        return $this->hasOne(Status::class, 'ss_st_id');
    }

    public function applies()
    {
        return $this->hasMany(Apply::class, 'ap_staffu_id', 'st_Id');
    }

    public function staff2000_staffus()
    {
        return $this->hasMany(Staff2000Staffu::class, 'st_id', 'st_Id');
    }

    public function contracts()
    {
        return $this->hasMany(Contract::class, 'ct_staffu_id', 'st_Id');
    }

    public function staff_cares()
    {
        return $this->hasMany(StaffCare::class, 'sc_st_id', 'st_Id');
    }

    public $errors = [];

    const DEFAULT_LIST = [
        'number' => 100,
        'search_method' => 1,
        'custom_list_sorts' => [
            [
                'field' => 'st_Id',
                'sort' => CustomListSort::DESC,
                'priority' => 1
            ]
        ],
        'custom_list_conditions' => [
            0 => [
            "field" => "tcd_status.ss_evaluate",
            "comparison_operator_id" => "2",
            "condition" => "5",
            ],
        ],
        'custom_list_fields' => [
            [
                'field' => 'st_Id'
            ],
            [
                'field' => 'st_Staffkana'
            ],
            [
                'field' => 'st_Staffname'
            ],
            [
                'field' => 'st_Staffcity'
            ],
            [
                'field' => 'st_Staffaddress'
            ],
            [
                'field' => 'st_Zitaku'
            ],
            [
                'field' => 'st_Mailad'
            ],
            [
                'field' => 'age'
            ],
            [
                'field' => 'tcd_status.ss_status'
            ],
            [
                'field' => 'tcd_status.ss_evaluate'
            ],
        ],
    ];

    const FIELD_NAME = [
        'tcd_status.ss_evaluate' => '紹介レベル',
        'tcd_status.ss_status' => '現状ステータス',
        'st_Id' => 'スタッフID',
        'st_Staffkana' => 'フリガナ',
        'st_Staffname' => '名前',
        'st_businesskana' => 'ビジネスネームカナ',
        'st_businessname' => 'ビジネスネーム',
        'st_Usertype' => 'メールドメイン',
        'st_Mailad' => 'メールアドレス',
        'st_Createdate' => '登録時間',
        'st_Updatedate' => '更新時間',
        'st_Sex' => '性別',
        'st_Birthday' => '生年月日',
//        'st_Age' => '歳',
        'age' => '年齢',
        'st_Yubin' => '郵便番号',
        'st_Staffcity' => '都道府県',
        'st_Staffaddress' => '市町村及び区',
        'st_Staffaddress2' => '住所',
        'st_Staffaddress3' => 'マンション／アパートなど',
        'st_Zitaku' => '自宅TEL',
        'st_Handyp' => '携帯TEL',
        'st_Handypmail' => '携帯メール',
        'st_Haigu' => '配偶者',
        'st_Doukyo' => '同居家族',
        'st_Genkyou' => '現況',
        'st_Country' => '国籍',
        'st_StatusResidence' => '在留資格',
        'st_ZzbHandypMailService' => '携帯メールサービス設定',
        'st_MailService' => 'メールサービス設定',
        'st_Approach' => 'アプローチメール設定',
        'tcd_staffu_history.sh_education' => '学歴',
        'tcd_staffu_history.sh_Mypr_Skcad' => 'スキル　経験CAD職種',
        'tcd_staffu_history.sh_Mypr_Os' => 'スキル　PCソフト',
        'tcd_staffu_history.sh_Mypr_design_soft' => 'スキル　設計ソフト',
        'tcd_staffu_history.sh_Mypr_Keikenbu' => 'スキル　経験業種分野',
        'tcd_staffu_history.sh_Mypr_Keikenbu_other' => 'スキル　経験業種その他',
        'tcd_staffu_history.sh_Mypr_Keikensyokusyu' => 'スキル　経験職種',
        'tcd_staffu_history.sh_Mypr_eg_skill' => 'スキル　英語',
        'tcd_staffu_history.sh_Mypr_tec_skill' => 'スキル　TOEIC',
        'tcd_staffu_history.sh_Mypr_tfl_skill' => 'スキル　TOEFL',
        'tcd_staffu_history.sh_Mypr_crt_skill' => 'スキル　資格',
        'tcd_staffu_history.sh_Mypr_Skcad_other' => 'スキル　経験CAD機種その他',
        'tcd_staffu_history.sh_Mypr_Os_other' => 'スキル　経験PCソフトその他',
        'tcd_staffu_history.sh_Mypr_design_soft_other' => 'スキル　設計ソフトその他',
        'tcd_staffu_history.sh_Mypr_crt_skill_other' => 'スキル　資格その他',
        'tcd_staffu_history.sh_Mypr_Keikensyokusyu_other' => 'スキル　経験のある職種その他',
        'st_Skill' => 'スキル　その他',
        'st_Zzaccess' => 'スキル　アクセス元',
        'st_Zzaccess2' => 'スキル　アクセスその他',
        'tcd_staffu_history.sh_business_career' => 'WEB履歴書　職歴',
        'tcd_staffu_history.sh_business_career_file' => 'WEB履歴書　職歴[添付ファイル]',
        'st_Mypr' => '【不使用】WEB履歴書　自己PR',
        'st_Mypr_file' => '【不使用】WEB履歴書　自己PR[添付ファイル]',
        'st_Shigotosyokai' => '希望内容　希望内容',
        'st_Fromdate' => '希望内容　就業開始可能日',
        'st_Kiboubu' => '希望内容　業種分野',
        'tcd_staffu_history.sh_Kiboubu_other' => '希望内容　業種分野',
        'st_Zkiboukeitai' => '希望内容　形態',
        'st_Kibousyokusyu' => '希望内容　職種',
        'st_Kiboucad' => '希望内容　CAD機種',
        'st_Zkiboucad2' => '希望内容　CAD機種2',
        'st_Kiboucity' => '希望内容　希望勤務地',
        'st_Kibouzikyu' => '【不使用】希望内容　時給',
        'tcd_staffu_history.sh_Mypr_Kibounensyu' => '【不使用】希望内容　年収',
        'tcd_staffu_history.sh_Update_flg' => '登録フラグ',
        'st_Keikenbu' => '旧　経験業種分野',
        'st_Kentou' => '旧　検討中の求人',
        'st_Koutuu' => '最寄り駅',
        'st_Os' => '旧　パソコン経験',
        'st_Oubo' => '旧　応募履歴',
        'st_Rireki' => '旧　履歴・職歴',
        'st_Skcad' => '旧　経験CAD機種',
        'st_Zskcad2' => '旧　経験CAD機種2',
        'st_remarks' => '備考',
        'tcd_staffu_history.sh_Createdate' => '登録日時',
        'tcd_staffu_history.sh_Updatedate' => '更新日時',
    ];

    const OPTIONS_SEX = [
        '男性' => '男性',
        '女性' => '女性',
    ];

    const OPTIONS_ZKIBOUKEITAI = [
        'こだわらない' => 'こだわらない',
        '派遣' => '派遣',
        '紹介予定派遣' => '紹介予定派遣',
        '正社員' => '正社員',
        '契約社員' => '契約社員'
    ];

    const OPTIONS_SYOKUSYU = [
        'CADオペレーター' => 'CADオペレーター',
        'BIMオペレーター' => 'BIMオペレーター',
        '設計/設計補助' => '設計/設計補助',
        '設計監理' => '設計監理',
        '施工管理' => '施工管理',
        'インテリアデザイナー' => 'インテリアデザイナー',
        'インテリアコーディネーター' => 'ｲﾝﾃﾘｱｺｰﾃﾞｨﾈｰﾀｰ',
        'ファシリティマネジメント' => 'ファシリティマネジメント',
        'コンストラクションマネジメント' => 'ｺﾝｽﾄﾗｸｼｮﾝﾏﾈｼﾞﾒﾝﾄ',
        'プロジェクトマネジメント' => 'プロジェクトマネジメント',
        '営業' => '営業',
        'その他職種' => 'その他職種',
    ];

    public static function getKeikensyokusyu()
    {
        return array_keys(self::OPTIONS_SYOKUSYU);
    }

    const OPTIONS_KIBOU_CAD = [
        'AutoCAD' => 'AutoCAD',
        'VectorWorks（Win）' => 'VectorWorks（Win）',
        'VectorWorks（Mac）' => 'VectorWorks（Mac）',
        'Jwcad' => 'Jwcad',
        'Revit' => 'Revit',
        'ARCHITREND' => 'ARCHITREND',
        'DRA-CAD' => 'DRA-CAD',
        'ArchiCAD' => 'ArchiCAD',
        'CADWe\'ll CAPE' => 'CADWe\'ll CAPE',
        'CADWe\'ll Tf@S' => 'CADWe\'ll Tf@S',
        'CADEWA' => 'CADEWA',
        'CATIA' => 'CATIA',
        'I-deas' => 'I-deas',
        'MICROCADAM' => 'MICROCADAM',
        'SolidWorks' => 'SolidWorks',
        'SolidEdge' => 'SolidEdge',
        'Pro/ENGINEER' => 'Pro/ENGINEER',
        'V-nas' => 'V-nas',
        'inventor' => 'inventor',
        'オリジナルCAD' => 'オリジナルCAD',
    ];

    public static function getKibouCadModels()
    {
        return array_values(self::OPTIONS_KIBOU_CAD);
    }

    const OPTIONS_CAD = [
        'AutoCAD' => 'AutoCAD',
        'VectorWorks（Win）' => 'VectorWorks（Win）',
        'VectorWorks（Mac）' => 'VectorWorks（Mac）',
        'Jwcad' => 'Jwcad',
        'Revit' => 'Revit',
        'ARCHITREND' => 'ARCHITREND',
        'DRA-CAD' => 'DRA-CAD',
        'ArchiCAD' => 'ArchiCAD',
        'CADWe\'ll CAPE' => 'CADWe\'ll CAPE',
        'CADWe\'ll Tf@S' => 'CADWe\'ll Tf@S',
        'CADEWA' => 'CADEWA',
        'CATIA' => 'CATIA',
        'I-deas' => 'I-deas',
        'MICRO CADAM' => 'MICRO CADAM',
        'SolidWorks' => 'SolidWorks',
        'SolidEdge' => 'SolidEdge',
        'Pro/ENGINEER' => 'Pro/ENGINEER',
        'V-nas' => 'V-nas',
        'inventor' => 'inventor',
        'オリジナルCAD' => 'オリジナルCAD',
    ];

    public static function getCadModels()
    {
        return array_values(self::OPTIONS_CAD);
    }

    const PC_SOFT = [
        'Word',
        'Excel',
        'Access',
        'PowerPoint',
        'Photoshop',
        'Illustrator',
        'InDesign',
        'Form-Z',
        'Renderworks',
        'Strata 3D',
        'Shade',
        'Maya',
        '3ds Max',
    ];

    const DESIGN_SOFT = [
        'SS3',
        'BUILD一貫',
        'BUS-5',
        'TP-PLANNER',
        'ADS',
    ];

    const EXPERIENCE_YEARS = [
        'なし',
        '独学',
        '実務１年未満',
        '実務１年～３年',
        '実務３年以上',
    ];

    const SHOKUSHU_EXPERIENCE_YEARS = [
        'なし',
        '実務２年未満',
        '実務２年～３年',
        '実務３年～５年',
        '実務５年以上',
    ];

    const GYOSHU = [
        '建築設計' => [
            "意匠設計（戸建以外）" => "意匠設計（戸建以外）",
            "都市計画" => "都市計画",
            "住宅設計（戸建）" => "住宅設計（戸建）",
            "構造設計（RC・SRC・S造）" => "構造設計（RC・SRC・S造）",
            "構造設計（木造）" => "構造設計（木造）",
            "耐震診断" => "耐震診断",
            "電気設備設計" => "電気設備設計",
            "空調衛生設備設計" => "空調衛生設備設計",
            "オフィスデザイン・設計" => "オフィスデザイン・設計",
            "店舗デザイン・設計" => "店舗デザイン・設計",
            "建築施工図" => "建築施工図",
            "電気設備施工図" => "電気設備施工図",
            "空調衛生設備施工図" => "空調衛生設備施工図",
            "CG・パース" => "CG・パース",
            "ランドスケープデザイン" => "ランドスケープデザイン",
            "積算" => "積算",
            "エクステリア" => "エクステリア",
        ],
        '土木設計' => [
            "土木道路" => "土木道路",
            "土木橋梁" => "土木橋梁",
            "土木上下水" => "土木上下水",
        ],
        '機械設計' => [
            "機械精密" => "機械精密",
            "機械プラント" => "機械プラント",
            "機械筐体" => "機械筐体",
        ],
        '電子・電気設計' => [
            "電気電子回路" => "電気電子回路",
            "電気計装" => "電気計装",
            "電気プリント基板" => "電気プリント基板",
            "携帯基地局" => "携帯基地局",
        ],
    ];

    const CRT_SKILL = [
        '建築系' => [
            "一級建築士" => "一級建築士",
            "二級建築士" => "二級建築士",
            "構造設計一級建築士" => "構造設計一級建築士",
            "設備設計一級建築士" => "設備設計一級建築士",
            "建築設備士" => "建築設備士",
            "木造建築士" => "木造建築士",
            "一級建築施工管理" => "一級建築施工管理",
            "二級建築施工管理" => "二級建築施工管理",
            "一級電気工事施工管理" => "一級電気工事施工管理",
            "二級電気工事施工管理" => "二級電気工事施工管理",
            "一級管工事施工管理" => "一級管工事施工管理",
            "二級管工事施工管理" => "二級管工事施工管理",
            "インテリアコーディネーター" => "ｲﾝﾃﾘｱｺｰﾃﾞｨﾈｰﾀｰ",
            "消防設備士" => "消防設備士",
            "福祉住環境コーディネーター" => "福祉住環境ｺｰﾃﾞｨﾈｰﾀｰ",
            "宅地建物取引主任者" => "宅地建物取引主任者",
            "技術士（都市計画）" => "技術士（都市計画）",
        ],
        '土木系' => [
            "一級土木施工管理" => "一級土木施工管理",
            "二級土木施工管理" => "二級土木施工管理",
            "測量士" => "測量士",
            "測量士補" => "測量士補",
            "一級造園施工管理" => "一級造園施工管理",
            "二級造園施工管理" => "二級造園施工管理",
            "技術士" => "技術士",
            "技術士補" => "技術士補",
            "RCCM" => "RCCM",
        ],
        '機械・電気系' => [
            "技術士" => "技術士",
        ],
    ];

    const IS_NG = [5 => 'NGスタッフ'];

    const MAIL_RECEIVE = [
        '受け取る' => '受け取る',
        '受け取らない' => '受け取らない',
    ];

    const COUNTRY = [
        '中国' => '中国',
        '韓国' => '韓国',
        '台湾' => '台湾',
        '香港' => '香港',
        'インド' => 'インド',
        'インドネシア' => 'インドネシア',
        'カンボジア' => 'カンボジア',
        'シンガポール' => 'シンガポール',
        'スリランカ' => 'スリランカ',
        'タイ' => 'タイ',
        'ネパール' => 'ネパール',
        'パキスタン' => 'パキスタン',
        'バングラデシュ' => 'バングラデシュ',
        '東ティモール' => '東ティモール',
        'フィリピン' => 'フィリピン',
        'ブータン' => 'ブータン',
        'ブルネイ' => 'ブルネイ',
        'ベトナム' => 'ベトナム',
        'マレーシア' => 'マレーシア',
        'ミャンマー' => 'ミャンマー',
        'モルディブ' => 'モルディブ',
        'モンゴル' => 'モンゴル',
        'ラオス' => 'ラオス',
        'オーストラリア' => 'オーストラリア',
        'キリバス' => 'キリバス',
        'サモア' => 'サモア',
        'ソロモン諸島' => 'ソロモン諸島',
        'ツバル' => 'ツバル',
        'トンガ' => 'トンガ',
        'ナウル' => 'ナウル',
        'ニウエ' => 'ニウエ',
        'ニュージーランド' => 'ニュージーランド',
        'バヌアツ' => 'バヌアツ',
        'パプアニューギニア' => 'パプアニューギニア',
        'パラオ' => 'パラオ',
        'フィジー' => 'フィジー',
        'マーシャル' => 'マーシャル',
        'ミクロネシア' => 'ミクロネシア',
        '米国' => '米国',
        'カナダ' => 'カナダ',
        'アルゼンチン' => 'アルゼンチン',
        'アンティグア・バーブーダ' => 'アンティグア・バーブーダ',
        'ウルグアイ' => 'ウルグアイ',
        'エクアドル' => 'エクアドル',
        'エルサルバドル' => 'エルサルバドル',
        'ガイアナ' => 'ガイアナ',
        'キューバ' => 'キューバ',
        'グアテマラ' => 'グアテマラ',
        'グレナダ' => 'グレナダ',
        'コスタリカ' => 'コスタリカ',
        'コロンビア' => 'コロンビア',
        'ジャマイカ' => 'ジャマイカ',
        'スリナム' => 'スリナム',
        'セントビンセントおよびグレナディーン諸島' => 'セントビンセントおよびグレナディーン諸島',
        'セントクリストファー・ネーヴィス' => 'セントクリストファー・ネーヴィス',
        'セントルシア' => 'セントルシア',
        'チリ' => 'チリ',
        'ドミニカ国' => 'ドミニカ国',
        'ドミニカ共和国' => 'ドミニカ共和国',
        'トリニダード・トバゴ' => 'トリニダード・トバゴ',
        'ニカラグア' => 'ニカラグア',
        'ハイチ' => 'ハイチ',
        'パナマ' => 'パナマ',
        'バハマ' => 'バハマ',
        'パラグアイ' => 'パラグアイ',
        'バルバドス' => 'バルバドス',
        'ブラジル' => 'ブラジル',
        'ベネズエラ' => 'ベネズエラ',
        'ベリーズ' => 'ベリーズ',
        'ペルー' => 'ペルー',
        'ボリビア' => 'ボリビア',
        'ホンジュラス' => 'ホンジュラス',
        'メキシコ' => 'メキシコ',
        'アイスランド' => 'アイスランド',
        'アイルランド' => 'アイルランド',
        'アゼルバイジャン' => 'アゼルバイジャン',
        'アルバニア' => 'アルバニア',
        'アルメニア' => 'アルメニア',
        'アンドラ' => 'アンドラ',
        'イタリア' => 'イタリア',
        'ウクライナ' => 'ウクライナ',
        'ウズベキスタン' => 'ウズベキスタン',
        '英国' => '英国',
        'エストニア' => 'エストニア',
        'オーストリア' => 'オーストリア',
        'オランダ' => 'オランダ',
        'カザフスタン' => 'カザフスタン',
        'キプロス' => 'キプロス',
        'ギリシャ' => 'ギリシャ',
        'キルギス' => 'キルギス',
        'クロアチア' => 'クロアチア',
        'コソボ' => 'コソボ',
        'サンマリノ' => 'サンマリノ',
        'ジョージア' => 'ジョージア',
        'スイス' => 'スイス',
        'スウェーデン' => 'スウェーデン',
        'スペイン' => 'スペイン',
        'スロバキア' => 'スロバキア',
        'スロベニア' => 'スロベニア',
        'セルビア' => 'セルビア',
        'タジキスタン' => 'タジキスタン',
        'チェコ' => 'チェコ',
        'デンマーク' => 'デンマーク',
        'ドイツ' => 'ドイツ',
        'トルクメニスタン' => 'トルクメニスタン',
        'ノルウェー' => 'ノルウェー',
        'バチカン' => 'バチカン',
        'ハンガリー' => 'ハンガリー',
        'フィンランド' => 'フィンランド',
        'フランス' => 'フランス',
        'ブルガリア' => 'ブルガリア',
        'ベラルーシ' => 'ベラルーシ',
        'ベルギー' => 'ベルギー',
        'ポーランド' => 'ポーランド',
        'ボスニア・ヘルツェゴビナ' => 'ボスニア・ヘルツェゴビナ',
        'ポルトガル' => 'ポルトガル',
        'マケドニア旧ユーゴスラビア共和国' => 'マケドニア旧ユーゴスラビア共和国',
        'マルタ' => 'マルタ',
        'モナコ' => 'モナコ',
        'モルドバ' => 'モルドバ',
        'モンテネグロ' => 'モンテネグロ',
        'ラトビア' => 'ラトビア',
        'リヒテンシュタイン' => 'リヒテンシュタイン',
        'リトアニア' => 'リトアニア',
        'ルーマニア' => 'ルーマニア',
        'ルクセンブルク' => 'ルクセンブルク',
        'ロシア' => 'ロシア',
        'アフガニスタン' => 'アフガニスタン',
        'アラブ首長国連邦' => 'アラブ首長国連邦',
        'イエメン' => 'イエメン',
        'イスラエル' => 'イスラエル',
        'イラク' => 'イラク',
        'イラン' => 'イラン',
        'オマーン' => 'オマーン',
        'カタール' => 'カタール',
        'クウェート' => 'クウェート',
        'サウジアラビア' => 'サウジアラビア',
        'シリア' => 'シリア',
        'トルコ' => 'トルコ',
        'バーレーン' => 'バーレーン',
        'ヨルダン' => 'ヨルダン',
        'レバノン' => 'レバノン',
        'アルジェリア' => 'アルジェリア',
        'アンゴラ' => 'アンゴラ',
        'ウガンダ' => 'ウガンダ',
        'エジプト' => 'エジプト',
        'エチオピア' => 'エチオピア',
        'エリトリア' => 'エリトリア',
        'ガーナ' => 'ガーナ',
        'カーボヴェルデ' => 'カーボヴェルデ',
        'ガボン' => 'ガボン',
        'カメルーン' => 'カメルーン',
        'ガンビア' => 'ガンビア',
        'ギニア' => 'ギニア',
        'ギニアビサウ' => 'ギニアビサウ',
        'ケニア' => 'ケニア',
        'コートジボワール' => 'コートジボワール',
        'コモロ' => 'コモロ',
        'コンゴ共和国' => 'コンゴ共和国',
        'コンゴ民主共和国' => 'コンゴ民主共和国',
        'サントメ・プリンシペ' => 'サントメ・プリンシペ',
        'ザンビア' => 'ザンビア',
        'シエラレオネ' => 'シエラレオネ',
        'ジブチ' => 'ジブチ',
        'ジンバブエ' => 'ジンバブエ',
        'スーダン' => 'スーダン',
        'スワジランド' => 'スワジランド',
        'セーシェル' => 'セーシェル',
        '赤道ギニア' => '赤道ギニア',
        'セネガル' => 'セネガル',
        'ソマリア' => 'ソマリア',
        'タンザニア' => 'タンザニア',
        'チャド' => 'チャド',
        '中央アフリカ' => '中央アフリカ',
        'チュニジア' => 'チュニジア',
        'トーゴ' => 'トーゴ',
        'ナイジェリア' => 'ナイジェリア',
        'ナミビア' => 'ナミビア',
        'ニジェール' => 'ニジェール',
        'ブルキナファソ' => 'ブルキナファソ',
        'ブルンジ' => 'ブルンジ',
        'ベナン' => 'ベナン',
        'ボツワナ' => 'ボツワナ',
        'マダガスカル' => 'マダガスカル',
        'マラウイ' => 'マラウイ',
        'マリ' => 'マリ',
        '南アフリカ' => '南アフリカ',
        '南スーダン' => '南スーダン',
        'モザンビーク' => 'モザンビーク',
        'モーリシャス' => 'モーリシャス',
        'モーリタニア' => 'モーリタニア',
        'モロッコ' => 'モロッコ',
        'リビア' => 'リビア',
        'リベリア' => 'リベリア',
        'ルワンダ' => 'ルワンダ',
        'レソト' => 'レソト'
    ];

    const PREFS = [
        '北海道' => '北海道',
        '青森県' => '青森県',
        '岩手県' => '岩手県',
        '宮城県' => '宮城県',
        '秋田県' => '秋田県',
        '山形県' => '山形県',
        '福島県' => '福島県',
        '茨城県' => '茨城県',
        '栃木県' => '栃木県',
        '群馬県' => '群馬県',
        '埼玉県' => '埼玉県',
        '千葉県' => '千葉県',
        '東京都' => '東京都',
        '神奈川県' => '神奈川県',
        '新潟県' => '新潟県',
        '富山県' => '富山県',
        '石川県' => '石川県',
        '福井県' => '福井県',
        '山梨県' => '山梨県',
        '長野県' => '長野県',
        '岐阜県' => '岐阜県',
        '静岡県' => '静岡県',
        '愛知県' => '愛知県',
        '三重県' => '三重県',
        '滋賀県' => '滋賀県',
        '京都府' => '京都府',
        '大阪府' => '大阪府',
        '兵庫県' => '兵庫県',
        '奈良県' => '奈良県',
        '和歌山県' => '和歌山県',
        '鳥取県' => '鳥取県',
        '島根県' => '島根県',
        '岡山県' => '岡山県',
        '広島県' => '広島県',
        '山口県' => '山口県',
        '徳島県' => '徳島県',
        '香川県' => '香川県',
        '愛媛県' => '愛媛県',
        '高知県' => '高知県',
        '福岡県' => '福岡県',
        '佐賀県' => '佐賀県',
        '長崎県' => '長崎県',
        '熊本県' => '熊本県',
        '大分県' => '大分県',
        '宮崎県' => '宮崎県',
        '鹿児島県' => '鹿児島県',
        '沖縄県' => '沖縄県',
        'その他' => 'その他'
    ];

    const ENGLISH_SKILL = [
        'なし' => 'なし',
        '初級' => '初級',
        '中級' => '中級',
        '上級' => '上級'
    ];

    const EXISTENCE = [
        '無し' => '無し',
        '有り' => '有り'
    ];

    const WORKING_STATE = [
        '正社員' => '正社員',
        '契約社員' => '契約社員',
        '派遣社員' => '派遣社員',
        'アルバイト' => 'アルバイト',
        '求職中' => '求職中',
    ];

    const HOURLY_PAY = [
        '1000' => '1,000',
        '1100' => '1,100',
        '1200' => '1,200',
        '1300' => '1,300',
        '1400' => '1,400',
        '1500' => '1,500',
        '1600' => '1,600',
        '1700' => '1,700',
        '1800' => '1,800',
        '1900' => '1,900',
        '2000' => '2,000',
    ];

    const ANNUAL_SALARY = [
        '3000000' => '300万',
        '3500000' => '350万',
        '4000000' => '400万',
        '4500000' => '450万',
        '5000000' => '500万',
        '5500000' => '550万',
        '6000000' => '600万',
        '7000000' => '700万',
        '8000000' => '800万',
        '10000000' => '1000万'
    ];

    const ACCESS = [
        'Google検索' => 'Google検索',
        'Yahoo!検索' => 'Yahoo!検索',
        'リクナビ' => 'リクナビ',
        'エン派遣' => 'エン派遣',
        'はたらこねっと' => 'はたらこねっと',
        '知人の紹介' => '知人の紹介',
        'その他' => 'その他',
    ];

    const WORKING_PLACE = [
        '東京23区' => '東京23区',
        '東京23区外' => '東京23区外',
        '神奈川県' => '神奈川県',
        '埼玉県' => '埼玉県',
        '千葉県' => '千葉県',
        '茨城県' => '茨城県',
        '栃木県' => '栃木県',
        '群馬県' => '群馬県',
        '山梨県' => '山梨県',
        '静岡県' => '静岡県',
        '岐阜県' => '岐阜県',
        '愛知県' => '愛知県',
        '滋賀県' => '滋賀県',
        '京都府' => '京都府',
        '三重県' => '三重県',
        '奈良県' => '奈良県',
        '兵庫県' => '兵庫県',
        '大阪府' => '大阪府',
        '和歌山県' => '和歌山県',
        'その他' => 'その他',
    ];

    // 入力が特殊なフィールド
    public static $field_type_exceptions = [
        'tcd_staffu_history.sh_Mypr_Skcad' => 'check', // スキル　経験CAD職種
        'tcd_staffu_history.sh_Mypr_design_soft' => 'check', // スキル　設計ソフト
        'tcd_staffu_history.sh_Mypr_Keikensyokusyu' => 'check', // スキル　経験職種
        'tcd_staffu_history.sh_Mypr_Os' => 'check', // スキル　PCソフト
        'tcd_staffu_history.sh_Mypr_Keikenbu' => 'check', // スキル　経験業種分野
        'tcd_staffu_history.sh_Mypr_crt_skill' => 'check', // スキル　資格
        'st_Kiboubu' => 'check', // 希望内容　業種分野
        'st_Zkiboukeitai' => 'check', // 希望内容　形態
        'st_Kibousyokusyu' => 'check', // 希望内容　職種
        'st_Kiboucad' => 'check', // 希望内容　CAD機種
        'tcd_admin_memo.am_cad' => 'check', //【管理者入力用】経験CAD機種
        'tcd_admin_memo.am_pc_soft' => 'check', //【管理者入力用】PCソフト
        'tcd_admin_memo.am_design_soft' => 'check', //【管理者入力用】設計ソフト
        'tcd_admin_memo.am_occupation' => 'check', //【管理者入力用】経験職種
        'tcd_admin_memo.am_industry' => 'check', //【管理者入力用】経験業種分野
        'st_Sex' => 'check', // 性別
        'age' => 'num',
    ];

    public static $one_query_searchable_fields = [
        'st_Id',
        'st_Staffname',
        'st_Handyp',
        'st_Zitaku'
    ];

    public static $related_tables_options = [
        'tcd_staffu_history' => [
            'table_name' => 'tcd_staffu_history',
            'foreign_key' => 'st_Id',
            'other_key' => 'sh_Id',
            'join_type' => 'leftJoin',
            'default' => false
        ],
        'tcd_admin_memo' => [
            'table_name' => 'tcd_admin_memo',
            'foreign_key' => 'st_Id',
            'other_key' => 'am_id',
            'join_type' => 'leftJoin',
            'default' => true
        ],
        'tcd_admin_memo_updated' => [
            'table_name' => 'tcd_admin_memo_updated',
            'foreign_key' => 'st_Id',
            'other_key' => 'amu_id',
            'join_type' => 'leftJoin',
            'default' => false
        ],
        'tcd_status' => [
            'table_name' => 'tcd_status',
            'foreign_key' => 'st_Id',
            'other_key' => 'ss_st_id',
            'join_type' => 'leftJoin',
            'default' => true
        ],
    ];

    public static $always_needed_fields = [
        'st_Id',
    ];

    public static function getSearchOptions()
    {
        $searchOptions = [];
        $searchOptions['check'] = [];
        $searchOptions['check']['st_Zkiboukeitai'] = self::OPTIONS_ZKIBOUKEITAI;
        $searchOptions['check']['st_Kibousyokusyu'] = self::OPTIONS_SYOKUSYU;
        $searchOptions['check']['st_Kiboucad'] = self::OPTIONS_CAD;
        $searchOptions['check']['st_Sex'] = self::OPTIONS_SEX;
        $searchOptions['select']['tcd_status.ss_evaluate'] = StatusEvaluate::pluck('ss_evaluate_name', 'ss_evaluate_id');
        $searchOptions['select']['tcd_status.ss_status'] = StatusMaster::pluck('ss_status_name', 'ss_status_id');

        return $searchOptions;
    }

    public static function scopeNewStaffus($query)
    {
        $sevenDaysBefore = Carbon::now()->subDays(7)->toDateString();
        return $query->where('st_Createdate', '>', $sevenDaysBefore)
            ->leftjoin('tcd_admin_memo', 'st_Id', 'am_id')
            ->leftjoin('tcd_staffu_history', 'st_Id', 'sh_Id')
            ->leftjoin('tcd_status', 'st_Id', 'ss_st_id')
            ->excludeNg()
            ->excludeDuplication();
    }

    public static function scopeUpdatedStaffus($query)
    {
        $sevenDaysBefore = Carbon::now()->subDays(7)->toDateString();
        return $query->where('st_Updatedate', '>', $sevenDaysBefore)
            ->orWhere('sh_Updatedate', '>', $sevenDaysBefore)
            ->leftjoin('tcd_admin_memo', 'st_Id', 'am_id')
            ->leftjoin('tcd_staffu_history', 'st_Id', 'sh_Id')
            ->leftjoin('tcd_status', 'st_Id', 'ss_st_id')
            ->excludeNg()
            ->excludeDuplication();
    }

    public function scopeStCreatedate($query, $condition, $searchMethod)
    {
        return $query->datetime($condition, $searchMethod);
    }

    public function scopeStUpdatedate($query, $condition, $searchMethod)
    {
        return $query->datetime($condition, $searchMethod);
    }

    public function scopeTcdStaffuHistoryShCreatedate($query, $condition, $searchMethod)
    {
        return $query->datetime($condition, $searchMethod);
    }

    public function scopeTcdStaffuHistoryShUpdatedate($query, $condition, $searchMethod)
    {
        return $query->datetime($condition, $searchMethod);
    }

    public function scopeAge($query, $condition, $searchMethod)
    {
        return $query->calAge('st_Birthday', $condition, $searchMethod);
    }

    public function scopeSortAge($query, $sort)
    {
        if($sort['sort'] === CustomListSort::DESC){
            return $query->orderBy('st_Birthday', 'desc');
        }
        return $query->orderBy('st_Birthday');
    }

    public function scopeSortTcdStatusSsEvaluate($query, $sort)
    {
        $order = $sort['sort'] == CustomListSort::DESC ? 'asc' : 'desc';
        return $query->leftJoin('tcd_ss_evaluate', 'tcd_ss_evaluate.ss_evaluate_id', 'tcd_status.ss_evaluate')
            ->orderBy('tcd_ss_evaluate.ss_evaluate_sort', $order);
    }

    public function getSsStatusDateAttributes()
    {
        return ($this->status->ss_status_date) ?? '';
    }

    public function getSsCommentAttributes()
    {
        return ($this->status->ss_comment) ?? '';
    }

    public function getAgeAttribute()
    {
        $now = Carbon::now();
        $birthday = new Carbon($this->st_Birthday);
        return $birthday->diffInYears($now);
    }

    public function getIndexAgeAttribute()
    {
        return $this->age;
    }

    public function getStaff2000StaffusSortAttribute()
    {
        $contract_sorted = [];
        foreach ($this->staff2000_staffus as $staffu){
            foreach ($staffu->staff2000_contracts as $contract){
                $contract_sorted[] = $contract;
            }
        }
        return collect($contract_sorted)->sortByDesc('2or_code');
    }

    public function getMailChimpLogsSortAttribute()
    {
        $contract_sorted = [];
        foreach ($this->staff2000_staffus_sort as $contract){
            foreach ($contract->mail_chimp_logs as $log){
                $contract_sorted[] = $log;
            }
        }
        return collect($contract_sorted)->sortByDesc('schedule_time');
    }

    public function getMailLastScheduleTimeAttribute()
    {
        return $this->mail_chimp_logs_sort->first()->schedule_time ?? '';
    }

    public function getValidatedLists($file)
    {
        $fields = [];
        $validateArr = $this->makeValidator();
        foreach ($file as $line) {
            mb_convert_variables('UTF-8', 'sjis-win', $line);
            if($file->key() === 0){
                foreach ($line as $fieldName){
                    $fieldCode = $this->getFieldCode($fieldName);
                    if(!$fieldCode){
                        $this->errors[] = 'フィールド名【'.$fieldName.'】に誤りがあります。';
                    }
                    $fields[] = $fieldCode;
                }
                if(count($this->errors) > 0){
                    return false;
                }
            } else {
                if(!$line) continue;
                if(count($fields) === count($line)){
                    $inputArray = collect($fields)->combine($line)->toArray();
                    if(isset($inputArray['co_id']) && !$inputArray['co_id']){
                        unset($inputArray['co_id']);
                    }
                    $validator = Validator::make($inputArray, $validateArr);
                    foreach ($validator->errors()->all() as $error){
                        $this->errors[] = $file->key().'行目：'.$error;
                    }
                    $lists[] = $inputArray;
                }else{
                    $this->errors[] = $file->key().'行目：項目数が一致しません。データを確認してください。';
                }
            }
        }
        if(count($this->errors) > 0){
            return false;
        }
        return $lists;
    }

    public function saveLists($lists)
    {
        foreach ($lists as $key => $list){
            if(isset($list['co_id']) && $list['co_id']){
                Company::updateOrCreate(
                    ['co_id' => $list['co_id']], $list
                );
            } else{
                Company::create($list);
            }
        }
    }

    public function getFieldName($columnName)
    {
        return self::FIELD_NAME[$columnName];
    }

    public function isDeleted()
    {
        if($this->st_Userpass === $this->getDeletedPass())
        {
            return true;
        }
        return false;
    }

    /**
     * 論理削除
     */
    public function disable()
    {
        foreach ($this->getFillable() as $column)
        {
            switch ($column)
            {
                case 'st_Userpass':
                    $this->setAttribute($column, $this->getDeletedPass());
                    break;
                case 'st_Mailad':
                    $this->setAttribute($column, $this->getDeletedPass() . $this->st_Id);
                    break;
                case 'st_Staffname':
                    $this->setAttribute($column, 'このスタッフは削除されました');
                    break;
                case 'st_Age':
                    $this->setAttribute($column, 0);
                    break;
                case 'st_Approach':
                case 'st_Birthday':
                case 'st_Fromdate':
                case 'st_Doukyo':
                case 'st_Genkyou':
                case 'st_Haigu':
                case 'st_Handyp':
                case 'st_Handypmail':
                case 'st_Jitumu':
                case 'st_Jitumuy':
                case 'st_Keikenbu':
                case 'st_Keikensyokusyu':
                case 'st_Kentou':
                case 'st_Kiboubu':
                case 'st_Kiboucad':
                case 'st_Kiboucity':
                case 'st_Kibousyokusyu':
                case 'st_Kibouzikyu':
                case 'st_Koutuu':
                case 'st_MailService':
                case 'st_Mypr':
                case 'st_Mypr_file':
                case 'st_Os':
                case 'st_Oubo':
                case 'st_ReissueFlag':
                case 'st_Rireki':
                case 'st_Sex':
                case 'st_Shigotosyokai':
                case 'st_Skcad':
                case 'st_Skill':
                case 'st_Staffaddress':
                case 'st_Staffaddress2':
                case 'st_Staffaddress3':
                case 'st_Staffcity':
                case 'st_Staffkana':
                case 'st_TempPass':
                case 'st_Yubin':
                case 'st_Zitaku':
                case 'st_Zkiboucad2':
                case 'st_Zkiboukeitai':
                case 'st_Zskcad2':
                case 'st_Zzaccess':
                case 'st_Zzaccess2':
                case 'st_ZzbDom':
                case 'st_ZzbHandypMailService':
                case 'st_Country':
                case 'st_StatusResidence':
                    $this->setAttribute($column, NULL);
                    break;
                case 'st_Id':
                case 'st_Usertype':
                case 'st_Createdate':
                default:
                    break;
            }
        }
        $this->save();
    }

    /**
     * NGスタッフの判定
     * @return bool
     */
    public function isNg()
    {
        return !is_null($this->status) && $this->status->ss_evaluate === 5;
    }

    /**
     * 所属する重複グループで最も大きいスタッフIDを取得
     * @return int|null
     */
    public function getDuplicatedStaffu()
    {
        $latest_id = $this->getLatestStaffuIdOfDuplicateGroup();
        return $latest_id;
    }

    /**
     * 所属する重複グループのインスタンスの配列をすべて取得
     * @return array
     */
    public function getStaffusArrayOfDuplicateGroup()
    {
        $staffus = [];
        if(!is_null($this->duplicate_staffu))
        {
            $duplicate_group_id = $this->duplicate_staffu->duplicate_group_id;
            $duplicate_staffu_ids = $this->duplicate_staffu->where('duplicate_group_id', $duplicate_group_id)
                ->orderby('staffu_id', 'desc')
                ->pluck('staffu_id')->toArray();
            $staffus = self::whereIn('st_Id', $duplicate_staffu_ids)
                ->orderby('st_Id', 'desc')
                ->get()->toArray();
        }
        return $staffus;
    }

    private static function getFieldCode($fieldName)
    {
        return array_search($fieldName, self::FIELD_NAME);
    }

    /*
     * バリデーション用の配列を生成
     * DB保存時で弾かれないかだけを判定する。
     *
     * @return
     */
    private function makeValidator()
    {
        $fields = Schema::getColumnListing($this->table);
        $validator = [];
        $dateField = ['date', 'datetime'];
        $numField = ['integer', 'bigint'];
        $boolField = ['boolean'];
        foreach ($fields as $key => $field){
            $fieldType = Schema::getColumnType($this->table, $field);
            if(in_array($fieldType, $numField)){
                $validator[$field] = 'integer';
            } elseif (in_array($fieldType, $dateField)) {
                $validator[$field] = 'date';
            } elseif(in_array($fieldType, $boolField)) {
                $validator[$field] = 'boolean';
            } else {
                $validator[$field] = 'string';
            }
        }
        $validator['co_name'] = 'required|string'; // co_nameのみ必須項目
        return $validator;
    }

    /*
     * staffu機能固有の検索条件を追加
     */
    public function scopeAddParticularCons($query)
    {
        $query->excludeDuplication();
    }

    /*
     * 経験年数の検索条件を追加
     */
    public function scopeAddExperienceConditions($query, $condition, $searchMethod)
    {
        $comparisonOperator = $condition['comparison_operator_id'] == CustomListCondition::INCLUDE_ALL ? 'where' : 'orWhere';
        $skills = [];
        foreach ($condition['condition'] as $con) {
            $skills[substr($con, 0, strpos($con, '：'))][] = $con;
        }
        $field = $condition['field'];
        $query->$searchMethod(function ($q) use ($skills, $field, $comparisonOperator) {
            foreach ($skills as $skill) {
                $q->$comparisonOperator(function ($q) use ($skill, $field) {
                    foreach ($skill as $val) {
                        $q->orWhere($field, 'like', '%' . $val . '%');
                    }
                });
            }
        });
    }

    /*
     * NGスタッフを除外
     */
    public function scopeExcludeNg($query)
    {
        return $query->where('tcd_status.ss_evaluate', '<>', 5)
                ->orwhereNull('tcd_status.ss_evaluate');
    }

    /*
     * 重複スタッフを除外
     */
    public function scopeExcludeDuplication($query)
    {
        return $query->leftJoin('duplicate_staffu as ds1', 'tcd_staffu_new.st_Id', '=', 'ds1.staffu_id')
            ->whereNotExists(function ($q) {
                $q->from('duplicate_staffu as ds2')
                    ->whereRaw('ds1.duplicate_group_id = ds2.duplicate_group_id')
                    ->whereRaw('ds1.staffu_id < ds2.staffu_id');
            });
    }

    private function getLatestStaffuIdOfDuplicateGroup()
    {
        $latest_id = NULL;
        if(!is_null($this->duplicate_staffu))
        {
            $duplicate_group_id = $this->duplicate_staffu->duplicate_group_id;
            $latest_id = $this->duplicate_staffu->where('duplicate_group_id', $duplicate_group_id)
                ->orderby('staffu_id', 'desc')
                ->first()->staffu_id;
        }
        return $latest_id;
    }

    public function scopeTcdStaffuHistoryShMyprSkcad($query, $condition, $searchMethod)
    {
        return $query->addExperienceConditions($condition, $searchMethod);
    }

    public function scopeTcdStaffuHistoryShMyprDesignSoft($query, $condition, $searchMethod)
    {
        return $query->addExperienceConditions($condition, $searchMethod);
    }

    public function scopeTcdStaffuHistoryShMyprKeikensyokusyu($query, $condition, $searchMethod)
    {
        return $query->addExperienceConditions($condition, $searchMethod);
    }

    public function scopeTcdStaffuHistoryShMyprOs($query, $condition, $searchMethod)
    {
        return $query->addExperienceConditions($condition, $searchMethod);
    }

    public function scopeTcdStaffuHistoryShMyprKeikenbu($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }
    public function scopeTcdStaffuHistoryShMyprCrtSkill($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }

    public function scopeStKiboubu($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }

    public function scopeStZkiboukeitai($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }

    public function scopeStKibousyokusyu($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }

    public function scopeStKiboucad($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }

    public function scopeStSex($query, $condition, $searchMethod)
    {
        return $query->addSelectedConditions($condition, $searchMethod);
    }

    // 一覧画面向けアクセサ
    public function getIndexTcdStaffuHistoryShMyprSkcadAttribute()
    {
        $field = 'tcd_staffu_history.sh_Mypr_Skcad';
        return $this->filterSkillByField($field);
    }

    public function getIndexTcdStaffuHistoryShMyprOsAttribute()
    {
        $field = 'tcd_staffu_history.sh_Mypr_Os';
        return $this->filterSkillByField($field);
    }

    public function getIndexTcdStaffuHistoryShMyprDesignSoftAttribute()
    {
        $field = 'tcd_staffu_history.sh_Mypr_design_soft';
        return $this->filterSkillByField($field);
    }

    public function getIndexTcdStaffuHistoryShMyprKeikensyokusyuAttribute()
    {
        $field = 'tcd_staffu_history.sh_Mypr_Keikensyokusyu';
        return $this->filterSkillByField($field);
    }

    private function filterSkillByField($field)
    {
        return implode($this->explodeSkills($this->$field), '<BR>' );
    }

    /**
     * @param string $value
     * @return array
     */
    private function explodeSkills($value):array
    {
        if (empty($value)) return [];
        $skills = explode('，', $value);
        foreach ($skills as $key => $skill){
            $val = explode('：', $skill);
            if(!isset($val[1]) || $val[1] === 'なし'){
                unset($skills[$key]);
            }
        }
        if(count($skills) > 0){
            return $skills;
        }
        return ['未経験'];
    }

    public function getIndexStIdAttribute()
    {
        return $this->getLinkHtml('staffu/view/'.$this->st_Id, $this->st_Id, true);
    }

    public function getStaffnameAndKanaAttribute():string
    {
        $value = $this->st_Staffname ?? '';
        $value .= $this->st_Staffkana ? "（{$this->st_Staffkana}）" : '';
        return $value;
    }

    public function getBirthdayAttribute(): string
    {
        return date('Y年n月d日', strtotime($this->st_Birthday)) ?? '';
    }

    public function getCreatedateAttribute():string
    {
        return date('Y-m-d H:i:s', strtotime($this->st_Createdate)) ?? '';
    }

    public function getUpdatedateAttribute():string
    {
        $updated = max([$this->st_Updatedate, $this->st_Createdate]);
        if($this->staffu_history){
            $updated = max([$this->staffu_history->sh_Updatedate, $this->staffu_history->sh_Createdate, $updated]);
        }
        return date('Y-m-d H:i:s', strtotime($updated)) ?? '';
    }

    public function getNgAttribute():string
    {
        return ($this->isNg()) ? 'NGスタッフ' : 'なし';
    }

    public function getNgCommentAttribute():string
    {
        return ($this->isNg() && $this->status->ss_inv_comment) ? $this->status->ss_inv_comment : '';
    }

    public function getMyprSkcadAttribute():string
    {
        $value = ($this->staffu_history->sh_Mypr_Skcad) ?? '';
        return $this->filterSkillSlash($value);
    }

    public function getMyprSkcadOtherAttribute():string
    {
        return $this->staffu_history->sh_Mypr_Skcad_other ?? '';
    }

    public function getMyprOsAttribute():string
    {
        $value = ($this->staffu_history->sh_Mypr_Os) ?? '';
        return $this->filterSkillSlash($value);
    }

    public function getMyprOsOtherAttribute():string
    {
        return $this->staffu_history->sh_Mypr_Os_other ?? '';
    }

    public function getMyprDesignSoftAttribute():string
    {
        $value = ($this->staffu_history->sh_Mypr_design_soft) ?? '';
        return $this->filterSkillSlash($value);
    }

    public function getMyprDesignSoftOtherAttribute():string
    {
        return $this->staffu_history->sh_Mypr_design_soft_other ?? '';
    }

    public function getMyprKeikensyokusyuAttribute():string
    {
        $value = ($this->staffu_history->sh_Mypr_Keikensyokusyu) ?? '';
        return $this->filterSkillSlash($value);
    }

    public function getMyprKeikensyokusyuOtherAttribute():string
    {
        return $this->staffu_history->sh_Mypr_Keikensyokusyu_other ?? '';
    }

    private function filterSkillSlash($value):string
    {
        return implode($this->explodeSkills($value), ' / ' );
    }

    public function getEducationAttribute():string
    {
        return $this->staffu_history->sh_education ?? '';
    }

    public function getMyprKeikenbuAttribute():string
    {
        return $this->staffu_history->sh_Mypr_Keikenbu ?? '';
    }

    public function getMyprKeikenbuOtherAttribute():string
    {
        return $this->staffu_history->sh_Mypr_Keikenbu_other ?? '';
    }

    public function getMyprCrtSkillAttribute():string
    {
        return $this->staffu_history->sh_Mypr_crt_skill ?? '';
    }

    public function getMyprCrtSkillOtherAttribute():string
    {
        return $this->staffu_history->sh_Mypr_crt_skill_other ?? '';
    }

    public function getMyprEgSkillAttribute():string
    {
        return $this->staffu_history->sh_Mypr_eg_skill ?? '';
    }

    public function getMyprTecSkillAttribute():string
    {
        return $this->staffu_history->sh_Mypr_tec_skill ?? '';
    }

    public function getMyprTflSkillAttribute():string
    {
        return $this->staffu_history->sh_Mypr_tfl_skill ?? '';
    }

    public function getBusinessCareerAttribute():string
    {
        return $this->staffu_history->sh_business_career ?? '';
    }

    public function getBusinessCareerFileAttribute():string
    {
        return $this->staffu_history->sh_business_career_file ?? '';
    }

    public function getMyprKibounensyuAttribute():string
    {
        return $this->staffu_history->sh_Mypr_Kibounensyu ?? '';
    }

    public function getUpdateFlgAttribute():string
    {
        return $this->staffu_history->sh_Update_flg ?? '';
    }

    public function getShigotosyokaiAttribute():string
    {
        if (empty($this->st_Shigotosyokai)) return '';
        $exploded = explode('[]', $this->st_Shigotosyokai);
        if(count($exploded) === 8){
            $res = '【不使用】Q1.今後はどのような仕事をしたいですか？仕事の目標や夢はありますか？<BR>';
            $res .= $exploded[0].'<BR><BR>';
            $res .= '【不使用】Q2.長期と短期のどちらが希望ですか？<BR>';
            $res .= $exploded[1].'<BR><BR>';
            $res .= '【不使用】Q3.希望の勤務地（通勤時間）はどのあたりですか？<BR>';
            $res .= $exploded[2].'<BR><BR>';
            $res .= '【不使用】Q4.希望の時給はどれくらですか？（※社会保険加入は必修になります）<BR>';
            $res .= $exploded[3].'<BR><BR>';
            $res .= '【不使用】Q5.残業が多い仕事と少ない仕事のどちらが希望ですか？何時間くらいですか？<BR>';
            $res .= $exploded[4].'<BR><BR>';
            $res .= '【不使用】Q6.仕事を選択する際の条件で優先順はどうですか？<BR>';
            $res .= $exploded[5].'<BR><BR>';
            $res .= '【不使用】Q7.連絡がとれやすい時間帯は？<BR>';
            $res .= $exploded[6].'<BR><BR>';
            $res .= '希望内容<BR>';
            $res .= $exploded[7].'<BR><BR>';
            return $res;
        }
        return $this->st_Shigotosyokai;
    }

    public function getBusinessnameAndKanaAttribute():string
    {
        $value = $this->st_businessname ?? '';
        $value .= $this->st_businesskana ? "（{$this->st_businesskana}）" : '';
        return $value;
    }

    public function getIndexTcdStatusSsStatusAttribute():string
    {
        return $this->status->status ?? '';
    }

    public function getIndexTcdStatusSsEvaluateAttribute():string
    {
        return $this->status->evaluate_label ?? '';
    }

    // 編集画面向けアクセサ
    public function getShigotoQ1Attribute()
    {
        return $this->getShigoto(0);
    }

    public function getShigotoQ2Attribute()
    {
        return $this->getShigoto(1);
    }

    public function getShigotoQ3Attribute()
    {
        return $this->getShigoto(2);
    }

    public function getShigotoQ4Attribute()
    {
        return $this->getShigoto(3);
    }

    public function getShigotoQ5Attribute()
    {
        return $this->getShigoto(4);
    }

    public function getShigotoQ6Attribute()
    {
        return $this->getShigoto(5);
    }

    public function getShigotoQ7Attribute()
    {
        return $this->getShigoto(6);
    }

    public function getShigotoQ8Attribute()
    {
        $other = $this->getShigoto(7);
        if(!$other && count(explode('[]', $this->st_Shigotosyokai)) !== 8) {
            $other = $this->st_Shigotosyokai;
        }
        return $other;
    }

    public function getShigoto($key)
    {
        $dum = explode('[]', $this->st_Shigotosyokai);
        if (count($dum) === 8) {
            return $dum[$key];
        } else {
            return '';
        }
    }

    public function skCadChecked($value)
    {
        return $this->checked($this->staffu_history->sh_Mypr_Skcad ?? '', $value);
    }

    public function pcSoftChecked($value)
    {
        return $this->checked($this->staffu_history->sh_Mypr_Os ?? '', $value);
    }

    public function shokushuCheck($value)
    {
        return $this->checked($this->staffu_history->sh_Mypr_Keikensyokusyu ?? '', $value);
    }

    public function designSoftCheck($value)
    {
        return $this->checked($this->staffu_history->sh_Mypr_design_soft ?? '', $value);
    }

    public function keikenbuCheck($value)
    {
        return $this->checked($this->staffu_history->sh_Mypr_Keikenbu ?? '', $value);
    }

    public function skillCheck($value)
    {
        return $this->checked($this->staffu_history->sh_Mypr_crt_skill ?? '', $value);
    }

    public function kiboubuCheck($value)
    {
        return $this->checked($this->st_Kiboubu ?? '', $value);
    }

    private function checked($registered, $value)
    {
        $exploded = explode('，', $registered);
        if(in_array($value, $exploded))return 'checked';
    }

    public function getData($raw_data)
    {
        $data = [];
        $data['staffu_history'] = [];
        foreach ($raw_data as $key => $value){
            if(substr($key, 0, 18) === 'tcd_staffu_history'){
                $key = substr($key, 19);
                $data['staffu_history'][$key] = $value;
            }else {
                $data[$key] = $value;
            }
        }
        return $data;
    }

    public function fillStaffu($raw_data){
        $data = [];
        foreach ($raw_data as $key => $value){
            if($key === 'st_Shigotosyokai'){
                $data[$key] = implode('[]', $value);
            }elseif($key !== 'staffu_history' && is_array($value)){
                $data[$key] = implode('，', $value);
            }else{
                $data[$key] = $value;
            }
        }
        $this->fill($data);
        return $this;
    }

    public function saveDuplication($duplications_input)
    {
        if(is_null($duplications_input)){
            $duplications_input = [];
        }

        $group_id_array = [];
        $instances = [];

        $duplications_input = array_unique($duplications_input);
        if($this->duplicate_staffu){ // 既に自身が重複グループに登録されている
            $group_id = $this->duplicate_staffu->duplicate_group_id;
            foreach ($this->duplicate_staffu->duplications as $duplication_registered){
                $staffu_id = $duplication_registered->staffu_id;
                if(!in_array($staffu_id, $duplications_input)){
                    // 保存があって入力がない場合は消す
                    $duplication_registered->delete();
                }
            }

            foreach ($duplications_input as $key => $duplicate_staffu_id){
                $registered_duplication = DuplicateStaffu::where('staffu_id', '=', $duplicate_staffu_id)->first();
                if($registered_duplication){
                    $instances[] = $registered_duplication;
                }else{
                    $duplicationStaffu = new DuplicateStaffu();
                    $instances[] = $duplicationStaffu->fill(['staffu_id' => $duplicate_staffu_id]);
                }
            }
        }else{ // 重複グループに登録されていない
            $self = new DuplicateStaffu();
            $instances[] = $self->fill(['staffu_id' => $this->st_Id]);
            foreach ($duplications_input as $duplication_staffu_id){
                // 重複登録しようとしているスタッフがすでにどこかの重複グループに属していないか確認
                $registered_duplication = DuplicateStaffu::where('staffu_id', '=', $duplication_staffu_id)->first();
                if($registered_duplication){
                    $group_id_array[] = $registered_duplication->duplicate_group_id;
                    $instances[] = $registered_duplication;
                }else{
                    $duplicationStaffu = new DuplicateStaffu();
                    $instances[] = $duplicationStaffu->fill(['staffu_id' => $duplication_staffu_id]);
                }
            }
            if(count(array_unique($group_id_array)) === 1){
                $group_id = $group_id_array[0];
            }else{
                $latest_duplicate_group = DuplicateStaffu::orderby('duplicate_group_id', 'desc')->first();
                if($latest_duplicate_group){
                    $group_id = $latest_duplicate_group->duplicate_group_id+1;
                }else{
                    $group_id = 1;
                }
            }
        }

        foreach ($instances as $instance){
            $instance->fill(['duplicate_group_id' => $group_id])->save();
        }
    }

    public function saveFiles($staffu_data)
    {
        if(isset($staffu_data['staffu_history']['sh_business_career_file'])){
            if($this->staffu_history && $this->staffu_history->sh_business_career_file){
                if(\File::exists($_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$this->staffu_history->sh_business_career_file)){
                    unlink($_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$this->staffu_history->sh_business_career_file);
                }
            }
            $filename = date('YmdHis').'履歴_'.$staffu_data['staffu_history']['sh_business_career_file']->getClientOriginalName();
            $staffu_data['staffu_history']['sh_business_career_file']->storeAs('tmp/', $filename);
            $staffu_data['staffu_history']['sh_business_career_file'] = $filename;
            rename(storage_path('app/tmp/').$filename, $_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$filename);
        }

        if(isset($staffu_data['st_Mypr_file'])){
            if($this->st_Mypr_file){
                if(\File::exists($_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$this->st_Mypr_file)){
                    unlink($_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$this->st_Mypr_file);
                }
            }
            $filename = date('YmdHis').'自己PR_'.$staffu_data['st_Mypr_file']->getClientOriginalName();
            $staffu_data['st_Mypr_file']->storeAs('tmp/', $filename);
            $staffu_data['st_Mypr_file'] = $filename;
            rename(storage_path('app/tmp/').$filename, $_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$filename);
        }
        return $staffu_data;
    }

    public static function deleteFile($requests = [])
    {
        $id = $requests['id'];
        $field = $requests['field'];
        if($field === 'sh_business_career_file'){
            $model = StaffuHistory::find($id);
        }elseif($field === 'st_Mypr_file'){
            $model = Staffu::find($id);
        }
        $filename = $model->$field;
        $saveSuccess = $model->setAttribute($field, '')->save();
        if($saveSuccess){
            if((\File::exists($_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$filename))){
                return unlink($_SERVER['DOCUMENT_ROOT'].'/assets/files/'.$filename);
            }
        }
        return $saveSuccess;
    }
}
