275 lines
12 KiB
PHP
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]);
|
|
}
|
|
} |