Merge branch 'main' of https://git.so-manager-dev.com/so-manager/so-manager-dev.com
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s

This commit is contained in:
Your Name 2025-10-03 20:32:33 +09:00
commit ff21ee5796
28 changed files with 1450 additions and 275 deletions

View File

@ -11,9 +11,9 @@ class InquiryConfirmController extends Controller
{ {
// 初期表示内容 // 初期表示内容
public $form_data = [ public $form_data = [
["name", "text", "氏名*", ""], ["name", "text", "氏名*", "山田 太郎"],
["email", "email", "メールアドレス*", ""], ["email", "email", "メールアドレス*", "info@so-manager.com"],
["tel", "text", "電話番号*", ""], ["tel", "text", "電話番号*", "000-0000-0000"],
["subject", "checkbox", "お問い合わせ概要*", ["定期契約について", "操作方法について", "支払方法について", "その他お問合せ"]], ["subject", "checkbox", "お問い合わせ概要*", ["定期契約について", "操作方法について", "支払方法について", "その他お問合せ"]],
["parking", "text", "お問い合わせ駐輪場名", ""], ["parking", "text", "お問い合わせ駐輪場名", ""],
["detail", "textarea", "お問い合わせ詳細*", ""], ["detail", "textarea", "お問い合わせ詳細*", ""],
@ -40,11 +40,11 @@ class InquiryConfirmController extends Controller
// エラーメッセージ // エラーメッセージ
$message = [ $message = [
'name.required' => '名前を入力してください', 'name.required' => '氏名は必ず入力してください。',
'email.required' => 'メールアドレスを入力してください', 'email.required' => 'メールアドレスは必ず入力してください。',
'tel.required' => '電話番号を入力してください', 'tel.required' => '電話番号は必ず入力してください。',
'subject.required' => 'お問い合わせ概要を選択してください', 'subject.required' => 'お問い合わせ概要が選択されていません。',
'detail.required' => 'お問い合わせ詳細を入力してください', 'detail.required' => 'お問い合わせの詳細が入力されていません。',
]; ];
// バリデーションチェック // バリデーションチェック

View File

@ -51,7 +51,7 @@ class MemberRegistrationController extends Controller
return view('general.swo2_2'); return view('general.swo2_2');
} }
// 入力画面表示 // メールのURLからアクセス
public function index() public function index()
{ {
// 署名付きURLの有効期限チェック // 署名付きURLの有効期限チェック
@ -59,32 +59,39 @@ class MemberRegistrationController extends Controller
return redirect('error')->withErrors(['error' => '署名の有効期限が切れています']); return redirect('error')->withErrors(['error' => '署名の有効期限が切れています']);
} }
// 初回遷移(GETアクセス)時のリクエストパラメータチェック // パラメータ存在チェック
if (!session()->has('email')) { $encryptedEmail = request()->query('email');
if (!$encryptedEmail) {
return redirect('error')->withErrors(['error' => 'メールアドレスが指定されていません']);
}
// パラメータ存在チェック // パラメータ整合性チェック
$encryptedEmail = request()->query('email'); try {
if (!$encryptedEmail) { $email = decrypt($encryptedEmail);
return redirect('error')->withErrors(['error' => 'メールアドレスが指定されていません']); } catch (\Exception $e) {
return redirect('error')->withErrors(['error' => 'メールアドレスの情報が不正です']);
}
// 二重登録防止チェック
$existingMember = User::where('user_primemail', $email)->get();
foreach ($existingMember as $member) {
if ($member->user_quit_flag != 1) {
return redirect('error')->withErrors(['error' => '既に登録済みです']);
} }
}
// パラメータ整合性チェック // メールアドレスをセッションに保存
try { session(['email' => $email]);
$email = decrypt($encryptedEmail);
} catch (\Exception $e) {
return redirect('error')->withErrors(['error' => 'メールアドレスの情報が不正です']);
}
// 二重登録防止チェック // 入力画面に遷移
$existingMember = User::where('user_primemail', $email)->get(); return view('general.swo2_3');
foreach ($existingMember as $member) { }
if ($member->user_quit_flag != 1) {
return redirect('error')->withErrors(['error' => '既に登録済みです']);
}
}
// メールアドレスをセッションに保存 // リダイレクト用
session(['email' => $email]); public function indexBack(Request $request)
{
if (!session('email')) {
return redirect('error')->withErrors(['error' => '不正なアクセスです']);
} }
// 入力画面に遷移 // 入力画面に遷移
@ -119,9 +126,7 @@ class MemberRegistrationController extends Controller
// バリデーションチェック // バリデーションチェック
$validator = Validator::make($request->all(), $rules, $message); $validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) { if ($validator->fails()) {
return redirect('swo2_3') return redirect('swo2_3B')->withErrors($validator)->withInput();
->withErrors($validator)
->withInput();
} }
// 画面返却値 // 画面返却値
@ -142,7 +147,7 @@ class MemberRegistrationController extends Controller
{ {
// 前の画面に戻る // 前の画面に戻る
if($request->input('back') == 'back'){ if($request->input('back') == 'back'){
return redirect('swo2_3')->withInput(); return redirect('swo2_3B')->withInput();
} }
// 登録完了後のブラウザバックによる二重登録対策 // 登録完了後のブラウザバックによる二重登録対策

View File

@ -31,14 +31,10 @@ class ParkingSearchController extends Controller
// 検索処理 // 検索処理
public function getParkData($city_name, $station_neighbor_station, $park_name) public function getParkData($city_name, $station_neighbor_station, $park_name)
{ {
// 検索仕様
// 駐輪場マスタの全件(条件を絞った場合はその条件に一致するもの)を取得。
// 併せて各マスタから追加情報を取得するが、その際のレコードは全て1対1で結びつく想定で暫定実装する
// ※設計書に詳細な記載なし。DBの定義上は1対多の可能性もあるが、その場合現在の画面イメージと矛盾するため、実態として無い想定で進める
// 駐輪場情報検索 // 駐輪場情報検索
$park = \DB::table('park as p') $park = \DB::table('park as p')
->select( ->select(
'p.park_id',
'p.park_name', 'p.park_name',
'p.park_adrs', 'p.park_adrs',
'p.price_memo', 'p.price_memo',
@ -49,15 +45,12 @@ class ParkingSearchController extends Controller
'p.update_grace_period_end_date', 'p.update_grace_period_end_date',
'p.update_grace_period_end_time', 'p.update_grace_period_end_time',
'c.city_name', 'c.city_name',
's.station_neighbor_station', 's.station_neighbor_station'
'z.psection_id',
'z.zone_standard'
) )
->leftJoin('city as c', 'p.city_id', '=', 'c.city_id') ->leftJoin('city as c', 'p.city_id', '=', 'c.city_id')
->leftJoin(\DB::raw( ->leftJoin(\DB::raw(
'(SELECT park_id, station_neighbor_station FROM station WHERE station_id IN (SELECT MAX(station_id) FROM station GROUP BY park_id)) as s' '(SELECT park_id, station_neighbor_station FROM station WHERE station_id IN (SELECT MAX(station_id) FROM station GROUP BY park_id)) as s'
),'p.park_id','=','s.park_id') ),'p.park_id','=','s.park_id');
->leftJoin('zone as z', 'p.park_id', '=', 'z.park_id');
// プルダウン指定の条件でwhere句を付与 // プルダウン指定の条件でwhere句を付与
if (!empty($city_name)) { if (!empty($city_name)) {
@ -76,42 +69,102 @@ class ParkingSearchController extends Controller
$now = date('Y-m-d H:i:s'); $now = date('Y-m-d H:i:s');
foreach ($park as $row) { foreach ($park as $row) {
// ゾーンマスタの情報から空き台数を取得する // ゾーンマスタの情報を取得する
$vacantInfo = \DB::table('zone') $zoneInfo = \DB::table('zone as z')
->selectRaw('SUM(zone_tolerance) - SUM(zone_number) as vacant') ->select(
->where('psection_id', $row->psection_id) 'z.psection_id',
->groupBy('psection_id') 'z.ptype_id',
->first(); \DB::raw('SUM(z.zone_standard) as zone_standard'),
\DB::raw('SUM(z.zone_number) as zone_number'),
\DB::raw('SUM(z.zone_tolerance) as zone_tolerance'),
'ps.psection_subject',
'pt.ptype_subject'
)
->join('ptype as pt', 'z.ptype_id', '=', 'pt.ptype_id')
->leftJoin('psection as ps', 'z.psection_id', '=', 'ps.psection_id')
->where('z.park_id', $row->park_id)
->groupBy('z.park_id', 'z.ptype_id', 'z.psection_id', 'ps.psection_subject', 'pt.ptype_subject')
->get();
// 定期予約マスタから予約中の台数を取得する // ゾーンマスタが0件の場合、次のデータへ
$reservedCount = \DB::table('reserve') if ($zoneInfo->isEmpty()) {
->where('psection_id', $row->psection_id) $form_data[] = [
->where('valid_flag', 1) 'park_name' => $row->park_name,
->count(); 'park_adrs' => $row->park_adrs,
'price_memo' => $row->price_memo,
'park_latitude' => $row->park_latitude,
'park_longitude' => $row->park_longitude,
'city_name' => $row->city_name,
'station_neighbor_station' => $row->station_neighbor_station,
'zone_data' => []
];
continue;
}
// 更新期間内判定 // 更新期間内判定
$update_start = $row->update_grace_period_start_date . ' ' . $row->update_grace_period_start_time; $update_start = $row->update_grace_period_start_date . ' ' . $row->update_grace_period_start_time;
$update_end = $row->update_grace_period_end_date . ' ' . $row->update_grace_period_end_time; $update_end = $row->update_grace_period_end_date . ' ' . $row->update_grace_period_end_time;
$is_update_period = ($now >= $update_start && $now <= $update_end); $is_update_period = ($now >= $update_start && $now <= $update_end);
// ボタン表示有無判定 // ゾーンマスタの件数分だけループする
$vacant = ($vacantInfo ? $vacantInfo->vacant : 0) - $reservedCount; $zone_data = [];
if ($vacant > 0 && $is_update_period) { // 定期契約ボタン (空き台数が1台以上かつ更新期間内) foreach ($zoneInfo as $zone) {
$status = 1;
} elseif ($vacant <= 0 && $is_update_period) { // 空き待ち予約ボタン (空き台数が0台以下かつ更新期間内) // 予約中件数取得
$status = 2; $reservedCount = \DB::table('reserve')
} elseif ($vacant <= 0 && !$is_update_period) { // 販売期間外ボタン (空き台数が0台以下かつ更新期間外) ->where('park_id', $row->park_id)
$status = 3; ->where('psection_id', $zone->psection_id)
} else { ->where('ptype_id', $zone->ptype_id)
$status = null; ->where('valid_flag', 1)
->count();
// ステータス(表示ボタン)判定
$status = 0; // 0:非表示, 1:定期契約, 2:空き待ち予約, 3:販売期間外
$zone_vacant = $zone->zone_tolerance - $zone->zone_number - $reservedCount;
if ($zone_vacant > 0 && $is_update_period) { // 定期契約ボタン (空き台数が1台以上かつ更新期間内)
$status = 1;
} elseif ($zone_vacant <= 0 && $is_update_period) { // 空き待ち予約ボタン (空き台数が0台以下かつ更新期間内)
$status = 2;
} elseif ($zone_vacant <= 0 && !$is_update_period) { // 販売期間外ボタン (空き台数が0台以下かつ更新期間外)
$status = 3;
}
// 返却用データに追加
$zone_data[] = [
'psection_subject' => $zone->psection_subject,
'ptype_subject' => $zone->ptype_subject,
'zone_standard' => $zone->zone_standard,
'zone_vacant' => $zone_vacant,
'status' => $status
];
} }
// $zone_dataを並び替え
usort($zone_data, function($a, $b) {
// 第一優先: ptype_subject昇順
$ptypeCmp = strcmp($a['ptype_subject'], $b['ptype_subject']);
if ($ptypeCmp !== 0) {
return $ptypeCmp;
}
// 第二優先: psection_subject昇順
$psectionCmp = strcmp($a['psection_subject'], $b['psection_subject']);
if ($psectionCmp !== 0) {
return $psectionCmp;
}
// 第三優先: status昇順
return $a['status'] <=> $b['status'];
});
// 画面返却用データに追加 // 画面返却用データに追加
$form_data[] = [ $form_data[] = [
'park_name' => $row->park_name, 'park_name' => $row->park_name,
'park_adrs' => $row->park_adrs,
'price_memo' => $row->price_memo,
'park_latitude' => $row->park_latitude,
'park_longitude' => $row->park_longitude,
'city_name' => $row->city_name, 'city_name' => $row->city_name,
'station_neighbor_station' => $row->station_neighbor_station, 'station_neighbor_station' => $row->station_neighbor_station,
'status' => $status 'zone_data' => $zone_data
]; ];
} }
@ -133,7 +186,10 @@ class ParkingSearchController extends Controller
'わ行'=>'わをんワヲン ' 'わ行'=>'わをんワヲン '
]; ];
// 車種区分リスト取得
$psections = \DB::table('psection')->select('psection_subject')->orderBy('psection_id', 'asc')->limit(4)->get();
// 情報返却 // 情報返却
return ['form_data' => $form_data, 'cities' => $cities, 'stations' => $stations, 'parks' => $parks, 'conditions' => $conditions]; return ['form_data' => $form_data, 'conditions' => $conditions, 'cities' => $cities, 'stations' => $stations, 'parks' => $parks, 'psections' => $psections];
} }
} }

