From 9a0f8a8846f4e0dfdc6c8206b03c2e18246d4f4d Mon Sep 17 00:00:00 2001 From: "kin.rinzen" Date: Fri, 10 Oct 2025 23:30:56 +0900 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=80=8DSWA-95/SWA-62/SWA-78?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Admin/PplaceController.php | 22 +-- .../Controllers/Admin/PriceController.php | 74 +++++----- .../Controllers/Admin/PrintAreaController.php | 70 +++++++--- .../Admin/RegularTypeController.php | 74 ++++++---- resources/views/admin/prices/list.blade.php | 16 +-- .../views/admin/print_areas/_form.blade.php | 44 +++--- .../views/admin/print_areas/add.blade.php | 6 +- .../views/admin/print_areas/list.blade.php | 39 ++++-- resources/views/admin/ptypes/list.blade.php | 2 +- .../views/admin/regular_types/_form.blade.php | 126 +++++++++--------- .../views/admin/regular_types/add.blade.php | 14 +- .../views/admin/regular_types/edit.blade.php | 21 ++- .../views/admin/regular_types/info.blade.php | 53 -------- .../views/admin/regular_types/list.blade.php | 19 +-- routes/web.php | 6 +- 15 files changed, 292 insertions(+), 294 deletions(-) delete mode 100644 resources/views/admin/regular_types/info.blade.php diff --git a/app/Http/Controllers/Admin/PplaceController.php b/app/Http/Controllers/Admin/PplaceController.php index 17fdc28..a9a4745 100644 --- a/app/Http/Controllers/Admin/PplaceController.php +++ b/app/Http/Controllers/Admin/PplaceController.php @@ -122,18 +122,15 @@ class PplaceController extends Controller public function export() { - $headers = [ - "Content-type" => "text/csv;charset=UTF-8", - "Content-Disposition" => "attachment; filename=Pplace.csv", - ]; + $filename = '駐輪車室マスタ' . now()->format('YmdHis') . '.csv'; - $data = Pplace::all(); - $columns = ['ID', '番号', '備考', 'オペレータID']; - - $filename = "Pplace.csv"; $file = fopen($filename, 'w+'); + fwrite($file, "\xEF\xBB\xBF"); // BOM追加(UTF-8) + + $columns = ['駐輪車室ID', '番号', '備考', 'オペレータID']; fputcsv($file, $columns); + $data = Pplace::all(); foreach ($data as $item) { fputcsv($file, [ $item->pplace_id, @@ -144,9 +141,16 @@ class PplaceController extends Controller } fclose($file); - return Response::download($filename, $filename, $headers); + + $headers = [ + "Content-Type" => "text/csv; charset=UTF-8", + "Content-Disposition" => "attachment; filename={$filename}", + ]; + + return response()->download($filename, $filename, $headers)->deleteFileAfterSend(true); } + public function import(Request $request) { $file = $request->file('file'); diff --git a/app/Http/Controllers/Admin/PriceController.php b/app/Http/Controllers/Admin/PriceController.php index 1d96168..d29744c 100644 --- a/app/Http/Controllers/Admin/PriceController.php +++ b/app/Http/Controllers/Admin/PriceController.php @@ -14,7 +14,6 @@ use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Validator; -// use Response; use Illuminate\Support\Facades\Response; class PriceController extends Controller @@ -137,62 +136,51 @@ class PriceController extends Controller return self::whereIn('price_parkplaceid', $ids)->delete(); } - public function exportGet(Request $request) + public function export() { - $headers = [ - "Content-Type" => "text/csv; charset=UTF-8", - "Content-Disposition" => "attachment; filename=駐輪場所、料金マスタ.csv", - ]; + $filename = '駐輪場所、料金マスタ' . now()->format('YmdHis') . '.csv'; - $query = Price::query(); + $file = fopen($filename, 'w+'); + fwrite($file, "\xEF\xBB\xBF"); // BOM追加(UTF-8) - // 🔹 パラメータ取得(GETでもOK) - if ($request->filled('park_id')) { - $query->where('park_id', $request->input('park_id')); - } - - if ($request->filled('sort')) { - $query->orderBy($request->input('sort'), $request->input('sort_type', 'asc')); - } - - $dataExport = $query->get(); - - // 🔹 CSV列定義 $columns = [ - '駐車場所ID', '商品名', '期間', '駐輪場ID', '駐輪場名', - '車種区分ID', '車種区分', '駐輪分類ID', '駐輪分類', - '利用者分類ID', '利用者分類', '駐車車室ID', '駐輪料金(税込)', + '駐輪場所ID', + '駐輪場ID', + '商品名', + '期間', + '利用者分類ID', + '駐輪料金(税込)', + '車種区分ID', + '駐輪分類ID', + '駐車車室ID', ]; - // 🔹 CSV生成 - $filename = '駐輪場所、料金マスタ.csv'; - $path = storage_path('app/' . $filename); - $file = fopen($path, 'w+'); - fwrite($file, "\xEF\xBB\xBF"); // Excel対応のBOM fputcsv($file, $columns); - foreach ($dataExport as $item) { + $data = Price::all(); + foreach ($data as $item) { fputcsv($file, [ - $item->price_parkplaceid, - $item->prine_name, - $item->price_month, - $item->park_id, - optional($item->getPark())->park_name, - $item->psection_id, - optional($item->getPSection())->psection_subject, - $item->price_ptypeid, - optional($item->getPType())->ptype_subject, - $item->user_categoryid, - optional($item->getUserType())->print_name, - $item->pplace_id, - $item->price, + $item->price_parkplaceid, // 駐輪場所ID + $item->park_id, // 駐輪場ID + optional($item->getUserType())->print_name, // 利用者分類名 + $item->price_month, // 期間 + optional($item->getUserType())->print_name, // 利用者分類ID + $item->price, // 駐輪料金(税込) + optional($item->getPSection())->psection_subject, // 車種区分名 + optional($item->getPType())->ptype_subject, // 駐輪分類名 + $item->pplace_id, // 駐車車室ID ]); } + fclose($file); - // 🔹 ダウンロードレスポンス - return response()->download($path, $filename, $headers)->deleteFileAfterSend(true); + $headers = [ + "Content-Type" => "text/csv; charset=UTF-8", + "Content-Disposition" => "attachment; filename={$filename}", + ]; + + return response()->download($filename, $filename, $headers)->deleteFileAfterSend(true); } public function import(Request $request) diff --git a/app/Http/Controllers/Admin/PrintAreaController.php b/app/Http/Controllers/Admin/PrintAreaController.php index a086544..2f336d5 100644 --- a/app/Http/Controllers/Admin/PrintAreaController.php +++ b/app/Http/Controllers/Admin/PrintAreaController.php @@ -25,7 +25,7 @@ class PrintAreaController extends Controller ]); } - // 新規登録 + // 新規 public function add(Request $request) { if ($request->isMethod('post')) { @@ -72,35 +72,67 @@ class PrintAreaController extends Controller return view('admin.print_areas.info', compact('record')); } - public function delete(Request $request) + /** + * 印刷範囲マスタ削除処理 + */ + public function delete(Request $request, $id = null) { - // バリデーション:'pk'は必須、配列の場合は各要素が整数 + // 一覧画面(checkboxで複数削除) + $ids = $request->input('pk'); + + // 編集画面(単体削除) + if ($id) { + $ids = [$id]; + } + + // 削除対象が空 + if (empty($ids)) { + return redirect() + ->route('print_areas') + ->with('error', '削除対象が選択されていません。'); + } + + // バリデーション:配列 or 単一でも整数確認 $request->validate([ - 'pk' => 'required', + 'pk' => 'nullable', 'pk.*' => 'integer', ]); - // pkを配列化(単一でも配列でも対応) - $ids = (array)$request->input('pk'); + try { + // 削除処理 + $deleted = PrintArea::destroy($ids); - // 削除処理 - $deleted = PrintArea::destroy($ids); + if ($deleted > 0) { + return redirect() + ->route('print_areas') + ->with('success', '削除しました。'); + } else { + return redirect() + ->route('print_areas') + ->with('error', '削除に失敗しました。'); + } + } catch (\Exception $e) { + \Log::error('印刷範囲削除エラー: ' . $e->getMessage()); - // 削除結果によってメッセージを分岐 - if ($deleted > 0) { - return redirect()->route('print_areas')->with('success', '削除しました。'); - } else { - return redirect()->route('print_areas')->with('error', '削除に失敗しました。'); + return redirect() + ->route('print_areas') + ->with('error', '削除中にエラーが発生しました。'); } } - // CSVエクスポート public function export(Request $request) { - $filename = 'print_areas_' . now()->format('Ymd_His') . '.csv'; + // ファイル名を日本語付きで指定(Excelで問題なく開けるようにUTF-8にBOMも付加) + $filename = 'シール印刷範囲マスタ' . now()->format('YmdHis') . '.csv'; + $data = PrintArea::with('park')->get(); + // UTF-8 BOM (Excel用) + $bom = "\xEF\xBB\xBF"; + + // CSVヘッダー $csv = implode(",", ['印刷範囲ID', '印刷範囲名', '駐輪場ID', '駐輪場名']) . "\n"; + foreach ($data as $item) { $csv .= implode(",", [ $item->print_area_id, @@ -110,11 +142,13 @@ class PrintAreaController extends Controller ]) . "\n"; } - return response($csv) - ->header('Content-Type', 'text/csv') - ->header('Content-Disposition', "attachment; filename=$filename"); + return response($bom . $csv) + ->header('Content-Type', 'text/csv; charset=UTF-8') + // filename* にすれば日本語名も安全に動作 + ->header('Content-Disposition', "attachment; filename*=UTF-8''" . rawurlencode($filename)); } + // CSVインポート(仮) public function import(Request $request) { diff --git a/app/Http/Controllers/Admin/RegularTypeController.php b/app/Http/Controllers/Admin/RegularTypeController.php index 0bbc423..a9e3e49 100644 --- a/app/Http/Controllers/Admin/RegularTypeController.php +++ b/app/Http/Controllers/Admin/RegularTypeController.php @@ -33,17 +33,21 @@ class RegularTypeController extends Controller ]; $viewData = array_merge($inputs, $dataList); + $record = new RegularType(); + if ($request->isMethod('POST')) { $validation = new RegularTypeRequest(); $rules = $validation->rules(); $validator = Validator::make($request->all(), $rules, $validation->messages()); if ($validator->fails()) { - $viewData['errorMsg'] = $this->buildErrorMessages($validator); - return view('admin.regular_types.add', array_merge($viewData, $request->all())); + return redirect() + ->back() + ->withErrors($validator) + ->withInput(); } - // 仅允许写入的字段(白名单) + // バリデーション成功 $payload = array_intersect_key($request->all(), array_flip([ 'city_id', 'regular_class_1', @@ -61,41 +65,47 @@ class RegularTypeController extends Controller $new->save(); }); - $request->session()->flash('success', __('登録に成功しました。')); + $request->session()->flash('success', __('登録しました。')); return redirect()->route('regular_types'); } - return view('admin.regular_types.add', $viewData); + return view('admin.regular_types.add', array_merge($viewData, [ + 'record' => $record, + ])); } public function edit(Request $request, $id, $view = '') { - $regular_type = RegularType::getById($id); - if (empty($id) || empty($regular_type)) { + // --- データ取得 --- + $record = RegularType::getById($id); + if (empty($id) || empty($record)) { abort(404); } + // --- 初期表示用データ --- $data = array_merge( - $regular_type->getAttributes(), + $record->getAttributes(), $this->getDataDropList(), [ - 'regular_type' => $regular_type, + 'record' => $record, 'isEdit' => true, ] ); - + // --- 更新処理 --- if ($request->isMethod('POST')) { $validation = new RegularTypeRequest(); $rules = $validation->rules(); $validator = Validator::make($request->all(), $rules, $validation->messages()); + // city_name → city_id の補正 $requestAll = $request->all(); if (isset($requestAll['city_name']) && !isset($requestAll['city_id'])) { $requestAll['city_id'] = $requestAll['city_name']; } + // 書き込み対象のカラムのみ許可 $payload = array_intersect_key($requestAll, array_flip([ 'city_id', 'regular_class_1', @@ -106,23 +116,26 @@ class RegularTypeController extends Controller 'memo', ])); + // バリデーションエラー if ($validator->fails()) { $data['errorMsg'] = $this->buildErrorMessages($validator); - $data = array_merge($data, $payload); + if ($view !== '') return view($view, $data); return view('admin.regular_types.edit', $data); } - DB::transaction(function () use (&$regular_type, $payload) { - $regular_type->fill($payload); - $regular_type->save(); + // 更新 + DB::transaction(function () use (&$record, $payload) { + $record->fill($payload); + $record->save(); }); $request->session()->flash('success', __('更新に成功しました')); return redirect()->route('regular_types'); } + // --- 画面表示 --- if ($view !== '') { return view($view, $data); } @@ -135,24 +148,29 @@ class RegularTypeController extends Controller return implode("\n", $validator->errors()->all()); } - public function delete(Request $request) + public function delete(Request $request, $id = null) { - $arr_pk = $request->get('pk'); // 配列で受け取る + // 一覧画面(checkbox で複数削除) + $ids = $request->input('pk'); - if ($arr_pk) { - $deleted = RegularType::destroy($arr_pk); - - if ($deleted > 0) { - return redirect()->route('regular_types') - ->with('success', __("削除が完了しました。")); - } else { - return redirect()->route('regular_types') - ->with('error', __('削除に失敗しました。')); - } + // 編集画面(単体削除) + if ($id) { + $ids = [$id]; } - return redirect()->route('regular_types') - ->with('error', __('削除するデータを選択してください。')); + // 削除対象が空の場合 + if (empty($ids)) { + return redirect() + ->route('regular_types') + ->with('error', '削除対象が選択されていません。'); + } + + // 削除処理 + RegularType::destroy($ids); + + return redirect() + ->route('regular_types') + ->with('success', '削除しました。'); } diff --git a/resources/views/admin/prices/list.blade.php b/resources/views/admin/prices/list.blade.php index 127ad36..b6dfa9a 100644 --- a/resources/views/admin/prices/list.blade.php +++ b/resources/views/admin/prices/list.blade.php @@ -41,16 +41,12 @@ {{-- 削除 --}} - -
- @csrf - - - - -
+ {{-- エクスポート(条件選択モーダル) --}} - {{ Session::get('success') }} - -@elseif(Session::has('error')) -
- -

{{ __('誤差') }}:

- {!! Session::get('error') !!} -
-@elseif(isset($errorMsg)) -
- -

{{ __('誤差') }}:

- {!! $errorMsg !!} -
+ +@endif + +@if($errors->any()) +
+ +

{{ __('入力内容に不備があります:') }}

+ +
@endif
- {{-- バリデーションエラー表示 --}} - @if ($errors->any()) -
-
    - @foreach ($errors->all() as $error) -
  • {{ $error }}
  • - @endforeach -
-
- @endif - {{-- 管轄印刷エリアID(編集時のみ表示) --}}
@if($isEdit) diff --git a/resources/views/admin/print_areas/add.blade.php b/resources/views/admin/print_areas/add.blade.php index 53531e2..e3af901 100644 --- a/resources/views/admin/print_areas/add.blade.php +++ b/resources/views/admin/print_areas/add.blade.php @@ -1,18 +1,18 @@ @extends('layouts.app') -@section('title', '新規登録') +@section('title', '新規') @section('content')
-

新規登録

+

新規

diff --git a/resources/views/admin/print_areas/list.blade.php b/resources/views/admin/print_areas/list.blade.php index d733b3a..95b3f58 100644 --- a/resources/views/admin/print_areas/list.blade.php +++ b/resources/views/admin/print_areas/list.blade.php @@ -35,20 +35,37 @@
- - + +
{{ $list->appends(['sort' => $sort ?? '', 'sort_type' => $sort_type ?? ''])->links('pagination') }}
- - - -
- @if(session('success')) -
{{ session('success') }}
- @elseif(session('error')) -
{{ session('error') }}
+ + {{-- ▼ フラッシュメッセージ --}} +
+ @if(Session::has('success')) + + @elseif(Session::has('error')) +
+ +

{{ __('入力内容に不備があります') }}:

+ {!! Session::get('error') !!} +
+ @elseif(isset($errorMsg)) +
+ +

{{ __('入力内容に不備があります') }}:

+ {!! $errorMsg !!} +
@endif
@@ -66,7 +83,7 @@ 印刷範囲ID 印刷範囲名 - 駐輪場名 + 駐輪場ID diff --git a/resources/views/admin/ptypes/list.blade.php b/resources/views/admin/ptypes/list.blade.php index 1e06efb..399428b 100644 --- a/resources/views/admin/ptypes/list.blade.php +++ b/resources/views/admin/ptypes/list.blade.php @@ -27,7 +27,7 @@ - {{-- ▼ アクションボタン(市区マスタ準拠) --}} + {{-- ▼ アクションボタン --}}
新規 diff --git a/resources/views/admin/regular_types/_form.blade.php b/resources/views/admin/regular_types/_form.blade.php index 2fd3315..86ab916 100644 --- a/resources/views/admin/regular_types/_form.blade.php +++ b/resources/views/admin/regular_types/_form.blade.php @@ -1,70 +1,61 @@ +{{-- アラート --}} @if(Session::has('success')) -@elseif(Session::has('error')) +@endif + +@if($errors->any())
-

{{__('誤差')}}:

- {!! Session::get('error') !!} -
-@elseif(isset($errorMsg)) -
- -

{{__('誤差')}}:

- {!! $errorMsg !!} +

{{ __('入力内容に不備があります:') }}

+
    + @foreach($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
@endif +
- - {{-- バリデーションエラー表示 --}} - @if ($errors->any()) -
-
    - @foreach ($errors->all() as $error) -
  • {{ $error }}
  • - @endforeach -
+ {{-- ▼ 定期種別ID(自動採番:編集時のみ表示) --}} + @if($isEdit) +
+ +
+
+
+ +
@endif - -
- -
-
-
- -
-
- - + {{-- ▼ 市区名 --}}
- +
-
+
+ +
@@ -73,19 +64,21 @@
+ value="1" + {{-- 新規時デフォルト有効 --}} + @if((!$isEdit && !isset($regular_class_1)) || (isset($regular_class_1) && $regular_class_1 == 1)) checked @endif>
+ value="0" + @if(isset($regular_class_1) && $regular_class_1 === 0) checked @endif>
-
@@ -95,7 +88,8 @@
+ value="1" + @if((!$isEdit && !isset($regular_class_2)) || (isset($regular_class_2) && $regular_class_2 == 1)) checked @endif>
@@ -116,7 +110,7 @@
+ value="1" @if((!$isEdit && !isset($regular_class_3)) || (isset($regular_class_3) && $regular_class_3 == 1)) checked @endif>
@@ -137,7 +131,8 @@
+ value="1" + @if((!$isEdit && !isset($regular_class_6)) || (isset($regular_class_6) && $regular_class_6 == 1)) checked @endif>
@@ -158,7 +153,8 @@
+ value="1" + @if((!$isEdit && !isset($regular_class_12)) || (isset($regular_class_12) && $regular_class_12 == 1)) checked @endif>
@@ -187,24 +183,28 @@
{{-- ▼ 下部ボタン --}} -
- {{-- 登録ボタン --}} - +
+
- {{-- 削除ボタン(編集画面のみ表示) --}} - @if(!empty($regular_type->regular_type_id)) - -
- @csrf - - -
- @endif + {{-- 登録ボタン --}} + @if($isEdit) + + @else + + @endif + + {{-- 削除ボタン(編集時のみ表示) --}} + @if($isEdit) + + @endif + +
diff --git a/resources/views/admin/regular_types/add.blade.php b/resources/views/admin/regular_types/add.blade.php index 97065c2..72194d5 100644 --- a/resources/views/admin/regular_types/add.blade.php +++ b/resources/views/admin/regular_types/add.blade.php @@ -1,6 +1,6 @@ @extends('layouts.app') -@section('title', '[東京都|〇〇駐輪場] 定期種別マスタ') +@section('title', '新規') @section('content') @@ -8,13 +8,13 @@
-

新規登録

+

新規

@@ -30,11 +30,9 @@
-
- - - - @include('admin.regular_types._form',['isEdit'=>0,'isInfo'=>0]) + + @csrf + @include('admin.regular_types._form', ['isEdit' => false, 'record' => $record])
diff --git a/resources/views/admin/regular_types/edit.blade.php b/resources/views/admin/regular_types/edit.blade.php index a5f1244..6bf8ca4 100644 --- a/resources/views/admin/regular_types/edit.blade.php +++ b/resources/views/admin/regular_types/edit.blade.php @@ -1,6 +1,6 @@ @extends('layouts.app') -@section('title', '[東京都|〇〇駐輪場] 定期種別マスタ') +@section('title', '編集') @section('content') @@ -30,11 +30,20 @@
-
- - - - @include('admin.regular_types._form', ['isEdit' => true]) + + @csrf + @include('admin.regular_types._form', ['isEdit' => true]) +
+ + {{-- Delete Form --}} +
diff --git a/resources/views/admin/regular_types/info.blade.php b/resources/views/admin/regular_types/info.blade.php deleted file mode 100644 index 5479405..0000000 --- a/resources/views/admin/regular_types/info.blade.php +++ /dev/null @@ -1,53 +0,0 @@ - -@extends('layouts.app') -@section('title', '[東京都|〇〇駐輪場] 定期種別マスタ') - -@section('content') - -
-
-
-
-

[東京都|〇〇駐輪場] 定期種別マスタ

-
-
- -
-
-
-
- - - -
-
- - -
-
-
-
- - - - @include('admin.regular_types._form',['isEdit'=>0,'isInfo'=>1]) -
-
-
-
- -
- - - -
-
-
- - -@endsection diff --git a/resources/views/admin/regular_types/list.blade.php b/resources/views/admin/regular_types/list.blade.php index 6a90a9c..f707c75 100644 --- a/resources/views/admin/regular_types/list.blade.php +++ b/resources/views/admin/regular_types/list.blade.php @@ -1,5 +1,5 @@ @extends('layouts.app') -@section('title', '[東京都|〇〇駐輪場] 定期種別マスタ') +@section('title', '定期種別マスタ') @section('content') @@ -32,11 +32,7 @@
- +
{{ $list->appends(['sort' => $sort ?? '', 'sort_type' => $sort_type ?? ''])->links('pagination') }} @@ -45,6 +41,7 @@
+ {{-- ▼ フラッシュメッセージ --}} @if(Session::has('success')) -
diff --git a/routes/web.php b/routes/web.php index 62ba9f8..c7b0824 100644 --- a/routes/web.php +++ b/routes/web.php @@ -184,11 +184,7 @@ Route::middleware('auth')->group(function () { Route::match(['get', 'post'], '/admin/prices/info/{id}', [PriceController::class, 'info'])->name('price_info')->where(['id' => '[0-9]+']); Route::match(['get', 'post'], '/admin/prices/delete', [PriceController::class, 'delete'])->name('prices_delete'); Route::match(['get', 'post'], '/admin/prices/import', [PriceController::class, 'import'])->name('prices_import'); - - // kin 修正 - // CSV出力(GET対応版) - Route::get('/admin/prices/export', [PriceController::class, 'exportGet']) - ->name('prices_export'); + Route::get('/admin/prices/export', [PriceController::class, 'export'])->name('prices_export'); //車種区分マスタ