diff --git a/app/Http/Controllers/Admin/ParkController.php b/app/Http/Controllers/Admin/ParkController.php index 8436999..12a3fc9 100644 --- a/app/Http/Controllers/Admin/ParkController.php +++ b/app/Http/Controllers/Admin/ParkController.php @@ -20,18 +20,21 @@ class ParkController extends Controller /** * 一覧 + * Route: GET /parks name=parks -> list() */ - public function index(ParkRequest $request) + public function list(ParkRequest $request) { $filters = $request->filters(); - $parks = $this->parkService->paginate($filters, 20); + $parks = $this->parkService->paginate($filters, \App\Utils::item_per_page); + $cities = City::orderBy('city_id')->get(); $sort = $filters['sort'] ?? 'p.park_id'; $sort_type = $filters['sort_type'] ?? 'asc'; - return view('admin.parks.index', compact( + // list.blade.php + return view('admin.parks.list', compact( 'parks', 'cities', 'sort', @@ -41,16 +44,19 @@ class ParkController extends Controller /** * 新規(画面) + * Route: GET /parks/add name=parks.add -> add() */ - public function create() + public function add() { $cities = City::orderBy('city_id')->get(); - return view('admin.parks.create', compact('cities')); + // add.blade.php + return view('admin.parks.add', compact('cities')); } /** * 新規(登録) + * Route: POST /parks/add name=parks.store -> store() */ public function store(ParkRequest $request) { @@ -70,28 +76,29 @@ class ParkController extends Controller ); return redirect() - ->route('parks.index') + ->route('parks') ->with('success', __('新規登録に完了しました。')); } - /** * 編集(画面) + * Route: GET /parks/edit/{id} name=parks.edit -> edit() */ public function edit(int $id) { $record = $this->parkService->findOrFail($id); $cities = City::orderBy('city_id')->get(); + // edit.blade.php return view('admin.parks.edit', compact( 'record', 'cities' )); } - /** * 編集(更新) + * Route: PUT /parks/edit/{id} name=parks.update -> update() */ public function update(ParkRequest $request, int $id) { @@ -103,41 +110,39 @@ class ParkController extends Controller // 駐輪場五十音を設定 $payload['park_syllabary'] = $this->toSyllabaryGroup( - $payload['park_ruby'] ?? null); + $payload['park_ruby'] ?? null + ); - // 駐輪場五十音を設定してから Service に渡す - $this->parkService->update( - $park, $payload, $operatorId); - + // ※二重更新をやめる(payload 上書き事故防止) $this->parkService->update( $park, - $request->payload(), + $payload, $operatorId ); return redirect() - ->route('parks.index') + ->route('parks') ->with('success', __('更新に成功しました。')); } - /** * 削除(複数) + * Route: POST /parks/delete name=parks.delete -> delete() */ - public function destroy(Request $request) + public function delete(Request $request) { $ids = (array) $request->input('pk', []); if (empty($ids)) { return redirect() - ->route('parks.index') + ->route('parks') ->with('error', __('削除するデータを選択してください。')); } $ok = $this->parkService->deleteByIds($ids); return redirect() - ->route('parks.index') + ->route('parks') ->with( $ok ? 'success' : 'error', $ok ? __('削除が完了しました。') : __('削除に失敗しました。') @@ -146,6 +151,7 @@ class ParkController extends Controller /** * CSV 出力 + * Route: GET /parks/export name=parks.export -> export() */ public function export(): StreamedResponse { @@ -236,6 +242,7 @@ class ParkController extends Controller /** * 重複チェック(AJAX) + * Route: POST /parks/check-duplicate name=parks.check_duplicate -> checkDuplicate() */ public function checkDuplicate(Request $request) { @@ -268,7 +275,7 @@ class ParkController extends Controller // 先取第1文字(UTF-8) $first = mb_substr($ruby, 0, 1, 'UTF-8'); - // 小书き/濁点などを正規化(必要最低限) + // 小書き/濁点などを正規化(必要最低限) $map = [ 'が'=>'か','ぎ'=>'き','ぐ'=>'く','げ'=>'け','ご'=>'こ', 'ざ'=>'さ','じ'=>'し','ず'=>'す','ぜ'=>'せ','ぞ'=>'そ', @@ -304,5 +311,4 @@ class ParkController extends Controller // ひらがな以外(空/英数など)は null return null; } - } diff --git a/app/Http/Requests/ParkRequest.php b/app/Http/Requests/ParkRequest.php index b11ad7f..77678f6 100644 --- a/app/Http/Requests/ParkRequest.php +++ b/app/Http/Requests/ParkRequest.php @@ -18,80 +18,85 @@ class ParkRequest extends FormRequest */ public function rules(): array { - if ($this->isMethod('post') || $this->isMethod('put')) { + if (!$this->isMethod('post') && !$this->isMethod('put')) { + return []; + } + return [ // 必須 - 'city_id' => ['required', 'integer'], + 'city_id' => ['required', 'integer'], 'park_name' => ['required', 'string', 'max:255'], // 文字系 - 'park_ruby' => ['nullable', 'string', 'max:255'], - 'park_syllabary' => ['nullable', 'string', 'max:3'], - 'park_adrs' => ['nullable', 'string', 'max:255'], - 'price_memo' => ['nullable', 'string', 'max:1000'], + 'park_ruby' => ['nullable', 'string', 'max:255'], + 'park_syllabary' => ['nullable', 'string', 'max:3'], + 'park_adrs' => ['nullable', 'string', 'max:255'], + 'price_memo' => ['nullable', 'string', 'max:1000'], // フラグ / 種別系(integer想定) - 'park_close_flag' => ['nullable', 'integer'], - 'inverse_use_flag1' => ['nullable', 'integer'], // 逆利用フラグ(一覧) - 'inverse_use_flag2' => ['nullable', 'integer'], // 逆利用フラグ(学生) - 'parking_regulations_flag' => ['nullable', 'integer'], // 駐輪規定フラグ - 'alert_flag' => ['nullable', 'integer'], // 残警告チェックフラグ - 'immediate_use_perm' => ['nullable', 'integer'], // 契約後即利用許可 - 'gender_display_flag' => ['nullable', 'integer'], // 項目表示設定:性別 - 'bd_display_flag' => ['nullable', 'integer'], // 項目表示設定:生年月日 - 'securityreg_display_flag' => ['nullable', 'integer'], // 項目表示設定:防犯登録番号 - 'park_fixed_contract' => ['nullable', 'integer'], // 駐輪場契約形態(定期) - 'park_temporary_contract' => ['nullable', 'integer'], // 駐輪場契約形態(一時利用) - 'park_available_time_flag' => ['nullable', 'integer'], // 利用可能時間制限フラグ - 'park_manager_flag' => ['nullable', 'integer'], // 常駐管理人フラグ - 'park_roof_flag' => ['nullable', 'integer'], // 屋根フラグ - 'park_issuing_machine_flag' => ['nullable', 'integer'], // シール発行機フラグ - 'reduction_guide_display_flag' => ['nullable', 'integer'], // 減免案内表示フラグ - 'overyear_flag' => ['nullable', 'integer'], // 年跨ぎ + 'park_close_flag' => ['nullable', 'integer'], + 'inverse_use_flag1' => ['nullable', 'integer'], // 逆利用フラグ(一覧) + 'inverse_use_flag2' => ['nullable', 'integer'], // 逆利用フラグ(学生) + 'parking_regulations_flag' => ['nullable', 'integer'], // 駐輪規定フラグ + 'alert_flag' => ['nullable', 'integer'], // 残警告チェックフラグ + + // ★ここ:export/DB側は immediate_use_permit + 'immediate_use_permit' => ['nullable', 'integer'], // 契約後即利用許可 + + 'gender_display_flag' => ['nullable', 'integer'], + 'bd_display_flag' => ['nullable', 'integer'], + 'securityreg_display_flag' => ['nullable', 'integer'], + 'park_fixed_contract' => ['nullable', 'integer'], + 'park_temporary_contract' => ['nullable', 'integer'], + 'park_available_time_flag' => ['nullable', 'integer'], + 'park_manager_flag' => ['nullable', 'integer'], + 'park_roof_flag' => ['nullable', 'integer'], + 'park_issuing_machine_flag' => ['nullable', 'integer'], + 'reduction_guide_display_flag' => ['nullable', 'integer'], + 'overyear_flag' => ['nullable', 'integer'], // 数値系 - 'print_number' => ['nullable', 'integer'], // 印字数 - 'distance_twopoints' => ['nullable', 'integer'], // 二点間距離 - 'reduction_age' => ['nullable', 'integer'], // 減免対象年齢 - 'reduction_guide_display_start_month' => ['nullable', 'integer'], // 減免案内表示開始月数 + 'print_number' => ['nullable', 'integer'], + 'distance_twopoints' => ['nullable', 'integer'], + 'reduction_age' => ['nullable', 'integer'], + 'reduction_guide_display_start_month' => ['nullable', 'integer'], - // 日付/時刻系(date/time/datetime) - 'park_day' => ['nullable', 'date'], // 閉設日 - 'keep_alive' => ['nullable', 'date'], // 最新キープアライブ - 'update_grace_period_start_date' => ['nullable', 'integer', 'between:1,31'], // 更新期間開始日 - 'update_grace_period_start_time' => ['nullable', 'date_format:H:i'], // 更新期間開始時 - 'update_grace_period_end_date' => ['nullable', 'integer', 'between:1,31'], // 更新期間終了日 - 'update_grace_period_end_time' => ['nullable', 'date_format:H:i'], // 更新期間終了時 - 'parking_start_grace_period' => ['nullable', 'integer', 'between:1,31'], // 駐輪開始猶予期間 + // 日付/時刻系 + 'park_day' => ['nullable', 'date'], + 'keep_alive' => ['nullable', 'date'], - 'reminder_type' => ['nullable', 'integer'], // リマインダー種別 - 'reminder_time' => ['nullable', 'date_format:H:i'], // リマインダー時間 - 'park_available_time_from' => ['nullable', 'date_format:H:i'], // 利用可能時間(開始) - 'park_available_time_to' => ['nullable', 'date_format:H:i'], // 利用可能時間(終了) - 'park_manager_resident_from' => ['nullable', 'date_format:H:i'], // 常駐時間(開始) - 'park_manager_resident_to' => ['nullable', 'date_format:H:i'], // 常駐時間(終了) + 'update_grace_period_start_date' => ['nullable', 'integer', 'between:1,31'], + 'update_grace_period_start_time' => ['nullable', 'date_format:H:i'], + 'update_grace_period_end_date' => ['nullable', 'integer', 'between:1,31'], + 'update_grace_period_end_time' => ['nullable', 'date_format:H:i'], + 'parking_start_grace_period' => ['nullable', 'integer', 'between:1,31'], + + 'reminder_type' => ['nullable', 'integer'], + 'reminder_time' => ['nullable', 'date_format:H:i'], + 'park_available_time_from' => ['nullable', 'date_format:H:i'], + 'park_available_time_to' => ['nullable', 'date_format:H:i'], + 'park_manager_resident_from' => ['nullable', 'date_format:H:i'], + 'park_manager_resident_to' => ['nullable', 'date_format:H:i'], // 緯度/経度/電話など - 'park_latitude' => ['nullable', 'string', 'max:50'], // 駐車場座標(緯度) - 'park_longitude' => ['nullable', 'string', 'max:50'], // 駐車場座標(経度) - 'park_tel' => ['nullable', 'string', 'max:50'], // 電話番号 + 'park_latitude' => ['nullable', 'string', 'max:50'], + 'park_longitude' => ['nullable', 'string', 'max:50'], + 'park_tel' => ['nullable', 'string', 'max:50'], // 備考/自由入力 - 'park_restriction' => ['nullable', 'string', 'max:50'], // 車種制限 - 'park_procedure' => ['nullable', 'string', 'max:50'], // 手続方法 - 'park_payment' => ['nullable', 'string', 'max:100'], // 支払方法 - 'park_using_method' => ['nullable', 'string', 'max:1000'], // 駐輪場利用方法 - 'park_contract_renewal_term' => ['nullable', 'string', 'max:255'], // 定期更新期間 - 'park_reservation' => ['nullable', 'string', 'max:255'], // 空き待ち予約 - 'park_reference' => ['nullable', 'string', 'max:1000'], // 特記事項 - 'student_id_confirmation_type' => ['nullable', 'string', 'max:255'], // 学生証確認種別 - ]; - } + 'park_restriction' => ['nullable', 'string', 'max:50'], + 'park_procedure' => ['nullable', 'string', 'max:50'], + 'park_payment' => ['nullable', 'string', 'max:100'], + 'park_using_method' => ['nullable', 'string', 'max:1000'], + 'park_contract_renewal_term' => ['nullable', 'string', 'max:255'], + 'park_reservation' => ['nullable', 'string', 'max:255'], + 'park_reference' => ['nullable', 'string', 'max:1000'], - return []; + // ★ここ:export/DB側は student_id_confirm_type + 'student_id_confirm_type' => ['nullable', 'string', 'max:255'], + ]; } - // protected function prepareForValidation(): void { foreach ([ @@ -102,14 +107,14 @@ class ParkRequest extends FormRequest 'update_grace_period_start_time', 'update_grace_period_end_time', 'reminder_time', - ] as $key) { if ($this->filled($key)) { $v = (string) $this->input($key); - $this->merge([$key => substr($v, 0, 5)]); // HH:MM로 통일 + $this->merge([$key => substr($v, 0, 5)]); // HH:MM に統一 } } } + /** * add / edit payload */ @@ -121,12 +126,10 @@ class ParkRequest extends FormRequest public function filters(): array { return [ - 'park_name' => $this->input('park_name'), - 'city_id' => $this->input('city_id'), - 'sort' => $this->input('sort'), - 'sort_type' => $this->input('sort_type', 'asc'), + 'park_name' => $this->input('park_name'), + 'city_id' => $this->input('city_id'), + 'sort' => $this->input('sort'), + 'sort_type' => $this->input('sort_type', 'asc'), ]; } - - } diff --git a/resources/views/admin/parks/_form.blade.php b/resources/views/admin/parks/_form.blade.php index 1026e06..dcf5a34 100644 --- a/resources/views/admin/parks/_form.blade.php +++ b/resources/views/admin/parks/_form.blade.php @@ -47,20 +47,21 @@
- {{-- ▼ 駐輪場ID(編集時のみ表示) --}} - @if(!empty($isEdit)) -
- + {{-- ▼ 駐輪場ID(編集時のみ表示) --}} + @if(!empty($isEdit)) +
+ +
+
+
+
-
-
- -
-
- @endif +
+ @endif {{-- ▼ 市区 --}}
diff --git a/resources/views/admin/parks/create.blade.php b/resources/views/admin/parks/add.blade.php similarity index 87% rename from resources/views/admin/parks/create.blade.php rename to resources/views/admin/parks/add.blade.php index be2d0dd..f9f9f6a 100644 --- a/resources/views/admin/parks/create.blade.php +++ b/resources/views/admin/parks/add.blade.php @@ -15,7 +15,7 @@ ホーム @@ -40,7 +40,9 @@ @csrf @include('admin.parks._form', [ - 'isEdit' => false + 'isEdit' => false, + 'record' => null, + 'cities' => $cities ?? [], ]) diff --git a/resources/views/admin/parks/edit.blade.php b/resources/views/admin/parks/edit.blade.php index 8ffe310..f335f75 100644 --- a/resources/views/admin/parks/edit.blade.php +++ b/resources/views/admin/parks/edit.blade.php @@ -2,76 +2,78 @@ @section('title', '編集') @section('content') -{{-- ▼ パンくず --}} -
-
-
-
-

編集

-
-
- -
+ +
+
+
+
+

編集

+
+
+ +
+
+
-
-
-{{-- ▼ 編集フォーム --}} -
-
- @csrf - @method('PUT') + +
+
-
- {{-- ▼ ボタンエリア(上部) --}} -
- - 減免確認編集 - 駐輪状況編集 - -
-
-
- {{-- ▼ 入力フォーム --}} - @include('admin.parks._form') +
+
- {{-- ▼ フッター(下部ボタン) --}} - -
- -
+
+ {{-- ▼ 上部ボタン --}} +
+ {{-- 減免マスタ --}} + - - + {{-- 駐輪規定マスタ --}} + +
- - - + {{-- 編集フォーム --}} +
+ @csrf + @method('PUT') - + @include('admin.parks._form', [ + 'isEdit' => true, + 'record' => $record, + 'cities' => $cities ?? [], + ]) +
+ + {{-- 単体削除(編集画面) --}} +
+ @csrf + +
+ +
+
+
+ +
+ @endsection diff --git a/resources/views/admin/parks/index.blade.php b/resources/views/admin/parks/list.blade.php similarity index 98% rename from resources/views/admin/parks/index.blade.php rename to resources/views/admin/parks/list.blade.php index b393aa2..26e4adf 100644 --- a/resources/views/admin/parks/index.blade.php +++ b/resources/views/admin/parks/list.blade.php @@ -26,7 +26,7 @@
-
+
@@ -74,7 +74,7 @@ 絞り込み - + 解除
@@ -88,7 +88,7 @@
{{-- 並び替え用 hidden --}} - + @@ -98,7 +98,7 @@
@@ -149,7 +149,7 @@ {{-- ▼ テーブル --}}
-
+ @csrf diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index f2835b2..3ab1d19 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -440,11 +440,14 @@ 市区マスタ + +