View File

@ -100,13 +100,13 @@ class RegularContractCreateController extends Controller
// zoneテーブルデータを取得psectionテーブルとJOINしてpsection_subjectも取得 // zoneテーブルデータを取得psectionテーブルとJOINしてpsection_subjectも取得
$zones = DB::table('zone') $zones = DB::table('zone')
->leftJoin('psection', 'zone.psection_id', '=', 'psection.psection_id') ->leftJoin('psection', 'zone.psection_id', '=', 'psection.psection_id')
->select('zone.zone_id', 'zone.park_id', 'zone.psection_id', 'zone.zone_number', 'zone.zone_tolerance', 'psection.psection_subject') ->select('zone.zone_id', 'zone.park_id', 'zone.ptype_id', 'zone.psection_id', 'zone.zone_number', 'zone.zone_tolerance', 'psection.psection_subject')
->get() ->get()
->groupBy('park_id'); ->groupBy('park_id');
// 空き予約マスタデータを取得 // 空き予約マスタデータを取得
$reserve = DB::table('reserve') $reserve = DB::table('reserve')
->select('reserve_id', 'park_id', 'psection_id') ->select('reserve_id', 'park_id', 'ptype_id', 'psection_id')
->where('valid_flag', 1) ->where('valid_flag', 1)
->get() ->get()
->groupBy('park_id'); ->groupBy('park_id');

View File

@ -0,0 +1,96 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
class SealReissueController extends Controller
{
public function index($contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
$contract = DB::table('regular_contract')
->join('park', 'regular_contract.park_id', '=', 'park.park_id')
->where('contract_id', $contract_id)
->select('regular_contract.contract_id', 'park.park_name')
->first();
\Log::info('シール再発行確認画面にアクセス', [
'user_id' => $user_id,
]);
return view('regular_contract.seal_reissue', [
'contract' => $contract,
'active_menu' => 'SWC-3-1', // マイページメニューの選択状態用
'user_name' => $user_name ? $user_name : '', // ユーザー名(ヘッダー用)
]);
}
public function reason($contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
\Log::info('シール再発行理由入力画面にアクセス', [
'user_id' => $user_id,
]);
return view('regular_contract.seal_reissue_reason', [
'contract_id' => $contract_id,
'active_menu' => 'SWC-3-1', // マイページメニューの選択状態用
'user_name' => $user_name ? $user_name : '', // ユーザー名(ヘッダー用)
]);
}
public function complete(Request $request, $contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
$validated = $request->validate([
'reason' => ['required'],
'other_reason' => [
'nullable',
'string',
'max:255',
'regex:/^[\x20-\x7Eぁ-んァ-ヶ一-龠々ーa-zA-Z0-9---Z、。・「」『』()【】[]{}〈〉《》!?:;…ー~\s\r\n]+$/u',
'required_if:reason,その他'
],
], [
'reason.required' => '理由を選択してください。',
'other_reason.max' => 'その他の理由は255文字以内で入力してください。',
'other_reason.regex' => 'その他の理由に使用できない文字が含まれています。',
'other_reason.required_if' => 'その他を選択した場合は理由を入力してください。'
]);
$contract = DB::table('regular_contract')
->join('park', 'regular_contract.park_id', '=', 'park.park_id')
->where('contract_id', $contract_id)
->select('regular_contract.contract_id', 'park.park_name')
->first();
$reason = $request->input('reason');
$other_reason = $request->input('other_reason');
\Log::info('シール再発行申請完了画面にアクセス', [
'user_id' => $user_id,
]);
return view('regular_contract.seal_reissue_complete', [
'active_menu' => 'SWC-3-1', // マイページメニューの選択状態用
'user_name' => $user_name ? $user_name : '', // ユーザー名(ヘッダー用)
'contract' => $contract
]);
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
class UserInformationController extends Controller
{
public function index()
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
// お知らせデータ取得
$informations = DB::table('user_information_history')
->where('user_id', $user_id)
->orderByDesc('user_information_history_id')
->select('entry_date', 'user_information_history')
->limit(10)
->get();
\Log::info('お知らせ画面にアクセス', [
'user_id' => $user_id,
]);
return view('user_information.index', [
'user_name' => $user_name, // ユーザー名(ヘッダー用)
'informations' => $informations
]);
}
public function history()
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
// お知らせデータ取得(全件)
$informations = DB::table('user_information_history')
->where('user_id', $user_id)
->orderByDesc('user_information_history_id')
->select('entry_date', 'user_information_history')
->paginate(10);
\Log::info('過去のお知らせ画面にアクセス', [
'user_id' => $user_id,
]);
return view('user_information.history', [
'user_name' => $user_name, // ユーザー名(ヘッダー用)
'informations' => $informations
]);
}
}

View File

