krgm.so-manager-dev.com/app/Http/Controllers/Admin/ParkController.php
你的名字 b74d8fd4a8
All checks were successful
Deploy main / deploy (push) Successful in 25s
【駐輪場マスタ】画面修正
2025-10-09 18:04:27 +09:00

275 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Models\City;
use App\Http\Requests\ParkRequest;
use App\Models\Park;
use App\Utils;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
class ParkController extends Controller
{
public function list(Request $request)
{
$query = \DB::table('park as p')
->leftJoin('city as c', 'p.city_id', '=', 'c.city_id')
->select([
'p.*',
'c.city_name',
]);
if ($request->filled('park_name')) {
$query->where('p.park_name', 'like', '%' . $request->input('park_name') . '%');
}
if ($request->filled('city_id')) {
$query->where('p.city_id', $request->input('city_id'));
}
if ($request->filled('sort')) {
$query->orderBy($request->input('sort'), $request->input('sort_type', 'asc'));
} else {
$query->orderBy('p.park_id', 'asc');
}
$parks = $query->paginate(20);
$cities = \DB::table('city')->orderBy('city_id')->get();
$sort = $request->input('sort', 'p.park_id');
$sort_type = $request->input('sort_type', 'asc');
return view('admin.parks.list', compact('parks', 'cities', 'sort', 'sort_type'));
}
public function add(Request $request)
{
$cities = \DB::table('city')->orderBy('city_id')->get();
if ($request->isMethod('post')) {
// バリデーション(必要な項目だけ例示)
$validated = $request->validate([
'city_id' => 'required|integer',
'park_name' => 'required|string|max:255',
// 他の項目も必要に応じて追加
]);
// 保存処理
$park = new \App\Models\Park();
$park->fill($validated);
$park->operator_id = auth()->user()->ope_id ?? 1;
$park->save();
return redirect()->route('parks')->with('success', '新規登録に完了しました。');
}
return view('admin.parks.add', [
'cities' => $cities,
]);
}
public function edit(Request $request, $pk, $view = '')
{
$park = Park::find($pk);
if (empty($pk) || empty($park)) {
abort('404');
}
$data = $park->getAttributes();
$dataList = $this->getDataDropList();
$data = array_merge($data, $dataList);
if ($request->isMethod('POST') || $request->isMethod('PUT')) {
// ここをaddと同じバリデーションに変更
$validated = $request->validate([
'city_id' => 'required|integer',
'park_name' => 'required|string|max:255',
// 他の項目も必要に応じて追加
]);
\DB::transaction(function () use ($validated, &$type, $park) {
$park->fill($validated);
$park->save();
$type = true;
});
$request->session()->flash('success', __('更新に成功しました'));
return redirect()->route('parks');
}
if ($view != '') {
return view($view, $data);
}
return view('admin.parks.edit', [
'park' => $park,
'cities' => $dataList['cities'] ?? [],
// 必要な他の変数もここで渡す
]);
}
public function delete(Request $request)
{
$arr_pk = $request->get('pk');
if ($arr_pk) {
if (Park::destroy($arr_pk)) {
return redirect()->route('parks')->with('success', __("削除が完了しました。"));
} else {
return redirect()->route('parks')->with('error', __('削除に失敗しました。'));
}
}
return redirect()->route('parks')->with('error', __('削除するユーザーを選択してください。'));
}
public function info(Request $request, $id)
{
return $this->edit($request, $id, 'admin.parks.info');
}
public function getDataDropList()
{
$data['cities'] = City::orderBy('city_id')->get();
return $data;
}
public function export(Request $request)
{
$columns = [
'駐輪場ID', '市区', '駐輪場名', '駐輪場ふりがな', '駐輪場五十音', '住所',
'閉設フラグ', '閉設日', '残警告チェックフラグ', '印字数', '最新キープアライブ',
'更新オペレータID', '更新期間開始日', '更新期間開始時', '更新期間終了日', '更新期間終了時',
'駐輪開始期間', 'リマインダー種別', 'リマインダー時間', '契約後即利用許可',
'項目表示設定:性別', '項目表示設定:生年月日', '項目表示設定:防犯登録番号',
'二点間距離', '駐車場座標(緯度)', '駐車場座標(経度)', '電話番号',
'駐輪場契約形態(定期)', '駐輪場契約形態(一時利用)', '車種制限', '手続方法', '支払方法',
'利用可能時間制限フラグ', '利用可能時間(開始)', '利用可能時間(終了)',
'常駐管理人フラグ', '常駐時間(開始)', '常駐時間(終了)',
'屋根フラグ', 'シール発行機フラグ', '駐輪場利用方法', '定期更新期間',
'空き待ち予約', '特記事項', '学生証確認種別',
'減免案内表示フラグ', '減免対象年齢', '減免案内表示開始月数', '年跨ぎ'
];
$dataExport = DB::table('park as p')
->select([
'p.park_id', 'p.city_id', 'p.park_name', 'p.park_ruby', 'p.park_syllabary', 'p.park_adrs',
'p.park_close_flag', 'p.park_day', 'p.alert_flag', 'p.print_number', 'p.keep_alive',
'p.operator_id', 'p.update_grace_period_start_date', 'p.update_grace_period_start_time',
'p.update_grace_period_end_date', 'p.update_grace_period_end_time',
'p.parking_start_grace_period', 'p.reminder_type', 'p.reminder_time', 'p.immediate_use_permit',
'p.gender_display_flag', 'p.bd_display_flag', 'p.securityreg_display_flag',
'p.distance_twopoints', 'p.park_latitude', 'p.park_longitude', 'p.park_tel',
'p.park_fixed_contract', 'p.park_temporary_contract', 'p.park_restriction',
'p.park_procedure', 'p.park_payment',
'p.park_available_time_flag', 'p.park_available_time_from', 'p.park_available_time_to',
'p.park_manager_flag', 'p.park_manager_resident_from', 'p.park_manager_resident_to',
'p.park_roof_flag', 'p.park_issuing_machine_flag', 'p.park_using_method',
'p.park_contract_renewal_term', 'p.park_reservation', 'p.park_reference',
'p.student_id_confirm_type', 'p.reduction_guide_display_flag', 'p.reduction_age',
'p.reduction_guide_display_start_month', 'p.overyear_flag'
])
->orderBy('p.park_id', 'asc')
->get();
$response = new StreamedResponse(function () use ($dataExport, $columns) {
$stream = fopen('php://output', 'w');
// Excel兼容 BOM
fwrite($stream, chr(0xEF) . chr(0xBB) . chr(0xBF));
fputcsv($stream, $columns);
foreach ($dataExport as $item) {
fputcsv($stream, [
$item->park_id, $item->city_id, $item->park_name, $item->park_ruby, $item->park_syllabary, $item->park_adrs,
$item->park_close_flag, $item->park_day, $item->alert_flag, $item->print_number, $item->keep_alive,
$item->operator_id, $item->update_grace_period_start_date, $item->update_grace_period_start_time,
$item->update_grace_period_end_date, $item->update_grace_period_end_time,
$item->parking_start_grace_period, $item->reminder_type, $item->reminder_time, $item->immediate_use_permit,
$item->gender_display_flag, $item->bd_display_flag, $item->securityreg_display_flag,
$item->distance_twopoints, $item->park_latitude, $item->park_longitude, $item->park_tel,
$item->park_fixed_contract, $item->park_temporary_contract, $item->park_restriction,
$item->park_procedure, $item->park_payment,
$item->park_available_time_flag, $item->park_available_time_from, $item->park_available_time_to,
$item->park_manager_flag, $item->park_manager_resident_from, $item->park_manager_resident_to,
$item->park_roof_flag, $item->park_issuing_machine_flag, $item->park_using_method,
$item->park_contract_renewal_term, $item->park_reservation, $item->park_reference,
$item->student_id_confirm_type, $item->reduction_guide_display_flag, $item->reduction_age,
$item->reduction_guide_display_start_month, $item->overyear_flag
]);
}
fclose($stream);
});
$response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
$response->headers->set('Content-Disposition', 'attachment; filename="駐輪場マスタ.csv"');
$response->headers->set('Cache-Control', 'no-store, no-cache');
return $response;
}
public function import(Request $request)
{
$file = $request->file('file');
if (!empty($file)) {
$data = Utils::csvToArray($file);
$type = 1;
$msg = '';
$record = 0;
DB::beginTransaction();
try {
Park::query()->delete();
$col = 13;
foreach ($data as $key => $items) {
$record = $key + 2;
if (count($items) == $col) {
$row = new Park();
$row->park_id = $items[0];
$row->city_id = $items[1];
$row->park_name = $items[3];
$row->park_ruby = $items[4];
$row->park_syllabary = $items[5];
$row->park_adrs = $items[6];
$row->park_close_flag = $items[7];
$row->park_day = $items[9];
$row->alert_flag = $items[10];
$row->print_number = $items[11];
$row->keep_alive = $items[12];
if (!$row->save()) {
$type = 0;
$msg = '行:record型が一致しません。';
break;
}
} else {
$type = 0;
$msg = '行:record列数が一致しません。';
break;
}
}
} catch (\Exception $e) {
$msg = '行:record型が一致しません。';
$type = 0;
}
if ($type) {
DB::commit();
return redirect()->route('parks')->with('success', __('輸入成功'));
} else {
DB::rollBack();
return redirect()->route('parks')->with('error', __($msg, ['record' => $record]));
}
} else {
return redirect()->route('parks')->with('error', __('あなたはcsvファイルを選択していません。'));
}
}
public function checkDuplicate(\Illuminate\Http\Request $request)
{
$parkName = $request->input('park_name');
$duplicate = Park::where('park_name', $parkName)->first();
if ($duplicate) {
return response()->json([
'duplicate' => true,
'park_id' => $duplicate->park_id,
'park_name' => $duplicate->park_name,
]);
}
return response()->json(['duplicate' => false]);
}
}