so-manager-dev.com/app/Http/Controllers/RegularContractController.php

457 lines
20 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Carbon\Carbon;
class RegularContractController extends Controller
{
public function showInfo(Request $request)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
$today = date('Y-m-d');
// 定期契約情報を取得park/usertype/psection/ptypeテーブルもJOIN
$contracts = DB::table('regular_contract')
->join('park', 'regular_contract.park_id', '=', 'park.park_id')
->join('usertype', 'regular_contract.user_categoryid', '=', 'usertype.user_categoryid')
->leftJoin('city', 'park.city_id', '=', 'city.city_id')
->leftJoin('psection', 'regular_contract.psection_id', '=', 'psection.psection_id')
->leftJoin('ptype', 'regular_contract.ptype_id', '=', 'ptype.ptype_id')
->where('regular_contract.user_id', $user_id)
->where('regular_contract.contract_flag', 1)
->where('regular_contract.contract_cancel_flag', 0)
->where(function ($query) use ($today) {
$query->where('regular_contract.contract_periode', '>', $today)
->orWhere(function ($q) use ($today) {
$q->where('regular_contract.contract_periode', '<=', $today)
->whereRaw('DATEDIFF(?, regular_contract.contract_periode) <= 5', [$today]);
});
})
->select(
'regular_contract.contract_id',
'park.park_name',
'usertype.usertype_subject1',
'regular_contract.contract_periods',
'regular_contract.contract_periode',
'regular_contract.enable_months',
'regular_contract.contract_renewal',
'regular_contract.park_id',
'city.update_grace_period_start_date',
'city.update_grace_period_start_time',
'city.update_grace_period_end_date',
'city.update_grace_period_end_time',
'psection.psection_subject',
'ptype.ptype_subject',
'regular_contract.pplace_no'
)
->get();
if ($request->route()->getName() === 'regular_contract.info') {
// 契約情報表示画面の処理
\Log::info('契約情報表示画面にアクセス', [
'user_id' => $user_id,
]);
$view = 'regular_contract.info';
$active_menu = 'SWC-3-1';
} else {
// 契約更新画面の処理
\Log::info('契約更新画面にアクセス', [
'user_id' => $user_id,
]);
$view = 'regular_contract.update';
$active_menu = 'SWC-4-1';
}
return view($view, [
'active_menu' => $active_menu, // マイページメニューの選択状態用
'user_name' => $user_name, // ユーザー名(ヘッダー用)
'contracts' => $contracts,
]);
}
public function update($contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
// 元契約データ取得
$old_contract = DB::table('regular_contract')->where('contract_id', $contract_id)->first();
// 新規レコード作成(必要な項目を元契約データから引き継ぐ)
$new_contract_id = DB::table('regular_contract')->insertGetId([
'old_contract_id' => $old_contract->contract_id,
'user_id' => $old_contract->user_id,
'user_categoryid' => $old_contract->user_categoryid,
'created_at' => now(),
'updated_at' => now(),
'park_id' => $old_contract->park_id,
'price_parkplaceid' => $old_contract->price_parkplaceid,
'user_securitynum' => $old_contract->user_securitynum,
'contract_created_at' => now(),
'contract_reduction' => $old_contract->contract_reduction,
'update_flag' => 1,
'contract_cancel_flag' => 0,
'800m_flag' => 0,
'psection_id' => $old_contract->psection_id,
'ptype_id' => $old_contract->ptype_id,
'zone_id' => $old_contract->zone_id,
'pplace_no' => $old_contract->pplace_no
]);
// contract_qr_id生成AES-256-CBC暗号化
$key = "LJLASR4FAS34SAADFA72ASDFALLSDRGT";
$iv = substr(hash('sha256', $key), 0, 16); // IVは16バイト
$encrypted = openssl_encrypt($new_contract_id, 'AES-256-CBC', $key, 0, $iv);
// contract_qr_idを更新
DB::table('regular_contract')->where('contract_id', $new_contract_id)->update([
'contract_qr_id' => $encrypted
]);
// 完了後の遷移
return redirect()->route('regular_contract.confirm_category', ['contract_id' => $new_contract_id]);
}
public function confirmCategory($contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user = DB::table('user')->where('user_id', $user_id)->first();
// regular_contractとparkをJOINしてsecurityreg_display_flagを取得
$contract = DB::table('regular_contract')
->join('park', 'regular_contract.park_id', '=', 'park.park_id')
->where('regular_contract.contract_id', $contract_id)
->select('regular_contract.*', 'park.securityreg_display_flag')
->first();
return view('regular_contract.confirm_category', [
'active_menu' => 'SWC-4-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
'user' => $user,
'contract' => $contract
]);
}
/**
* 契約区分確認画面の「確認して進む」ボタン押下時の分岐処理
* 本人確認書類アップロード画面 or 利用期間選択画面へ遷移
*/
public function confirmCategoryNext($contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
// 契約情報取得
$contract = DB::table('regular_contract')->where('contract_id', $contract_id)->first();
if (!$contract) {
return redirect()->back()->with('error', '契約情報が見つかりません');
}
// ユーザー情報取得
$user = DB::table('user')->where('user_id', $user_id)->first();
// ユーザー区分取得
$usertype = DB::table('usertype')->where('user_categoryid', $user->user_categoryid)->first();
// 駐輪場情報取得
$park = DB::table('park')->where('park_id', $contract->park_id)->first();
// 減免確認種別取得
$reduction_confirm = DB::table('reduction_confirm')
->where('park_id', $contract->park_id)
->where('user_categoryid', $contract->user_categoryid)
->first();
// 分岐条件
$reduction_confirm_type = isset($reduction_confirm) ? $reduction_confirm->reduction_confirm_type : 0;
$student_id_confirm_type = isset($park) ? $park->student_id_confirm_type : 0;
// $overyear_flag = isset($park) ? $park->overyear_flag : 0;
// 契約期間に4/1が含まれるか判定
// $contract_start = new \DateTime($contract->contract_periods);
// $contract_end = new \DateTime($contract->contract_periode);
// 4/1の年は契約開始年
// $april_first = new \DateTime($contract_start->format('Y') . '-04-01');
// 契約終了日が4/1より前なら翌年の4/1も考慮
/**if ($contract_end < $april_first) {
$april_first->modify('+1 year');
}
$includes_april_first = ($contract_start <= $april_first && $contract_end >= $april_first);*/
// ユーザー区分が「学生」の場合のみ卒業年月日判定
/**$exceeds_graduation = false;
if (isset($usertype) && $usertype->usertype_subject1 === '学生') {
$graduation_date = isset($user) ? $user->user_graduate : null;
if ($graduation_date) {
$graduation_dt = new \DateTime($graduation_date);
$exceeds_graduation = ($contract_end > $graduation_dt);
}
}*/
// 本人確認書類アップロード画面へ遷移する条件
// 1. reduction_confirm_typeが1年1回または2毎更新時
// 2. student_id_confirm_typeが1年1回または2毎更新時
// 3. 年度跨ぎoveryear_flag=1以外かつ契約期間に4/1が含まれる場合
$need_identity = false;
// 減免確認種別reduction_confirm_type=1は年度跨ぎのみ、2は無条件で本人確認
/**if ($reduction_confirm_type == 1 && $includes_april_first) {
$need_identity = true;
}*/
/**if ($reduction_confirm_type == 2) {*/
if (in_array($reduction_confirm_type, [1, 2])) {
$need_identity = true;
}
// 学生証確認種別:学生の場合かつ減免でない場合のみ判定
if (isset($usertype) && $usertype->usertype_subject1 === '学生' && in_array($student_id_confirm_type, [1, 2]) && $contract->contract_reduction == 0) {
$need_identity = true;
}
// 年度跨ぎ判定
/**if ($overyear_flag != 1 && $includes_april_first) {
$need_identity = true;
}*/
// 卒業年月日超過判定
/**if ($exceeds_graduation) {
$need_identity = true;
}*/
if ($need_identity) {
// 本人確認書類アップロード画面へ
return redirect()->route('regular_contract.upload_identity', ['contract_id' => $contract_id]);
} else {
// 利用期間選択画面へ
return redirect()->route('regular_contract.select_period', ['contract_id' => $contract_id]);
}
}
public function uploadIdentity($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.upload_identity', [
'active_menu' => 'SWC-4-1', // マイページメニューの選択状態用
'user_name' => $user_name, // ユーザー名(ヘッダー用)
'contract_id' => $contract_id,
]);
}
public function uploadIdentitySubmit(Request $request, $contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
// バリデーション
$rules = [
'user_idcard' => 'required|file|mimes:jpeg,png,jpg,gif,webp',
'user_idcard2' => 'nullable|file|mimes:jpeg,png,jpg,gif,webp',
];
$messages = [
'user_idcard.required' => '本人確認書類をアップロードしてください。',
'user_idcard.file' => '本人確認書類(おもて)はファイルで指定してください。',
'user_idcard.mimes' => '本人確認書類(おもて)は画像ファイルで指定してください。',
'user_idcard2.file' => '本人確認書類(ウラ)はファイルで指定してください。',
'user_idcard2.mimes' => '本人確認書類(ウラ)は画像ファイルで指定してください。',
];
$validator = \Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return redirect()->route('regular_contract.upload_identity', ['contract_id' => $contract_id])
->withErrors($validator)
->withInput();
}
// おもて画像保存
$front = $request->file('user_idcard');
$filename_front = uniqid('photo1_') . '.' . $front->getClientOriginalExtension();
$front->storeAs('photo', $filename_front, 'public');
// userテーブルに保存 本人確認書類チェック済フラグや更新日時も更新項目に追加
$updateData = [
'photo_filename1' => $filename_front,
'user_idcard_chk_flag' => 1,
'user_chk_day' => null,
'user_chk_opeid' => null,
'updated_at' => now(),
];
// ウラ画像がある場合保存し更新項目に追加
if ($request->hasFile('user_idcard2')) {
$back = $request->file('user_idcard2');
$filename_back = uniqid('photo2_') . '.' . $back->getClientOriginalExtension();
$back->storeAs('photo', $filename_back, 'public');
$updateData['photo_filename2'] = $filename_back;
}
DB::table('user')->where('user_id', $user_id)->update($updateData);
// 更新対象の旧契約を検索
$old_contract_id = DB::table('regular_contract')->where('contract_id', $contract_id)->value('old_contract_id');
// 旧契約を契約更新済に更新
DB::table('regular_contract')->where('contract_id', $old_contract_id)->update(['contract_renewal' => 0]);
// 利用者マスタから学校とユーザー名、定期契約マスタから駐輪場IDを取得
$user = DB::table('user')->where('user_id', $user_id)->first();
$park_id = DB::table('regular_contract')->where('contract_id', $contract_id)->value('park_id');
// que_classの分岐
$que_class = is_null($user->user_school) ? 1 : 2;
// オペレーターキュー発行
DB::table('operator_que')->insert([
'que_class' => $que_class,
'user_id' => $user_id,
'contract_id' => $contract_id,
'park_id' => $park_id,
'que_status' => 1,
'que_status_comment' => '本人確認手動処理を行ってください',
'created_at' => now(),
]);
\Log::info('本人確認書類確認中画面にアクセス', [
'user_id' => $user_id,
]);
// 本人確認書類確認中画面へ遷移
return view('regular_contract.identity_checking', [
'active_menu' => 'SWC-4-1', // マイページメニューの選択状態用
'user_name' => $user->user_name // ユーザー名(ヘッダー用)
]);
}
public function selectPeriod($contract_id)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
// 必要な各マスタ情報を取得
$user = DB::table('user')->where('user_id', $user_id)->first();
$contract = DB::table('regular_contract')->where('contract_id', $contract_id)->first();
// $city_id = DB::table('park')->where('park_id', $contract->park_id)->value('city_id');
//$city_name = DB::table('city')->where('city_id', $city_id)->value('city_name');
$park = DB::table('park')->where('park_id', $contract->park_id)->first();
$city = DB::table('city')->where('city_id', $park->city_id)->first();
$regular_type = DB::table('regular_type')->where('city_id', $city->city_id)->first();
$usertype = DB::table('usertype')->where('user_categoryid', $contract->user_categoryid)->first();
// 2重化しているマスタのため現在のテーブル名を取得
$master_setting = DB::table('setting')->value('web_master');
$tableName = 'price' . $master_setting;
// 利用者区分に応じた逆利用フラグを取得
$inverse_use_flag_column = ($usertype->usertype_subject1 == '一般') ? 'inverse_use_flag1' : 'inverse_use_flag2';
$inverse_use_flag = $park->$inverse_use_flag_column;
if ($inverse_use_flag == 0) {
// regident_cityまたはrelate_cityが一致するか
$is_same = (
strpos($user->user_regident_city, $city->city_name) !== false ||
strpos($user->user_relate_city, $city->city_name) !== false
);
} else {
// regident_cityのみ一致するか
$is_same = (strpos($user->user_regident_city, $city->city_name) !== false);
}
$target_subject2 = $is_same ? '区民' : '区民外';
$user_categoryid = DB::table('usertype')
->where('usertype_subject1', $usertype->usertype_subject1)
->where('usertype_subject2', $target_subject2)
->where('usertype_subject3', $usertype->usertype_subject3)
->value('user_categoryid');
// 駐輪場所マスタから料金を取得
$prices = DB::table($tableName)
->where('park_id', $contract->park_id)
->where('psection_id', $contract->psection_id)
->where('ptype_id', $contract->ptype_id)
->where('user_categoryid', $user_categoryid)
->get();
\Log::info('契約区分取得', [
'user_categoryid' => $user_categoryid,
'target_subject2' => $target_subject2,
'park_id' => $contract->park_id,
'psection_id' => $contract->psection_id,
'ptype_id' => $contract->ptype_id,
'prices' => $prices->toArray(),
]);
\Log::info('利用期間選択画面にアクセス', [
'user_id' => $user_id,
]);
// 利用期間選択画面へ遷移
return view('regular_contract.select_period', [
'active_menu' => 'SWC-4-1', // マイページメニューの選択状態用
'user_name' => $user->user_name, // ユーザー名(ヘッダー用)
'contract_id' => $contract_id,
'regular_type' => $regular_type,
'prices' => $prices,
]);
}
public function updatePeriod(Request $request)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
// 期間選択チェック
$request->validate([
'month' => 'required',
], [
'month.required' => '契約期間が選択されていません。',
]);
$contract_id = $request->input('contract_id');
$month = $request->input('month');
$price = $request->input('price_' . $month);
\Log::info('契約期間更新処理', [
'month' => $month,
'price' => $price,
]);
$today = now();
$day = $today->day;
if ($day <= 19) {
// 今月の1日
$contract_periods = $today->copy()->startOfMonth()->format('Y-m-d');
} else {
// 翌月の1日
$contract_periods = $today->copy()->addMonth()->startOfMonth()->format('Y-m-d');
}
$contract_periode = Carbon::parse($contract_periods)->addMonths($month - 1)->endOfMonth()->format('Y-m-d');
// 契約更新
DB::table('regular_contract')->where('contract_id', $contract_id)->update([
'enable_months' => $month,
'billing_amount' => $price,
'contract_periods' => $contract_periods,
'contract_periode' => $contract_periode,
'updated_at' => now(),
]);
// 完了後はウェルネット決済画面(仮)へリダイレクト
return redirect()->route('wellnet.payment');
}
}