@ -0,0 +1,45 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class UserTagReissueController extends Controller
{
public function index()
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user = DB::table('user')->where('user_id', $user_id)->first();
\Log::info('タグ再発行申請画面にアクセス', [
'user_id' => $user_id,
]);
return view('user.tag_reissue', [
'user' => $user,
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
public function complete()
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user = DB::table('user')->where('user_id', $user_id)->first();
\Log::info('タグ再発行申請完了画面にアクセス', [
'user_id' => $user_id,
]);
return view('user.tag_reissue_complete', [
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
}

View File

@ -8,7 +8,9 @@
"require": { "require": {
"php": "^8.2", "php": "^8.2",
"laravel/framework": "^12.0", "laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1" "laravel/tinker": "^2.10.1",
"mpdf/mpdf": "^8.2",
"simplesoftwareio/simple-qrcode": "^4.2"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.23", "fakerphp/faker": "^1.23",

589
composer.lock generated
View File

@ -4,8 +4,62 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "d8f67b824a1bf31c8999ead558d9b485", "content-hash": "571741bd63db78c990a3a07320a20496",
"packages": [ "packages": [
{
"name": "bacon/bacon-qr-code",
"version": "2.0.8",
"source": {
"type": "git",
"url": "https://github.com/Bacon/BaconQrCode.git",
"reference": "8674e51bb65af933a5ffaf1c308a660387c35c22"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22",
"reference": "8674e51bb65af933a5ffaf1c308a660387c35c22",
"shasum": ""
},
"require": {
"dasprid/enum": "^1.0.3",
"ext-iconv": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phly/keep-a-changelog": "^2.1",
"phpunit/phpunit": "^7 | ^8 | ^9",
"spatie/phpunit-snapshot-assertions": "^4.2.9",
"squizlabs/php_codesniffer": "^3.4"
},
"suggest": {
"ext-imagick": "to generate QR code images"
},
"type": "library",
"autoload": {
"psr-4": {
"BaconQrCode\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"authors": [
{
"name": "Ben Scholzen 'DASPRiD'",
"email": "mail@dasprids.de",
"homepage": "https://dasprids.de/",
"role": "Developer"
}
],
"description": "BaconQrCode is a QR code generator for PHP.",
"homepage": "https://github.com/Bacon/BaconQrCode",
"support": {
"issues": "https://github.com/Bacon/BaconQrCode/issues",
"source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8"
},
"time": "2022-12-07T17:46:57+00:00"
},
{ {
"name": "brick/math", "name": "brick/math",
"version": "0.13.1", "version": "0.13.1",
@ -135,6 +189,56 @@
], ],
"time": "2024-02-09T16:56:22+00:00" "time": "2024-02-09T16:56:22+00:00"
}, },
{
"name": "dasprid/enum",
"version": "1.0.7",
"source": {
"type": "git",
"url": "https://github.com/DASPRiD/Enum.git",
"reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DASPRiD/Enum/zipball/b5874fa9ed0043116c72162ec7f4fb50e02e7cce",
"reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce",
"shasum": ""
},
"require": {
"php": ">=7.1 <9.0"
},
"require-dev": {
"phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "*"
},
"type": "library",
"autoload": {
"psr-4": {
"DASPRiD\\Enum\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"authors": [
{
"name": "Ben Scholzen 'DASPRiD'",
"email": "mail@dasprids.de",
"homepage": "https://dasprids.de/",
"role": "Developer"
}
],
"description": "PHP 7.1 enum implementation",
"keywords": [
"enum",
"map"
],
"support": {
"issues": "https://github.com/DASPRiD/Enum/issues",
"source": "https://github.com/DASPRiD/Enum/tree/1.0.7"
},
"time": "2025-09-16T12:23:56+00:00"
},
{ {
"name": "dflydev/dot-access-data", "name": "dflydev/dot-access-data",
"version": "v3.0.3", "version": "v3.0.3",
@ -2109,6 +2213,239 @@
], ],
"time": "2025-03-24T10:02:05+00:00" "time": "2025-03-24T10:02:05+00:00"
}, },
{
"name": "mpdf/mpdf",
"version": "v8.2.6",
"source": {
"type": "git",
"url": "https://github.com/mpdf/mpdf.git",
"reference": "dd30e3b01061cf8dfe65e7041ab4cc46d8ebdd44"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/dd30e3b01061cf8dfe65e7041ab4cc46d8ebdd44",
"reference": "dd30e3b01061cf8dfe65e7041ab4cc46d8ebdd44",
"shasum": ""
},
"require": {
"ext-gd": "*",
"ext-mbstring": "*",
"mpdf/psr-http-message-shim": "^1.0 || ^2.0",
"mpdf/psr-log-aware-trait": "^2.0 || ^3.0",
"myclabs/deep-copy": "^1.7",
"paragonie/random_compat": "^1.4|^2.0|^9.99.99",
"php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
"psr/http-message": "^1.0 || ^2.0",
"psr/log": "^1.0 || ^2.0 || ^3.0",
"setasign/fpdi": "^2.1"
},
"require-dev": {
"mockery/mockery": "^1.3.0",
"mpdf/qrcode": "^1.1.0",
"squizlabs/php_codesniffer": "^3.5.0",
"tracy/tracy": "~2.5",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"ext-bcmath": "Needed for generation of some types of barcodes",
"ext-xml": "Needed mainly for SVG manipulation",
"ext-zlib": "Needed for compression of embedded resources, such as fonts"
},
"type": "library",
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"Mpdf\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-only"
],
"authors": [
{
"name": "Matěj Humpál",
"role": "Developer, maintainer"
},
{
"name": "Ian Back",
"role": "Developer (retired)"
}
],
"description": "PHP library generating PDF files from UTF-8 encoded HTML",
"homepage": "https://mpdf.github.io",
"keywords": [
"pdf",
"php",
"utf-8"
],
"support": {
"docs": "https://mpdf.github.io",
"issues": "https://github.com/mpdf/mpdf/issues",
"source": "https://github.com/mpdf/mpdf"
},
"funding": [
{
"url": "https://www.paypal.me/mpdf",
"type": "custom"
}
],
"time": "2025-08-18T08:51:51+00:00"
},
{
"name": "mpdf/psr-http-message-shim",
"version": "v2.0.1",
"source": {
"type": "git",
"url": "https://github.com/mpdf/psr-http-message-shim.git",
"reference": "f25a0153d645e234f9db42e5433b16d9b113920f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f",
"reference": "f25a0153d645e234f9db42e5433b16d9b113920f",
"shasum": ""
},
"require": {
"psr/http-message": "^2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Mpdf\\PsrHttpMessageShim\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Dorison",
"email": "mark@chromatichq.com"
},
{
"name": "Kristofer Widholm",
"email": "kristofer@chromatichq.com"
},
{
"name": "Nigel Cunningham",
"email": "nigel.cunningham@technocrat.com.au"
}
],
"description": "Shim to allow support of different psr/message versions.",
"support": {
"issues": "https://github.com/mpdf/psr-http-message-shim/issues",
"source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1"
},
"time": "2023-10-02T14:34:03+00:00"
},
{
"name": "mpdf/psr-log-aware-trait",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/mpdf/psr-log-aware-trait.git",
"reference": "a633da6065e946cc491e1c962850344bb0bf3e78"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78",
"reference": "a633da6065e946cc491e1c962850344bb0bf3e78",
"shasum": ""
},
"require": {
"psr/log": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Mpdf\\PsrLogAwareTrait\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Dorison",
"email": "mark@chromatichq.com"
},
{
"name": "Kristofer Widholm",
"email": "kristofer@chromatichq.com"
}
],
"description": "Trait to allow support of different psr/log versions.",
"support": {
"issues": "https://github.com/mpdf/psr-log-aware-trait/issues",
"source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0"
},
"time": "2023-05-03T06:19:36+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.13.3",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "faed855a7b5f4d4637717c2b3863e277116beb36"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36",
"reference": "faed855a7b5f4d4637717c2b3863e277116beb36",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.13.3"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2025-07-05T12:25:42+00:00"
},
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "3.10.1", "version": "3.10.1",
@ -2507,6 +2844,56 @@
], ],
"time": "2025-05-08T08:14:37+00:00" "time": "2025-05-08T08:14:37+00:00"
}, },
{
"name": "paragonie/random_compat",
"version": "v9.99.100",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
"shasum": ""
},
"require": {
"php": ">= 7"
},
"require-dev": {
"phpunit/phpunit": "4.*|5.*",
"vimeo/psalm": "^1"
},
"suggest": {
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
"homepage": "https://paragonie.com"
}
],
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
"polyfill",
"pseudorandom",
"random"
],
"support": {
"email": "info@paragonie.com",
"issues": "https://github.com/paragonie/random_compat/issues",
"source": "https://github.com/paragonie/random_compat"
},
"time": "2020-10-15T08:29:30+00:00"
},
{ {
"name": "phpoption/phpoption", "name": "phpoption/phpoption",
"version": "1.9.3", "version": "1.9.3",
@ -3271,6 +3658,146 @@
}, },
"time": "2025-06-25T14:20:11+00:00" "time": "2025-06-25T14:20:11+00:00"
}, },
{
"name": "setasign/fpdi",
"version": "v2.6.4",
"source": {
"type": "git",
"url": "https://github.com/Setasign/FPDI.git",
"reference": "4b53852fde2734ec6a07e458a085db627c60eada"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada",
"reference": "4b53852fde2734ec6a07e458a085db627c60eada",
"shasum": ""
},
"require": {
"ext-zlib": "*",
"php": "^7.1 || ^8.0"
},
"conflict": {
"setasign/tfpdf": "<1.31"
},
"require-dev": {
"phpunit/phpunit": "^7",
"setasign/fpdf": "~1.8.6",
"setasign/tfpdf": "~1.33",
"squizlabs/php_codesniffer": "^3.5",
"tecnickcom/tcpdf": "^6.8"
},
"suggest": {
"setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured."
},
"type": "library",
"autoload": {
"psr-4": {
"setasign\\Fpdi\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jan Slabon",
"email": "jan.slabon@setasign.com",
"homepage": "https://www.setasign.com"
},
{
"name": "Maximilian Kresse",
"email": "maximilian.kresse@setasign.com",
"homepage": "https://www.setasign.com"
}
],
"description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.",
"homepage": "https://www.setasign.com/fpdi",
"keywords": [
"fpdf",
"fpdi",
"pdf"
],
"support": {
"issues": "https://github.com/Setasign/FPDI/issues",
"source": "https://github.com/Setasign/FPDI/tree/v2.6.4"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/setasign/fpdi",
"type": "tidelift"
}
],
"time": "2025-08-05T09:57:14+00:00"
},
{
"name": "simplesoftwareio/simple-qrcode",
"version": "4.2.0",
"source": {
"type": "git",
"url": "https://github.com/SimpleSoftwareIO/simple-qrcode.git",
"reference": "916db7948ca6772d54bb617259c768c9cdc8d537"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/SimpleSoftwareIO/simple-qrcode/zipball/916db7948ca6772d54bb617259c768c9cdc8d537",
"reference": "916db7948ca6772d54bb617259c768c9cdc8d537",
"shasum": ""
},
"require": {
"bacon/bacon-qr-code": "^2.0",
"ext-gd": "*",
"php": ">=7.2|^8.0"
},
"require-dev": {
"mockery/mockery": "~1",
"phpunit/phpunit": "~9"
},
"suggest": {
"ext-imagick": "Allows the generation of PNG QrCodes.",
"illuminate/support": "Allows for use within Laravel."
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"QrCode": "SimpleSoftwareIO\\QrCode\\Facades\\QrCode"
},
"providers": [
"SimpleSoftwareIO\\QrCode\\QrCodeServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"SimpleSoftwareIO\\QrCode\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Simple Software LLC",
"email": "support@simplesoftware.io"
}
],
"description": "Simple QrCode is a QR code generator made for Laravel.",
"homepage": "https://www.simplesoftware.io/#/docs/simple-qrcode",
"keywords": [
"Simple",
"generator",
"laravel",
"qrcode",
"wrapper"
],
"support": {
"issues": "https://github.com/SimpleSoftwareIO/simple-qrcode/issues",
"source": "https://github.com/SimpleSoftwareIO/simple-qrcode/tree/4.2.0"
},
"time": "2021-02-08T20:43:55+00:00"
},
{ {
"name": "symfony/clock", "name": "symfony/clock",
"version": "v7.3.0", "version": "v7.3.0",
@ -6258,66 +6785,6 @@
}, },
"time": "2024-05-16T03:13:13+00:00" "time": "2024-05-16T03:13:13+00:00"
}, },
{
"name": "myclabs/deep-copy",
"version": "1.13.3",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "faed855a7b5f4d4637717c2b3863e277116beb36"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36",
"reference": "faed855a7b5f4d4637717c2b3863e277116beb36",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
"doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
"phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.13.3"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2025-07-05T12:25:42+00:00"
},
{ {
"name": "nunomaduro/collision", "name": "nunomaduro/collision",
"version": "v8.8.2", "version": "v8.8.2",

View File

@ -31,7 +31,7 @@
<h3 class="other mt50">開示等の依頼の手続き、使用する様式</h3> <h3 class="other mt50">開示等の依頼の手続き、使用する様式</h3>
<p class="p1">開示等の依頼は、以下の手続き及び様式に則って実施致します。</p> <p class="p1">開示等の依頼は、以下の手続き及び様式に則って実施致します。</p>
<p class="p1">利用目的の通知:本書面の“開示対象個人情報の利用目的”をご覧下さい。</p> <p class="p1">利用目的の通知:本書面の“開示対象個人情報の利用目的”をご覧下さい。</p>
<p class="p1">開示、訂正・削除、利用停止:当社の定める様式にて実施致します。該当の受付け窓口にご連絡頂き、所定の様式『<a href="{{ asset('assets/page-img/privacy_disclosure.pdf') }}" target="_blank">個人情報開示等依頼書(PDF:9KB)</a>』を入手のうえ、手続きをお願い致します。</p> <p class="p1">開示、訂正・削除、利用停止:当社の定める様式にて実施致します。該当の受付け窓口にご連絡頂き、所定の様式『<a href="{{ asset('assets/privacy_disclosure.pdf') }}" target="_blank">個人情報開示等依頼書(PDF:9KB)</a>』を入手のうえ、手続きをお願い致します。</p>
<p class="p1">回答に関しては、記入済み個人情報開示等依頼書を、ご自宅への郵送のみとさせて頂きます。</p> <p class="p1">回答に関しては、記入済み個人情報開示等依頼書を、ご自宅への郵送のみとさせて頂きます。</p>
<h3 class="other mt50">開示対象個人情報の取扱いに関する苦情受付け窓口</h3> <h3 class="other mt50">開示対象個人情報の取扱いに関する苦情受付け窓口</h3>
<p class="p1">開示対象個人情報の取扱いに関する苦情、相談に関しましては、以下の窓口宛てにご連絡ください。</p> <p class="p1">開示対象個人情報の取扱いに関する苦情、相談に関しましては、以下の窓口宛てにご連絡ください。</p>

View File

@ -65,10 +65,12 @@
<table id="searchTable" class="tablesorter table table-striped"> <table id="searchTable" class="tablesorter table table-striped">
<thead> <thead>
<tr> <tr>
<th>駐輪場名</th> <th width="20%">駐輪場名</th>
<th>市町村名</th> <th width="30%">市町村名</th>
<th>駅名</th> <th width="20%">駅名</th>
<th></th> @foreach($psections as $psection)
<th width="10%">{{ $psection->psection_subject }}</th>
@endforeach
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -82,18 +84,39 @@
@endphp @endphp
@foreach($pagedData as $data) @foreach($pagedData as $data)
<tr> <tr>
<td><a href="#placeModal" data-toggle="modal" data-target="#placeModal">{{ $data['park_name'] }}</a></td> <td>
<a href="#placeModal"
data-toggle="modal"
data-target="#placeModal"
data-park_name="{{ $data['park_name'] }}"
data-park_adrs="{{ $data['park_adrs'] ?? '' }}"
data-price_memo="{{ $data['price_memo'] ?? '' }}"
data-park_latitude="{{ $data['park_latitude'] ?? '' }}"
data-park_longitude="{{ $data['park_longitude'] ?? '' }}"
data-city_name="{{ $data['city_name'] }}"
data-station="{{ $data['station_neighbor_station'] }}"
data-zone_data='@json($data["zone_data"])'>
{{ $data['park_name'] }}
</a>
</td>
<td>{{ $data['city_name'] }}</td> <td>{{ $data['city_name'] }}</td>
<td>{{ $data['station_neighbor_station'] }}</td> <td>{{ $data['station_neighbor_station'] }}</td>
<td> @foreach($psections as $psection)
@if($data['status'] == 1) <td>
<a href="{{route('user.info')}}" class="btn btn-block btn-sm btn-outline-success">定期契約</a> @foreach($data['zone_data'] as $zone)
@elseif($data['status'] == 2) @if($zone['psection_subject'] == $psection->psection_subject)
<a href="{{route('park_waitlist.index')}}" class="btn btn-block btn-sm btn-outline-primary">空き待ち予約</a> @if($zone['status'] == 1)
@elseif($data['status'] == 3) <a href="{{route('user.info')}}" class="btn btn-block btn-sm btn-outline-success">定期契約</a>
<a href="{{route('park_waitlist.index')}}" class="btn btn-block btn-sm btn-secondary">販売期間外</a> @elseif($zone['status'] == 2)
@endif <a href="{{route('park_waitlist.index')}}" class="btn btn-block btn-sm btn-outline-primary">空き待ち予約</a>
</td> @elseif($zone['status'] == 3)
<a href="{{route('park_waitlist.index')}}" class="btn btn-block btn-sm btn-secondary">販売期間外</a>
@endif
@break;
@endif
@endforeach
</td>
@endforeach
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>
@ -133,29 +156,86 @@
<div class="modal fade" id="placeModal" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal fade" id="placeModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document"> <div class="modal-dialog modal-lg" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <script>
<h5 class="modal-title" id="modalParkName">駐輪場名</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="閉じる"><span aria-hidden="true">&times;</span></button>
</div>
<script>
$(function() {
$('#placeModal').on('show.bs.modal', function (event) { $('#placeModal').on('show.bs.modal', function (event) {
var button = $(event.relatedTarget); var button = $(event.relatedTarget);
var parkName = button.text(); var parkName = button.data('park_name') || '';
$('#modalParkName').text(parkName); var parkAdrs = button.data('park_adrs') || '';
var parkMemo = button.data('price_memo') || '';
var lat = button.data('park_latitude') || '';
var lng = button.data('park_longitude') || '';
$('#parkName').text(parkName).attr('data-park_name', parkName);
$('#parkAdrs').text('住所:' + parkAdrs).attr('data-park_adrs', parkAdrs);
$('#parkmemo').text(parkMemo).attr('data-price_memo', parkMemo);
$('#parkMap').attr('src', 'https://www.google.com/maps?q=' + lat + ',' + lng + '&z=15&output=embed');
// zone_dataはJSON文字列として渡されているのでパース
var zoneData = button.data('zone_data') || [];
// psection_subjectごとの標準収容台数を集計
var standardMap = {};
if (zoneData && Array.isArray(zoneData)) {
zoneData.forEach(function(zone) {
if (!standardMap[zone.psection_subject]) {
standardMap[zone.psection_subject] = 0;
}
standardMap[zone.psection_subject] += parseInt(zone.zone_standard, 10) || 0;
});
}
// 表示用文字列を生成
var standardText = '';
var keys = Object.keys(standardMap);
if (keys.length > 0) {
standardText = '【標準収容台数】';
standardText += keys.map(function(key) {
return key + '' + standardMap[key] + '台';
}).join(' / ');
}
$('#parkStandard').text(standardText);
// 各ゾーンの空き台数・ボタンを表示
var html = '';
if (zoneData && Array.isArray(zoneData)) {
var grouped = {};
zoneData.forEach(function(zone) {
if (!grouped[zone.ptype_subject]) grouped[zone.ptype_subject] = [];
grouped[zone.ptype_subject].push(zone);
});
Object.keys(grouped).forEach(function(ptype) {
html += '<h4 class="mt-3">' + ptype + '</h4>';
grouped[ptype].forEach(function(zone) {
html += '<div class="d-flex align-items-center mb-2">';
html += '<span>' + zone.psection_subject + ':空き' + zone.zone_vacant + '台</span>';
if (zone.status == 1) {
html += '<a href="{{route('regular_contract.create')}}" class="btn btn-sm btn-outline-success ml-2">定期契約</a>';
} else if (zone.status == 2) {
html += '<a href="{{route('park_waitlist.index')}}" class="btn btn-sm btn-outline-primary ml-2">空き待ち予約</a>';
} else if (zone.status == 3) {
html += '<a href="{{route('park_waitlist.index')}}" class="btn btn-sm btn-outline-secondary ml-2">販売期間外</a>';
}
html += '</div>';
});
});
}
$('#zoneData').html(html);
}); });
}); </script>
</script> <div class="modal-header">
<h5 class="modal-title" id="parkName" data-park_name=""></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="閉じる"><span aria-hidden="true">&times;</span></button>
</div>
<div class="modal-body"> <div class="modal-body">
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3240.722943699139!2d139.75162621525894!3d35.68382338019366!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188c0b185b3b75%3A0x3282e79fbc91959c!2z44CSMTAwLTAwMDEg5p2x5Lqs6YO95Y2D5Luj55Sw5Yy65Y2D5Luj55Sw77yR4oiS77yR!5e0!3m2!1sja!2sjp!4v1536695351221" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe> <iframe id="parkMap" src="" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
<p class="small">〒000-0000 東京都千代田区1-1 <br class="sp">標準収容台数XXX台</p> <p class="small">
<p class="text-danger">空き台数XXX台</p> <span id="parkAdrs"> </span>
<span id="parkStandard"></span><br />
<span id="parkmemo"></span>
</p>
<span id="zoneData"></span>
<div class="text-right"><button type="button" class="btn btn-outline-secondary" data-dismiss="modal">閉じる</button></div>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer"></div>
<button type="submit" class="btn btn-success" onClick="location.href='./SWC-08-02.html'">定期契約</button>
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">閉じる</button>
</div>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -5,13 +5,18 @@
<div class="col-12 col-lg-10 offset-0 offset-lg-1 mt20 mb20"> <div class="col-12 col-lg-10 offset-0 offset-lg-1 mt20 mb20">
<h2 class="text-success text-center">お問い合わせ</h2> <h2 class="text-success text-center">お問い合わせ</h2>
<p>株式会社ソーリンへのご訪問ありがとうございます。 <p>株式会社ソーリンへのご訪問ありがとうございます。
お問い合わせいただくお客さまは、当社のホームページにおける<a href="{{ route('swo14_1') }}">個人情報の取り扱い</a>について、あらかじめご確認いただき、ご同意いただいた上でお問い合わせください。個人情報の開示、訂正、削除、利用停止については、<a href="{{ asset('assets/privacy_disclosure.pdf') }}">こちら</a>をご覧下さい。<br> お問い合わせいただくお客さまは、当社のホームページにおける<a href="{{ route('swo14_1') }}">個人情報の取り扱い</a>について、あらかじめご確認いただき、ご同意いただいた上でお問い合わせください。個人情報の開示、訂正、削除、利用停止については、<a href="{{ route('swo15_1') }}">こちら</a>をご覧下さい。<br>
また、メールから送信ができないお客様はお手数ですが、下記電話までご連絡をお願い致します。 また、メールから送信ができないお客様はお手数ですが、下記電話までご連絡をお願い致します。
携帯・スマートフォンからメールでのお問い合わせの際に、確実にご返信をさせていただくために、ドメイン (so-manager.com) の受信許可設定をお願い致します。</p> 携帯・スマートフォンからメールでのお問い合わせの際に、確実にご返信をさせていただくために、ドメイン (so-manager.com) の受信許可設定をお願い致します。</p>
<form class="form-contact form mt50" method="post" action="{{ route('swo7_2') }}"> <form class="form-contact form mt50" method="post" action="{{ route('swo7_2') }}">
@if($errors->any())
<div class="alert alert-danger error-message" role="alert">
@foreach ($errors->all() as $error){{ $error }}<br /> @endforeach
</div>
@endif
<div class="row"> <div class="row">
@foreach($form_data as $value) @foreach($form_data as $value)
<div class="col-lg-3">{{ $value[2] }}</div> <div class="col-lg-3">{!! preg_replace('/\*$/', '<span style="color:red;">*</span>', e($value[2])) !!}</div>
@if($value[1] == 'textarea') @if($value[1] == 'textarea')
<div class="col-lg-9"><textarea name="{{ $value[0] }}" cols="6" class="form-control">{{ old($value[0]) }}</textarea></div> <div class="col-lg-9"><textarea name="{{ $value[0] }}" cols="6" class="form-control">{{ old($value[0]) }}</textarea></div>
@elseif($value[1] == 'checkbox') @elseif($value[1] == 'checkbox')
@ -25,18 +30,10 @@
@endforeach @endforeach
</div> </div>
@else @else
<div class="col-lg-9"><input name="{{ $value[0] }}" type="{{ $value[1] }}" value="{{ old($value[0]) }}" class="form-control mb10"></div> <div class="col-lg-9"><input name="{{ $value[0] }}" type="{{ $value[1] }}" value="{{ old($value[0]) }}" class="form-control mb10" placeholder="{{ $value[3] }}"></div>
@endif @endif
@endforeach @endforeach
</div> </div>
<p style="color: red;">
@foreach($form_data as $value)
@if($errors->has($value[0]))
{{ $errors->first($value[0]) }}
@break;
@endif
@endforeach
</p>
<div class="col-lg-12 mt50 mb50 text-center"><button type="submit" class="btn btn-lg btn-success mb10">入力内容を確認する</button></div> <div class="col-lg-12 mt50 mb50 text-center"><button type="submit" class="btn btn-lg btn-success mb10">入力内容を確認する</button></div>
@csrf @csrf
</form> </form>

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="col-12 col-lg-3 text-lg-center offset-0 offset-lg-1"><label>パスワード</label></div> <div class="col-12 col-lg-3 text-lg-center offset-0 offset-lg-1"><label>パスワード</label></div>
<div class="col-12 col-lg-7 mb10"> <div class="col-12 col-lg-7 mb10">
<input type="text" name="password" class="form-control form-control-lg" value="" /> <input type="password" name="password" class="form-control form-control-lg" value="" />
</div> </div>
<div class="col-12 col-lg-6 text-lg-center offset-0 offset-lg-3 mt30 mb50"> <div class="col-12 col-lg-6 text-lg-center offset-0 offset-lg-3 mt30 mb50">
<div class="text-danger">@if ($errors->any()) @foreach ($errors->all() as $error) {{ $error }} @endforeach @endif</div><br /> <div class="text-danger">@if ($errors->any()) @foreach ($errors->all() as $error) {{ $error }} @endforeach @endif</div><br />

View File

@ -5,6 +5,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>@yield('title', 'So-Manager')</title> <title>@yield('title', 'So-Manager')</title>
<link rel="icon" href="{{ asset('assets/img/favicon.ico') }}">
<link href="{{ asset('assets/css/mypage/app.css') }}" rel="stylesheet"> <link href="{{ asset('assets/css/mypage/app.css') }}" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/typicons/2.0.9/typicons.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/typicons/2.0.9/typicons.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/earlyaccess/roundedmplus1c.css" rel="stylesheet"> <link href="https://fonts.googleapis.com/earlyaccess/roundedmplus1c.css" rel="stylesheet">

View File

@ -50,7 +50,7 @@
</div> </div>
<div class="col-6 col-md-2 mb20"> <div class="col-6 col-md-2 mb20">
<div class="card text-center border-success"> <div class="card text-center border-success">
<a href="{{ url('SWC-15-1.html') }}" target="_top"> <a href="{{ url('/user_information') }}" target="_top">
<figure><img src="{{ asset('assets/img/menu-tuuchi.png') }}" alt="" class="w-75 mt10"></figure> <figure><img src="{{ asset('assets/img/menu-tuuchi.png') }}" alt="" class="w-75 mt10"></figure>
<p class="text-success">お知らせ一覧</p> <p class="text-success">お知らせ一覧</p>
</a> </a>

View File

@ -89,18 +89,31 @@
<td> <td>
@php @php
$zonesForType = ($zones[$row->park_id] ?? collect())->where('psection_subject', $vehicle); $zonesForType = ($zones[$row->park_id] ?? collect())->where('psection_subject', $vehicle);
@endphp // 空き台数計算
@forelse ($zonesForType as $zone) $hasVacancy = false;
@php foreach ($zonesForType as $zone) {
$reserveCount = ($reserve[$row->park_id] ?? collect()) $reserveCount = ($reserve[$row->park_id] ?? collect())
->where('psection_id', $zone->psection_id) ->where('psection_id', $zone->psection_id)
->where('ptype_id', $zone->ptype_id)
->count(); ->count();
$vacancy = $zone->zone_tolerance - $zone->zone_number - $reserveCount; $vacancy = $zone->zone_tolerance - $zone->zone_number - $reserveCount;
if ($vacancy > 0) {
$hasVacancy = true;
break;
}
}
// 猶予期間判定 // 猶予期間判定
$grace = $city_grace_periods[$row->city_id] ?? null; $grace = $city_grace_periods[$row->city_id] ?? null;
$now = \Carbon\Carbon::now(); $gracePeriodValid =
$grace &&
is_numeric($grace->update_grace_period_start_date) &&
preg_match('/^\d{1,2}:\d{2}$/', $grace->update_grace_period_start_time) &&
is_numeric($grace->update_grace_period_end_date) &&
preg_match('/^\d{1,2}:\d{2}$/', $grace->update_grace_period_end_time);
$inGrace = false; $inGrace = false;
if ($grace && $grace->update_grace_period_start_date && $grace->update_grace_period_start_time && $grace->update_grace_period_end_date && $grace->update_grace_period_end_time) { if ($gracePeriodValid) {
$now = \Carbon\Carbon::now();
$year = $now->year; $year = $now->year;
$month = $now->month; $month = $now->month;
$startDay = (int)$grace->update_grace_period_start_date; $startDay = (int)$grace->update_grace_period_start_date;
@ -125,16 +138,17 @@
} }
} }
@endphp @endphp
@if ($vacancy > 0 && $inGrace) @if ($zonesForType->isNotEmpty() && $gracePeriodValid)
@if ($hasVacancy && $inGrace)
<button class="btn btn-block btn-sm btn-outline-success btn_82-table btn-popup" data-park-id="{{ $row->park_id }}">定期契約</button> <button class="btn btn-block btn-sm btn-outline-success btn_82-table btn-popup" data-park-id="{{ $row->park_id }}">定期契約</button>
@elseif (!$inGrace) @elseif (!$inGrace)
<button class="btn btn-block btn-sm btn-outline-danger btn_103-table btn-popup" data-park-id="{{ $row->park_id }}">販売期間外</button> <button class="btn btn-block btn-sm btn-outline-danger btn_103-table btn-popup" data-park-id="{{ $row->park_id }}">販売期間外</button>
@elseif ($vacancy <= 0 && $inGrace) @elseif (!$hasVacancy && $inGrace)
<button class="btn btn-block btn-sm btn-outline-danger btn_103-table btn-popup" data-park-id="{{ $row->park_id }}">空き待ち申込</button> <button class="btn btn-block btn-sm btn-outline-danger btn_103-table btn-popup" data-park-id="{{ $row->park_id }}">空き待ち申込</button>
@endif @endif
@empty @else
<span class="text-muted"></span> <span class="text-muted"></span>
@endforelse @endif
</td> </td>
@endforeach @endforeach
</tr> </tr>

