diff --git a/app/Http/Controllers/Admin/ContractorController.php b/app/Http/Controllers/Admin/ContractorController.php index eaf43bf..1365137 100644 --- a/app/Http/Controllers/Admin/ContractorController.php +++ b/app/Http/Controllers/Admin/ContractorController.php @@ -14,6 +14,7 @@ class ContractorController extends Controller public function list(Request $request) { $q = DB::table('regular_contract as rc') + ->leftJoin('user as u','rc.user_id','=','u.user_id') ->select([ 'rc.contract_id', 'rc.contract_qr_id', @@ -52,37 +53,110 @@ class ContractorController extends Controller 'u.user_workplace', 'u.user_school', 'u.user_remarks', - // 他に必要なカラムもここに追加 + 'u.user_tag_serial_64', + 'u.user_reduction', + DB::raw('rc.user_securitynum as crime_prevention'), + DB::raw('rc.contract_seal_issue as seal_issue_count'), + DB::raw("CASE rc.enable_months + WHEN 1 THEN '月極(1ヶ月)' + WHEN 3 THEN '3ヶ月' + WHEN 6 THEN '6ヶ月' + WHEN 12 THEN '年' + ELSE CONCAT(rc.enable_months, 'ヶ月') END as ticket_type"), + DB::raw('ps.psection_subject as vehicle_type'), + // 利用者分類名(usertype テーブル) + DB::raw('ut.usertype_subject1 as user_category1'), + DB::raw('ut.usertype_subject2 as user_category2'), + DB::raw('ut.usertype_subject3 as user_category3'), ]) ->leftJoin('park as p', 'rc.park_id', '=', 'p.park_id') - ->leftJoin('user as u', 'rc.user_id', '=', 'u.user_id'); + ->leftJoin('psection as ps', 'rc.psection_id', '=', 'ps.psection_id') + ->leftJoin('usertype as ut', 'u.user_categoryid', '=', 'ut.user_categoryid'); - // 検索条件例 - if ($request->filled('contract_id')) { - $q->where('rc.contract_id', $request->input('contract_id')); + // ===== 絞り込み条件 ===== + // 駐輪場 + if ($request->filled('park_id')) { + $q->where('rc.park_id', $request->park_id); } - if ($request->filled('name')) { - $q->where('u.user_name', 'like', '%' . $request->input('name') . '%'); + // 利用者ID(完全一致) + if ($request->filled('user_id')) { + $q->where('rc.user_id', $request->user_id); } - // タグ・QR(完全一致、空白なら絞り込まない) - if ($request->filled('tag_qr_flag') && $request->input('tag_qr_flag') !== '') { - $q->where('rc.tag_qr_flag', $request->input('tag_qr_flag')); + // 分類名1(完全一致): ut.usertype_subject1 = 入力値 + if ($request->filled('user_category1')) { + $q->where('ut.usertype_subject1', $request->user_category1); + } + // タグシリアル64進(部分一致) + if ($request->filled('user_tag_serial_64')) { + $val = $request->user_tag_serial_64; + $q->where('u.user_tag_serial_64','like','%'.$val.'%'); + } + // 有効期限(契約有効期間 終了日:指定日以前を抽出) + if ($request->filled('contract_periode')) { + $raw = trim($request->contract_periode); + $norm = str_replace('/', '-', $raw); // スラッシュ入力許容 + try { + $target = \Carbon\Carbon::parse($norm)->format('Y-m-d'); + // 指定日 “以前” を含む (以前のみなら '<' に変更) + $q->whereDate('rc.contract_periode', '>=', $target); + } catch (\Exception $e) { + // 不正日付は無視 + } + } + // フリガナ(部分一致) + if ($request->filled('user_phonetic')) { + $q->where('u.user_phonetic', 'like', '%' . $request->user_phonetic . '%'); + } + // 携帯電話(部分一致) + if ($request->filled('user_mobile')) { + $q->where('u.user_mobile', 'like', '%' . $request->user_mobile . '%'); + } + // メール(部分一致) + if ($request->filled('user_primemail')) { + $q->where('u.user_primemail', 'like', '%' . $request->user_primemail . '%'); + } + // 勤務先(部分一致) + if ($request->filled('user_workplace')) { + $q->where('u.user_workplace', 'like', '%' . $request->user_workplace . '%'); + } + // 学校(部分一致) + if ($request->filled('user_school')) { + $q->where('u.user_school', 'like', '%' . $request->user_school . '%'); + } + // タグ・QR(完全一致) + if ($request->filled('tag_qr_flag') && $request->tag_qr_flag !== '') { + $q->where('rc.tag_qr_flag', $request->tag_qr_flag); } // ソート処理 - $sort = $request->input('sort', 'rc.contract_id'); - $sortType = $request->input('sort_type', 'desc'); - // カラム名のバリデーション(必要に応じて拡張) - $allowSorts = ['rc.contract_id']; - if (!in_array($sort, $allowSorts)) { - $sort = 'rc.contract_id'; + // パラメータが来た時だけ適用。未指定なら主キー昇順 + $sort = $request->input('sort'); // null 許容 + $sortType = $request->input('sort_type','asc'); + + $allowSorts = [ + 'rc.contract_id', + 'rc.user_id', + 'u.user_name', + 'rc.tag_qr_flag', + 'p.park_name', + ]; + if ($sort && in_array($sort, $allowSorts)) { + $sortType = $sortType === 'desc' ? 'desc' : 'asc'; + $q->orderBy($sort, $sortType); + } else { + // 初期表示は契約ID昇順 (物理順に近い) + $sort = null; + $sortType = null; + $q->orderBy('rc.contract_id','asc'); } - $sortType = ($sortType === 'asc') ? 'asc' : 'desc'; - $rows = $q->orderBy($sort, $sortType)->paginate(20)->withQueryString(); + $rows = $q->paginate(20)->appends($request->query()); - return view('admin.contractor.list', compact('rows', 'sort', 'sortType')); + // 駐輪場セレクト用 + $parks = DB::table('park')->select('park_id', 'park_name')->orderBy('park_name')->get(); + + return view('admin.contractor.list', compact('rows', 'sort', 'sortType', 'parks')); } /** diff --git a/app/Http/Controllers/Admin/ContractorListController.php b/app/Http/Controllers/Admin/ContractorListController.php index 2b5f27f..ae1ae7c 100644 --- a/app/Http/Controllers/Admin/ContractorListController.php +++ b/app/Http/Controllers/Admin/ContractorListController.php @@ -9,11 +9,12 @@ use Illuminate\Support\Facades\DB; class ContractorListController extends Controller { /** - * 一覧表示(GET/POST) + * 未更新者一覧 (contract_renewal IS NULL) */ public function list(Request $request) { $q = DB::table('regular_contract as rc') + ->leftJoin('user as u','rc.user_id','=','u.user_id') ->select([ 'rc.contract_id', 'rc.contract_qr_id', @@ -33,7 +34,6 @@ class ContractorListController extends Controller 'rc.contract_manual', 'rc.contract_notice', 'p.park_name', - // userテーブルの正しいカラム名 'u.user_name', 'u.user_phonetic', 'u.user_mobile', @@ -53,64 +53,110 @@ class ContractorListController extends Controller 'u.user_workplace', 'u.user_school', 'u.user_remarks', - // 他に必要なカラムもここに追加 + 'u.user_tag_serial_64', + 'u.user_reduction', + DB::raw('rc.user_securitynum as crime_prevention'), + DB::raw('rc.contract_seal_issue as seal_issue_count'), + DB::raw("CASE rc.enable_months + WHEN 1 THEN '月極(1ヶ月)' + WHEN 3 THEN '3ヶ月' + WHEN 6 THEN '6ヶ月' + WHEN 12 THEN '年' + ELSE CONCAT(rc.enable_months, 'ヶ月') END as ticket_type"), + DB::raw('ps.psection_subject as vehicle_type'), + // 利用者分類名(usertype テーブル) + DB::raw('ut.usertype_subject1 as user_category1'), + DB::raw('ut.usertype_subject2 as user_category2'), + DB::raw('ut.usertype_subject3 as user_category3'), ]) ->leftJoin('park as p', 'rc.park_id', '=', 'p.park_id') - ->leftJoin('user as u', 'rc.user_id', '=', 'u.user_id'); + ->leftJoin('psection as ps', 'rc.psection_id', '=', 'ps.psection_id') + ->leftJoin('usertype as ut', 'u.user_categoryid', '=', 'ut.user_categoryid'); - // 検索条件例 - if ($request->filled('contract_id')) { - $q->where('rc.contract_id', $request->input('contract_id')); + // ===== 絞り込み条件 ===== + // 駐輪場 + if ($request->filled('park_id')) { + $q->where('rc.park_id', $request->park_id); } - if ($request->filled('name')) { - $q->where('u.user_name', 'like', '%' . $request->input('name') . '%'); + // 利用者ID(完全一致) + if ($request->filled('user_id')) { + $q->where('rc.user_id', $request->user_id); + } + // 分類名1(完全一致) + if ($request->filled('user_category1')) { + $q->where('ut.usertype_subject1', $request->user_category1); + } + // タグシリアル64進(部分一致) + if ($request->filled('user_tag_serial_64')) { + $val = $request->user_tag_serial_64; + $q->where('u.user_tag_serial_64','like','%'.$val.'%'); + } + // 有効期限(契約有効期間 終了日:指定日以前を抽出) + if ($request->filled('contract_periode')) { + $raw = trim($request->contract_periode); + $norm = str_replace('/', '-', $raw); // スラッシュ入力許容 + try { + $target = \Carbon\Carbon::parse($norm)->format('Y-m-d'); + // 指定日 “以前” を含む (以前のみなら '<' に変更) + $q->whereDate('rc.contract_periode', '>=', $target); + } catch (\Exception $e) { + // 不正日付は無視 + } + } + // フリガナ(部分一致) + if ($request->filled('user_phonetic')) { + $q->where('u.user_phonetic', 'like', '%' . $request->user_phonetic . '%'); + } + // 携帯電話(部分一致) + if ($request->filled('user_mobile')) { + $q->where('u.user_mobile', 'like', '%' . $request->user_mobile . '%'); + } + // メール(部分一致) + if ($request->filled('user_primemail')) { + $q->where('u.user_primemail', 'like', '%' . $request->user_primemail . '%'); + } + // 勤務先(部分一致) + if ($request->filled('user_workplace')) { + $q->where('u.user_workplace', 'like', '%' . $request->user_workplace . '%'); + } + // 学校(部分一致) + if ($request->filled('user_school')) { + $q->where('u.user_school', 'like', '%' . $request->user_school . '%'); + } + // タグ・QR(完全一致) + if ($request->filled('tag_qr_flag') && $request->tag_qr_flag !== '') { + $q->where('rc.tag_qr_flag', $request->tag_qr_flag); } - // タグ・QR(完全一致、空白なら絞り込まない) - if ($request->filled('tag_qr_flag') && $request->input('tag_qr_flag') !== '') { - $q->where('rc.tag_qr_flag', $request->input('tag_qr_flag')); + // ---- ソート ---- + $sort = $request->input('sort',''); // 初期は未指定 + $sortType = $request->input('sort_type','asc'); + $allowSorts = [ + 'user_id' => 'rc.user_id', + 'user_name' => 'u.user_name', + 'contract_id' => 'rc.contract_id', + 'tag_qr_flag' => 'rc.tag_qr_flag', + 'park_name' => 'p.park_name', + ]; + if($sort !== '' && isset($allowSorts[$sort])){ + $sortType = $sortType === 'desc' ? 'desc' : 'asc'; + $q->orderBy($allowSorts[$sort], $sortType) + ->orderBy('rc.contract_id','asc'); // セカンダリ安定 + } else { + // 初期表示: DB登録順の近似(PK昇順) + $sort = ''; // Blade 側で未ソート状態 + $q->orderBy('rc.contract_id','asc'); } - // ソート処理 - $sort = $request->input('sort', 'rc.contract_id'); - $sortType = $request->input('sort_type', 'desc'); - // カラム名のバリデーション(必要に応じて拡張) - $allowSorts = ['rc.contract_id']; - if (!in_array($sort, $allowSorts)) { - $sort = 'rc.contract_id'; - } - $sortType = ($sortType === 'asc') ? 'asc' : 'desc'; + // 駐輪場選択 + $parks = DB::table('park') + ->select('park_id','park_name') + ->orderBy('park_name') + ->orderBy('park_id') + ->get(); - $rows = $q->orderBy($sort, $sortType)->paginate(20)->withQueryString(); + $rows = $q->paginate(20)->appends($request->query()); - return view('admin.contractor_list.list', compact('rows', 'sort', 'sortType')); - } - - /** - * 詳細表示 - */ - public function info($id) - { - $contract = DB::table('regular_contract as rc') - ->select([ - 'rc.*', - 'p.park_name', - 'u.user_name', - 'u.user_phonetic', - 'u.user_mobile', - 'u.user_homephone', - 'u.user_primemail', - 'u.user_gender', - 'u.user_birthdate', - 'u.user_regident_city', - ]) - ->leftJoin('park as p', 'rc.park_id', '=', 'p.park_id') - ->leftJoin('user as u', 'rc.user_id', '=', 'u.user_id') - ->where('rc.contract_id', $id) - ->first(); - - if (!$contract) { abort(404); } - - return view('admin.contractor.info', compact('contract')); + return view('admin.contractor_list.list', compact('rows','sort','sortType','parks')); } } diff --git a/resources/views/admin/contractor/list.blade.php b/resources/views/admin/contractor/list.blade.php index e1b8a0e..d50052d 100644 --- a/resources/views/admin/contractor/list.blade.php +++ b/resources/views/admin/contractor/list.blade.php @@ -23,7 +23,9 @@
{{-- 絞り込みフィルター --}} -
+ + +
絞り込みフィルター
@@ -36,8 +38,7 @@ +
- +
- +
@@ -118,9 +121,9 @@
@@ -138,98 +141,116 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @php($activeSort = request('sort')) + @php($activeType = request('sort_type')) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @forelse ($rows as $row) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @empty - - - - @endforelse + @forelse ($rows as $row) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @empty + + + + @endforelse
利用者ID氏名フリガナ - - 定期契約ID - @if(request('sort') === 'rc.contract_id') - @if(request('sort_type') === 'asc') - ▲ - @else - ▼ - @endif - @endif - - タグ・QR駐輪場車種区分減免措置利用者分類1利用者分類2利用者分類3携帯電話番号自宅電話番号生年月日性別居住所:郵便番号居住所:都道府県居住所:市区群居住所:住所関連住所:郵便番号関連住所:都道府県関連住所:市区群関連住所:住所契約日利用期間有効期間定期券区分勤務先名学校卒業予定シール発行回数防犯登録備考
+ 利用者ID + + 氏名 + フリガナ + 定期契約ID + + タグ・QR + + 駐輪場 + 車種区分減免措置利用者分類1利用者分類2利用者分類3携帯電話番号自宅電話番号生年月日性別居住所:郵便番号居住所:都道府県居住所:市区群居住所:住所関連住所:郵便番号関連住所:都道府県関連住所:市区群関連住所:住所契約日利用期間有効期間定期券区分勤務先名学校卒業予定シール発行回数防犯登録備考
{{ $row->user_id }}{{ $row->user_name }}{{ $row->user_phonetic }}{{ $row->contract_id }}{{ $row->tag_qr_flag ? 'QR' : 'タグ' }}{{ $row->park_name }}{{ $row->vehicle_type ?? '' }}{{ $row->user_reduction ?? '' }}{{ $row->user_category1 ?? '' }}{{ $row->user_category2 ?? '' }}{{ $row->user_category3 ?? '' }}{{ $row->user_mobile }}{{ $row->user_homephone }}{{ $row->user_birthdate }}{{ $row->user_gender }}{{ $row->user_regident_zip }}{{ $row->user_regident_pre }}{{ $row->user_regident_city }}{{ $row->user_regident_add }}{{ $row->user_relate_zip }}{{ $row->user_relate_pre }}{{ $row->user_relate_city }}{{ $row->user_relate_add }}{{ $row->contract_created_at }}{{ $row->contract_periods }}{{ $row->contract_periode }}{{ $row->ticket_type ?? '' }}{{ $row->user_workplace }}{{ $row->user_school }}{{ $row->user_graduate }}{{ $row->seal_issue_count ?? '' }}{{ $row->crime_prevention ?? '' }}{{ $row->user_remarks }}
データがありません。
{{ $row->user_id }}{{ $row->user_name }}{{ $row->user_phonetic }}{{ $row->contract_id }}{{ $row->tag_qr_flag ? 'QR' : 'タグ' }}{{ $row->park_name }}{{ $row->vehicle_type ?? '' }}{{ $row->user_reduction ?? '' }}{{ $row->user_category1 ?? '' }}{{ $row->user_category2 ?? '' }}{{ $row->user_category3 ?? '' }}{{ $row->user_mobile }}{{ $row->user_homephone }}{{ $row->user_birthdate }}{{ $row->user_gender }}{{ $row->user_regident_zip }}{{ $row->user_regident_pre }}{{ $row->user_regident_city }}{{ $row->user_regident_add }}{{ $row->user_relate_zip }}{{ $row->user_relate_pre }}{{ $row->user_relate_city }}{{ $row->user_relate_add }}{{ $row->contract_created_at }}{{ $row->contract_periods }}{{ $row->contract_periode }}{{ $row->ticket_type ?? '' }}{{ $row->user_workplace }}{{ $row->user_school }}{{ $row->user_graduate }}{{ $row->seal_issue_count ?? '' }}{{ $row->crime_prevention ?? '' }}{{ $row->user_remarks }}
データがありません。
@@ -242,13 +263,68 @@ {{-- 画面用スタイル(表頭をグレー、データ部分を白) --}} -@endsection +@push('scripts') + +@endpush +@endsection \ No newline at end of file diff --git a/resources/views/admin/contractor_list/list.blade.php b/resources/views/admin/contractor_list/list.blade.php index 895eaa7..e2001d3 100644 --- a/resources/views/admin/contractor_list/list.blade.php +++ b/resources/views/admin/contractor_list/list.blade.php @@ -23,7 +23,9 @@
{{-- 絞り込みフィルター --}} - + + +
絞り込みフィルター
@@ -36,8 +38,7 @@ +
- +
- +
@@ -118,9 +123,9 @@
@@ -128,8 +133,8 @@
- - 解除 + + 解除
@@ -138,98 +143,116 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @php($activeSort = request('sort')) + @php($activeType = request('sort_type')) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - @forelse ($rows as $row) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @empty - - - - @endforelse + @forelse ($rows as $row) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @empty + + + + @endforelse
利用者ID氏名フリガナ - - 定期契約ID - @if(request('sort') === 'contract_id') - @if(request('sort_type') === 'asc') - ▲ - @else - ▼ - @endif - @endif - - タグ・QR駐輪場車種区分減免措置利用者分類1利用者分類2利用者分類3携帯電話番号自宅電話番号生年月日性別居住所:郵便番号居住所:都道府県居住所:市区群居住所:住所関連住所:郵便番号関連住所:都道府県関連住所:市区群関連住所:住所契約日利用期間有効期間定期券区分勤務先名学校卒業予定シール発行回数防犯登録備考
+ 利用者ID + + 氏名 + フリガナ + 定期契約ID + + タグ・QR + + 駐輪場 + 車種区分減免措置利用者分類1利用者分類2利用者分類3携帯電話番号自宅電話番号生年月日性別居住所:郵便番号居住所:都道府県居住所:市区群居住所:住所関連住所:郵便番号関連住所:都道府県関連住所:市区群関連住所:住所契約日利用期間有効期間定期券区分勤務先名学校卒業予定シール発行回数防犯登録備考
{{ $row->user_id }}{{ $row->user_name }}{{ $row->user_phonetic }}{{ $row->contract_id }}{{ $row->tag_qr_flag ? 'QR' : 'タグ' }}{{ $row->park_name }}{{ $row->vehicle_type ?? '' }}{{ $row->user_reduction ?? '' }}{{ $row->user_category1 ?? '' }}{{ $row->user_category2 ?? '' }}{{ $row->user_category3 ?? '' }}{{ $row->user_mobile }}{{ $row->user_homephone }}{{ $row->user_birthdate }}{{ $row->user_gender }}{{ $row->user_regident_zip }}{{ $row->user_regident_pre }}{{ $row->user_regident_city }}{{ $row->user_regident_add }}{{ $row->user_relate_zip }}{{ $row->user_relate_pre }}{{ $row->user_relate_city }}{{ $row->user_relate_add }}{{ $row->contract_created_at }}{{ $row->contract_periods }}{{ $row->contract_periode }}{{ $row->ticket_type ?? '' }}{{ $row->user_workplace }}{{ $row->user_school }}{{ $row->user_graduate }}{{ $row->seal_issue_count ?? '' }}{{ $row->crime_prevention ?? '' }}{{ $row->user_remarks }}
データがありません。
{{ $row->user_id }}{{ $row->user_name }}{{ $row->user_phonetic }}{{ $row->contract_id }}{{ $row->tag_qr_flag ? 'QR' : 'タグ' }}{{ $row->park_name }}{{ $row->vehicle_type ?? '' }}{{ $row->user_reduction ?? '' }}{{ $row->user_category1 ?? '' }}{{ $row->user_category2 ?? '' }}{{ $row->user_category3 ?? '' }}{{ $row->user_mobile }}{{ $row->user_homephone }}{{ $row->user_birthdate }}{{ $row->user_gender }}{{ $row->user_regident_zip }}{{ $row->user_regident_pre }}{{ $row->user_regident_city }}{{ $row->user_regident_add }}{{ $row->user_relate_zip }}{{ $row->user_relate_pre }}{{ $row->user_relate_city }}{{ $row->user_relate_add }}{{ $row->contract_created_at }}{{ $row->contract_periods }}{{ $row->contract_periode }}{{ $row->ticket_type ?? '' }}{{ $row->user_workplace }}{{ $row->user_school }}{{ $row->user_graduate }}{{ $row->seal_issue_count ?? '' }}{{ $row->crime_prevention ?? '' }}{{ $row->user_remarks }}
データがありません。
@@ -242,13 +265,68 @@ {{-- 画面用スタイル(表頭をグレー、データ部分を白) --}} -@endsection +@push('scripts') + +@endpush +@endsection \ No newline at end of file