View File

@ -262,26 +262,35 @@ return null;
<button type="button" id="cancelModalBtn" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;" data-bs-toggle="modal" data-bs-target="#cancelModal">解約について</button> <button type="button" id="cancelModalBtn" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;" data-bs-toggle="modal" data-bs-target="#cancelModal">解約について</button>
@endif @endif
</div> </div>
@php <div style="display: flex; gap: 6px;">
$has_receipt = DB::table('inv_publish')->where('contract_id', $contract->contract_id)->exists(); @php
@endphp $has_receipt = DB::table('inv_publish')->where('contract_id', $contract->contract_id)->exists();
@if($has_receipt) @endphp
@if($bg == 'alert-warning') @if($has_receipt)
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a> @if($bg == 'alert-warning')
@elseif($bg == 'alert-danger') <a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a> @elseif($bg == 'alert-danger')
@else <a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a> @else
@endif <a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@else @endif
@if($bg == 'alert-warning') @else
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a> @if($bg == 'alert-warning')
@elseif($bg == 'alert-danger') <a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a> @elseif($bg == 'alert-danger')
@else <a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a> @else
@endif <a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@endif @endif
@endif
@if($bg == 'alert-warning')
<a href="{{ url('seal/reissue/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">シール再発行</a>
@elseif($bg == 'alert-danger')
<a href="{{ url('seal/reissue/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">シール再発行</a>
@else
<a href="{{ url('seal/reissue/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">シール再発行</a>
@endif
</div>
</div> </div>
</td> </td>
</tr> </tr>

View File

@ -36,64 +36,79 @@
</div> </div>
<!-- 空き台数・契約情報 --> <!-- 空き台数・契約情報 -->
<div class="mt-3"> <div class="mt-3">
@foreach($zones as $zone)
@php @php
$vacant = $vacancyData[$zone->psection_id . '_' . $zone->ptype_subject] ?? 0; $zonesByPtype = $zones->groupBy('ptype_id');
$grace = $city_grace_periods[$park->city_id] ?? null;
$now = \Carbon\Carbon::now();
// 猶予期間判定
$isGracePeriod = false;
if ($grace && $grace->update_grace_period_start_date && $grace->update_grace_period_start_time && $grace->update_grace_period_end_date && $grace->update_grace_period_end_time) {
$now = \Carbon\Carbon::now();
$year = $now->year;
$month = $now->month;
$startDay = (int)$grace->update_grace_period_start_date;
$endDay = (int)$grace->update_grace_period_end_date;
$startTime = $grace->update_grace_period_start_time;
$endTime = $grace->update_grace_period_end_time;
if ($startDay > $endDay) {
// 月またぎ
$start = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $startDay, $startTime));
$nextMonth = $month == 12 ? 1 : $month + 1;
$nextYear = $month == 12 ? $year + 1 : $year;
$end = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $nextYear, $nextMonth, $endDay, $endTime));
} else {
// 同月
$start = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $startDay, $startTime));
$end = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $endDay, $endTime));
}
$isGracePeriod = $now->between($start, $end);
}
@endphp @endphp
<div class="mb-2"> @foreach($zonesByPtype as $ptypeId => $zonesGroup)
<strong>{{ $zone->ptype_subject }}</strong><br> <div class="mb-3">
{{ $zone->psection_subject }}:空き {{ $vacant }} <strong>{{ $zonesGroup->first()->ptype_subject }}</strong>
@if($isGracePeriod) <div style="display: flex; gap: 1em;">
@if($vacant > 0) @foreach($zonesGroup as $zone)
<button type="button" class="btn btn-success btn-sm btn-contract" @php
data-park-id="{{ $park->park_id }}" $vacant = $vacancyData[$zone->psection_id . '_' . $zone->ptype_subject] ?? 0;
data-psection-id="{{ $zone->psection_id }}" $grace = $city_grace_periods[$park->city_id] ?? null;
data-ptype-id="{{ $zone->ptype_id }}"> $now = \Carbon\Carbon::now();
定期契約
</button> // 猶予期間判定
@else $isGracePeriod = false;
<button type="button" class="btn btn-danger btn_103 btn-reserve" if ($grace && $grace->update_grace_period_start_date && $grace->update_grace_period_start_time && $grace->update_grace_period_end_date && $grace->update_grace_period_end_time) {
data-park-id="{{ $park->park_id }}" $now = \Carbon\Carbon::now();
data-psection-id="{{ $zone->psection_id }}" $year = $now->year;
data-ptype-id="{{ $zone->ptype_id }}"> $month = $now->month;
空き待ち申込 $startDay = (int)$grace->update_grace_period_start_date;
</button> $endDay = (int)$grace->update_grace_period_end_date;
@endif $startTime = $grace->update_grace_period_start_time;
@else $endTime = $grace->update_grace_period_end_time;
<button type="button" class="btn btn-danger btn_103 btn-reserve"
data-park-id="{{ $park->park_id }}" if ($startDay > $endDay) {
data-psection-id="{{ $zone->psection_id }}" // 月またぎ
data-ptype-id="{{ $zone->ptype_id }}"> // 前月の開始日~今月の終了日
販売期間外 $prevMonth = $now->copy()->subMonth();
</button> $startPrev = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $prevMonth->year, $prevMonth->month, $startDay, $grace->update_grace_period_start_time));
@endif $endCurr = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $endDay, $grace->update_grace_period_end_time));
// 今月の開始日~翌月の終了日
$startCurr = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $startDay, $grace->update_grace_period_start_time));
$nextMonth = $month == 12 ? 1 : $month + 1;
$nextYear = $month == 12 ? $year + 1 : $year;
$endNext = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $nextYear, $nextMonth, $endDay, $grace->update_grace_period_end_time));
$isGracePeriod = $now->between($startPrev, $endCurr) || $now->between($startCurr, $endNext);
} else {
// 同月
$start = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $startDay, $grace->update_grace_period_start_time));
$end = \Carbon\Carbon::createFromFormat('Y-m-d H:i', sprintf('%04d-%02d-%02d %s', $year, $month, $endDay, $grace->update_grace_period_end_time));
$isGracePeriod = $now->between($start, $end);
}
}
@endphp
<div class="mb-2">
{{ $zone->psection_subject }}:空き {{ max(0, $vacant) }}
@if($isGracePeriod)
@if($vacant > 0)
<button type="button" class="btn btn-success btn-sm btn-contract"
data-park-id="{{ $park->park_id }}"
data-psection-id="{{ $zone->psection_id }}"
data-ptype-id="{{ $zone->ptype_id }}">
定期契約
</button>
@else
<button type="button" class="btn btn-danger btn_103 btn-reserve"
data-park-id="{{ $park->park_id }}"
data-psection-id="{{ $zone->psection_id }}"
data-ptype-id="{{ $zone->ptype_id }}">
空き待ち申込
</button>
@endif
@else
<button type="button" class="btn btn-danger btn_103 btn-reserve"
data-park-id="{{ $park->park_id }}"
data-psection-id="{{ $zone->psection_id }}"
data-ptype-id="{{ $zone->ptype_id }}">
販売期間外
</button>
@endif
</div>
@endforeach
</div>
</div> </div>
@endforeach @endforeach
</div> </div>

View File

@ -0,0 +1,27 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">定期契約情報確認 > シール再発行</h4>
</header>
<section id="" class="container mt30 mb50">
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<h3 class="text-center alert-success">選択した駐輪場</h3>
</div>
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<h3 class="text-center alert-warning">
<span class="small">定期契約ID: {{ $contract->contract_id }}<br>{{ $contract->park_name }}</span>
</h3>
<p class="text-center"><br>こちらのシールを再発行します。<br>よろしいですか?</p>
</div>
<div class="row">
<div class="col-12 col-md-5 offset-md-1 mt10">
<a href="{{ url('regular_contract/info') }}" class="btn btn-lg btn-block btn-outline-success">戻る</a>
</div>
<div class="col-12 col-md-5 mt10">
<a href="{{ url('seal/reissue/reason/' . $contract->contract_id) }}" class="btn btn-lg btn-block btn-success">進む</a>
</div>
</div>
</section>
</main>
@endsection

View File

@ -0,0 +1,20 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">定期契約情報確認 > シール再発行</h4>
</header>
<section id="" class="container mt30 mb50">
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<h3 class="text-center alert-warning">
<span class="small">定期契約ID: {{ $contract->contract_id }}<br></span>
<span>{{ $contract->park_name }}</span>
</h3>
<p class="text-center"><br>こちらのシールの再発行準備が整いました。<br>上記駐輪場にてシールをお受け取りください。</p>
</div>
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<a href="{{ url('mypage') }}" class="btn btn-lg btn-block btn-outline-success">マイページへ戻る</a>
</div>
</section>
</main>
@endsection

View File

@ -0,0 +1,86 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">ユーザー情報確認 > シール再発行理由</h4>
</header>
@if ($errors->any())
<div class="alert alert-danger text-center">
@foreach ($errors->all() as $error)
<div>{{ $error }}</div>
@endforeach
</div>
@endif
<section class="container mt30 mb50">
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<h2 class="text-center alert-success">再発行手続き</h2>
</div>
<form method="POST" action="{{ url('seal/reissue/complete/' . $contract_id) }}">
@csrf
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<div class="mb-4">
<div class="form-check">
<input class="form-check-input" type="radio" name="reason" id="reason1" value="自動車の買い換え">
<label class="form-check-label" for="reason1">自動車の買い換え</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="reason" id="reason2" value="汚損">
<label class="form-check-label" for="reason2">汚損</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="reason" id="reason3" value="盗難">
<label class="form-check-label" for="reason3">盗難</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="reason" id="reason4" value="その他">
<label class="form-check-label" for="reason4">その他</label>
</div>
</div>
<div class="mb-4" id="other-reason-area" style="display: none;">
<textarea class="form-control" name="other_reason" rows="4" maxlength="255"
placeholder="その他の場合、こちらへ理由をご入力ください" style="resize: none;"></textarea>
<div class="text-right small"><span id="char-count">0</span>/255</div>
</div>
<div class="mb-4">
【再発行に関する注意事項】<br>
2回以上の再発行には別途手続きが必要です。<br>
紛失にはご注意ください。
</div>
</div>
<div class="row">
<div class="col-12 col-md-5 offset-md-1 mt10">
<a href="{{ url('seal/reissue/' . $contract_id) }}" class="btn btn-lg btn-block btn-outline-success">戻る</a>
</div>
<div class="col-12 col-md-5 mt10">
<button type="submit" class="btn btn-lg btn-block btn-success">進む</button>
</div>
</div>
</form>
</section>
</main>
<script>
document.addEventListener('DOMContentLoaded', function() {
// ラジオボタンの選択でテキストエリア表示切替
const radios = document.querySelectorAll('input[name="reason"]');
const otherArea = document.getElementById('other-reason-area');
radios.forEach(radio => {
radio.addEventListener('change', function() {
if (this.value === 'その他') {
otherArea.style.display = '';
} else {
otherArea.style.display = 'none';
}
});
});
// 文字数カウント
const textarea = document.querySelector('textarea[name="other_reason"]');
const charCount = document.getElementById('char-count');
if (textarea) {
textarea.addEventListener('input', function() {
charCount.textContent = this.value.length;
});
}
});
</script>
@endsection

View File

@ -16,7 +16,7 @@ return null;
@endphp @endphp
<main> <main>
<header class="alert alert-success"> <header class="alert alert-success">
<h4 class="container">定期契約情報 > 定期契約情報を確認する</h4> <h4 class="container">契約更新 > 定期契約を更新する</h4>
</header> </header>
<section class="container mt30 mb50"> <section class="container mt30 mb50">
@if(count($contracts) > 0) @if(count($contracts) > 0)
@ -294,7 +294,6 @@ return null;
</section> </section>
</main> </main>
@endsection
<!-- 解約についてモーダル --> <!-- 解約についてモーダル -->
<div class="modal fade" id="cancelModal" tabindex="-1" aria-labelledby="cancelModalLabel" aria-hidden="true"> <div class="modal fade" id="cancelModal" tabindex="-1" aria-labelledby="cancelModalLabel" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
@ -319,3 +318,4 @@ return null;
} }
</style> </style>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
@endsection

View File

@ -3,9 +3,9 @@
@section('content') @section('content')
<main> <main>
@if (session('success')) @if (session('success'))
<div class="alert alert-success"> <div class="alert alert-success">
{{ session('success') }} {{ session('success') }}
</div> </div>
@endif @endif
<header class="alert alert-success"> <header class="alert alert-success">
<h4 class="container">ユーザー情報確認 > ユーザー情報</h4> <h4 class="container">ユーザー情報確認 > ユーザー情報</h4>
@ -87,9 +87,9 @@
</div> </div>
<div class="col-12 col-lg-6 mb10"> <div class="col-12 col-lg-6 mb10">
@if(!empty($user->photo_filename1)) @if(!empty($user->photo_filename1))
<h3><img src="{{ asset('storage/photo/' . $user->photo_filename1) }}"></h3> <h3><img src="{{ asset('storage/photo/' . $user->photo_filename1) }}"></h3>
@else @else
<h3></h3> <h3></h3>
@endif @endif
</div> </div>
<div class="col-12 col-md-3 offset-0 offset-md-2"> <div class="col-12 col-md-3 offset-0 offset-md-2">
@ -97,9 +97,9 @@
</div> </div>
<div class="col-12 col-lg-6 mb10"> <div class="col-12 col-lg-6 mb10">
@if(!empty($user->photo_filename2)) @if(!empty($user->photo_filename2))
<h3><img src="{{ asset('storage/photo/' . $user->photo_filename2) }}"></h3> <h3><img src="{{ asset('storage/photo/' . $user->photo_filename2) }}"></h3>
@else @else
<h3></h3> <h3></h3>
@endif @endif
</div> </div>
<div class="col-12 col-md-3 offset-0 offset-md-2"> <div class="col-12 col-md-3 offset-0 offset-md-2">
@ -114,6 +114,9 @@
<div class="col-12 col-md-5 mt10"> <div class="col-12 col-md-5 mt10">
<a class="btn btn-lg btn-block btn-outline-success" href="{{ url('/user/withdraw') }}">退会する</a> <a class="btn btn-lg btn-block btn-outline-success" href="{{ url('/user/withdraw') }}">退会する</a>
</div> </div>
<div class="col-12 col-md-4 offset-0 offset-md-4 mt50 mb50">
<a class="btn btn-lg btn-block btn-success" href="{{ url('/user/tag_reissue') }}">タグの再発行を行う</a>
</div>
</form> </form>
</section> </section>
</main> </main>

View File

@ -0,0 +1,83 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">ユーザー情報確認 > タグ再発行申請</h4>
</header>
<section id="" class="container mt30 mb50">
<div class="alert alert-success text-center pt20 pb10 mb30">
<h5>タグ再発行を行うお客様の情報をご確認ください。</h5>
<p>住所、電話番号、メールアドレス等に変更がある場合、再発行を申請する前にユーザー情報確認から<br class="pc">お客様の情報を最新状態へ更新をお願いいたします。</p>
</div>
<div class="row">
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_name">お名前</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_name }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_phonetic">フリガナ</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_phonetic }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_gender">性別</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_gender ?? '未入力' }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_regident">居住所</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_regident_zip }}{{ $user->user_regident_pre }}{{ $user->user_regident_city }}{{ $user->user_regident_add }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_homephone">自宅電話番号</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_homephone ?? '未入力' }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_mobile">携帯電話番号</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_mobile ?? '未入力' }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_primemail">メールアドレス</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_primemail }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_submail">予備メールアドレス</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3>{{ $user->user_submail ?? '未入力' }}</h3>
</div>
<div class="col-12 col-md-3 offset-0 offset-md-1">
<label for="user_pass">パスワード</label>
</div>
<div class="col-12 col-lg-6 mb10">
<h3></h3>
</div>
<div class="col-12 col-md-5 offset-0 offset-md-1 mt10">
<a href="{{ url('/user/edit') }}" class="btn btn-lg btn-block btn-success">ユーザー情報を変更する</a>
</div>
<div class="col-12 col-md-5 mt10">
<a href="{{ url('/user/tag_reissue/complete') }}" class="btn btn-lg btn-block btn-outline-success">再発行申請する</a>
</div>
<div class="col-12 col-md-6 offset-0 offset-md-3 mt50 mb50">
<a href="{{ url('/mypage') }}" class="btn btn-lg btn-block btn-outline-success">マイページへ戻る</a>
</div>
</div>
</section>
</main>
@endsection

View File

@ -0,0 +1,17 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">ユーザー情報確認 > タグ再発行申請完了</h4>
</header>
<div class="row">
<div class="col-12 col-md-8 offset-0 offset-md-2 mt-4 mb30">
<h3 class="text-center">タグの再発行申請が完了しました。</h3>
<p class="mt30 text-center">現在オペレーターが確認中です。<br>タグの再発行までいましばらくお待ちください。</p>
<div class="col-12 col-md-6 offset-0 offset-md-3 mt50 mb50">
<a href="{{ url('/mypage') }}" class="btn btn-lg btn-block btn-outline-success">マイページへ戻る</a>
</div>
</div>
</div>
</main>
@endsection

View File

@ -0,0 +1,37 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">お知らせ > 過去のお知らせ</h4>
</header>
<section id="" class="container mt30 mb50">
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<h3 class="text-center alert-success">過去のお知らせ</h3>
</div>
<div class="row">
@forelse($informations as $information)
<div class="col-12 col-md-3 offset-0 offset-md-2">
<h5 class="text-success">
{{ \Carbon\Carbon::parse($information->entry_date)->format('Y年n月j日') }}
</h5>
</div>
<div class="col-12 col-lg-7 mb10">
<p class="h5 font-weight-normal">
{{ $information->user_information_history }}
</p>
</div>
@empty
<div class="col-12 text-center py-5">
<p>過去のお知らせはありません。</p>
</div>
@endforelse
</div>
<div class="d-flex justify-content-center mt-4">
{{ $informations->links('partials.paging') }}
</div>
<div class="col-12 col-md-6 offset-0 offset-md-3 mt-4 mb50">
<a href="{{ url('mypage') }}" class="btn btn-lg btn-block btn-outline-success">マイページへ戻る</a>
</div>
</section>
</main>
@endsection

View File

@ -0,0 +1,38 @@
@extends('layouts.app')
@section('content')
<main>
<header class="alert alert-success">
<h4 class="container">お知らせ > お知らせ一覧</h4>
</header>
<section id="" class="container mt30 mb50">
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30">
<h3 class="text-center alert-success">お知らせ一覧</h3>
</div>
<div class="row">
@forelse($informations as $information)
<div class="col-12 col-md-3 offset-0 offset-md-2">
<h5 class="text-success">
{{ \Carbon\Carbon::parse($information->entry_date)->format('Y年n月j日') }}
</h5>
</div>
<div class="col-12 col-lg-7 mb10">
<p class="h5 font-weight-normal">
{{ $information->user_information_history }}
</p>
</div>
@empty
<div class="col-12 text-center py-5">
<p>お知らせはありません。</p>
</div>
@endforelse
<div class="col-12 col-md-5 offset-md-1 mt10">
<a href="{{ url('mypage') }}" class="btn btn-lg btn-block btn-outline-success">マイページへ戻る</a>
</div>
<div class="col-12 col-md-5 mt10">
<a href="{{ url('user_information/history') }}" class="btn btn-lg btn-block btn-outline-success">過去のお知らせ</a>
</div>
</div>
</section>
</main>
@endsection

View File

@ -16,12 +16,15 @@ use App\Http\Controllers\UserInfoController;
use App\Http\Controllers\UserEditController; use App\Http\Controllers\UserEditController;
use App\Http\Controllers\UserEditConfirmController; use App\Http\Controllers\UserEditConfirmController;
use App\Http\Controllers\UserWithdrawController; use App\Http\Controllers\UserWithdrawController;
use App\Http\Controllers\UserTagReissueController;
use App\Http\Controllers\RegularContractController; use App\Http\Controllers\RegularContractController;
use App\Http\Controllers\RegularContractCreateController; use App\Http\Controllers\RegularContractCreateController;
use App\Http\Controllers\ParkingSearchController; use App\Http\Controllers\ParkingSearchController;
use App\Http\Controllers\ParkWaitlistController; use App\Http\Controllers\ParkWaitlistController;
use App\Http\Controllers\ReceiptController; use App\Http\Controllers\ReceiptController;
use App\Http\Controllers\SealReissueController;
use App\Http\Controllers\ParkDetailController; use App\Http\Controllers\ParkDetailController;
use App\Http\Controllers\UserInformationController;
// 画面遷移のみ // 画面遷移のみ
Route::get('/', function () { return view('general.swo1_1'); })->name('swo1_1'); Route::get('/', function () { return view('general.swo1_1'); })->name('swo1_1');
@ -51,6 +54,7 @@ Route::get('/error', function () { return view('general.error'); })->name('error
// コントローラー経由 // コントローラー経由
Route::post('/swo2_2', [MemberRegistrationController::class, 'sendMail'])->name('swo2_2'); Route::post('/swo2_2', [MemberRegistrationController::class, 'sendMail'])->name('swo2_2');
Route::get('/swo2_3', [MemberRegistrationController::class, 'index'])->name('swo2_3')->middleware('signed'); Route::get('/swo2_3', [MemberRegistrationController::class, 'index'])->name('swo2_3')->middleware('signed');
Route::get('/swo2_3B', [MemberRegistrationController::class, 'indexBack'])->name('swo2_3B');
Route::post('/swo2_4', [MemberRegistrationController::class, 'confirm'])->name('swo2_4'); Route::post('/swo2_4', [MemberRegistrationController::class, 'confirm'])->name('swo2_4');
Route::post('/swo2_5', [MemberRegistrationController::class, 'complete'])->name('swo2_5'); Route::post('/swo2_5', [MemberRegistrationController::class, 'complete'])->name('swo2_5');
Route::get('/swo4_1', [LoginController::class, 'login'])->name('swo4_1'); Route::get('/swo4_1', [LoginController::class, 'login'])->name('swo4_1');
@ -88,6 +92,10 @@ Route::get('/user/edit/verify', [UserEditConfirmController::class, 'verify'])->n
Route::get('/user/withdraw', [UserWithdrawController::class, 'showConfirm'])->name('user.withdraw'); Route::get('/user/withdraw', [UserWithdrawController::class, 'showConfirm'])->name('user.withdraw');
Route::post('/user/withdraw/confirm', [UserWithdrawController::class, 'withdraw'])->name('user.withdraw.confirm'); Route::post('/user/withdraw/confirm', [UserWithdrawController::class, 'withdraw'])->name('user.withdraw.confirm');
// タグ再発行
Route::get('/user/tag_reissue', [UserTagReissueController::class, 'index'])->name('user.tag_reissue');
Route::get('/user/tag_reissue/complete', [UserTagReissueController::class, 'complete'])->name('user.tag_reissue.complete');
// 定期契約情報確認 // 定期契約情報確認
Route::get('regular_contract/info', [RegularContractController::class, 'showInfo'])->name('regular_contract.info'); Route::get('regular_contract/info', [RegularContractController::class, 'showInfo'])->name('regular_contract.info');
@ -96,6 +104,11 @@ Route::get('receipt/input/{contract_id}', [ReceiptController::class, 'input'])->
Route::get('receipt/download/{contract_id}', [ReceiptController::class, 'download'])->name('receipt.download'); Route::get('receipt/download/{contract_id}', [ReceiptController::class, 'download'])->name('receipt.download');
Route::post('receipt/issue/{contract_id}', [ReceiptController::class, 'issue']); Route::post('receipt/issue/{contract_id}', [ReceiptController::class, 'issue']);
// シール再発行
Route::get('/seal/reissue/{contract_id}', [SealReissueController::class, 'index'])->name('seal.reissue');
Route::get('/seal/reissue/reason/{contract_id}', [SealReissueController::class, 'reason'])->name('seal.reissue.reason');
Route::post('/seal/reissue/complete/{contract_id}', [SealReissueController::class, 'complete'])->name('seal.reissue.complete');
// 新規定期契約 // 新規定期契約
Route::get('regular_contract/create', [RegularContractCreateController::class, 'show'])->name('regular_contract.create'); Route::get('regular_contract/create', [RegularContractCreateController::class, 'show'])->name('regular_contract.create');
Route::get('/api/park-detail/{park_id}', [ParkDetailController::class, 'show']); Route::get('/api/park-detail/{park_id}', [ParkDetailController::class, 'show']);
@ -133,6 +146,10 @@ Route::get('park_search', [RegularContractCreateController::class, 'show'])->nam
// 空き待ち状況確認 // 空き待ち状況確認
Route::get('park_waitlist', [ParkWaitlistController::class, 'index'])->name('park_waitlist.index'); Route::get('park_waitlist', [ParkWaitlistController::class, 'index'])->name('park_waitlist.index');
// 会員へのお知らせ
Route::get('/user_information', [UserInformationController::class, 'index'])->name('user_information.index');
Route::get('/user_information/history', [UserInformationController::class, 'history'])->name('user_information.history');
// ウェルネット決済画面(仮) // ウェルネット決済画面(仮)
Route::get('/wellnet/payment', function (): mixed { Route::get('/wellnet/payment', function (): mixed {
$html = <<<HTML $html = <<<HTML