Compare commits

...

4 Commits

Author SHA1 Message Date
aa6c6058ae Merge pull request '退会、契約情報確認修正' (#7) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 21s
Reviewed-on: #7
2025-09-03 15:56:04 +09:00
0852db93ca 契約情報確認修正 - 表示分岐条件を修正
All checks were successful
Deploy preview (main_higashide) / deploy (push) Successful in 11s
2025-09-03 15:52:59 +09:00
f48b3775d6 退会画面修正
All checks were successful
Deploy preview (main_higashide) / deploy (push) Successful in 13s
2025-09-03 13:08:19 +09:00
c7a6c39e3f 退会画面修正 - ログ出力追加、コメント追加
All checks were successful
Deploy preview (main_higashide) / deploy (push) Successful in 14s
2025-09-03 13:06:54 +09:00
5 changed files with 253 additions and 171 deletions

View File

@ -19,6 +19,10 @@ class ReceiptController extends Controller
}
$user = DB::table('user')->where('user_id', $user_id)->first();
\Log::info('領収書宛名入力画面にアクセス', [
'user_id' => $user_id,
]);
return view('receipt.input', [
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
'contract_id' => $contract_id
@ -43,6 +47,21 @@ class ReceiptController extends Controller
return redirect()->back()->withInput()->withErrors(['contract_id' => 'この契約の領収書は既に発行されています。契約履歴から再発行を行ってください。']);
}
// 4バイト文字絵文字等チェック
if (preg_match('/[\xF0-\xF7][\x80-\xBF]{3}/', $receipt_name)) {
return redirect()->back()->withInput()->withErrors(['contract_id' => '宛名に絵文字などの特殊文字は使用できません。']);
}
// 文字数チェック
if (mb_strlen($receipt_name) > 30) {
return redirect()->back()->withInput()->withErrors(['contract_id' => '宛名は30文字以内で入力してください。']);
}
// 敬称選択チェック
if (empty($keisho)) {
return redirect()->back()->withInput()->withErrors(['contract_id' => '敬称を選択してください。']);
}
// inv_publishテーブルに新規登録insert
$inv_name = $receipt_name . $keisho;
$now = date('Y-m-d H:i:s');
@ -65,8 +84,6 @@ class ReceiptController extends Controller
return $this->download($contract_id, $is_reissue);
}
public function download($contract_id, $is_reissue = true)
{
// 必要なデータを取得
@ -106,7 +123,6 @@ class ReceiptController extends Controller
'default_font' => 'noto_sans_jp',
]);
$mpdf->WriteHTML($html);
// PDFダウンロード

View File

@ -52,6 +52,11 @@ class RegularContractController extends Controller
)
->get();
\Log::info('契約情報表示画面にアクセス', [
'user_id' => $user_id,
]);
return view('regular_contract.info', [
'active_menu' => 'SWC-3-1', // マイページメニューの選択状態用
'user_name' => $user_name, // ユーザー名(ヘッダー用)
@ -126,7 +131,6 @@ class RegularContractController extends Controller
]);
}
/**
* 契約区分確認画面の「確認して進む」ボタン押下時の分岐処理
* 本人確認書類アップロード画面 or 利用期間選択画面へ遷移

View File

@ -42,8 +42,6 @@ class UserEditConfirmController extends Controller
]);
}
// 入力内容確認画面から「変更を確定する」ボタン押下時
public function submit(Request $request)
{
@ -59,6 +57,7 @@ class UserEditConfirmController extends Controller
$token = Str::random(64);
$changeData = $request->except(['_token']);
$changeData['user_id'] = $user_id;
$changeData['user_seq'] = $user->user_seq;
// 本人確認書類画像アップロード処理
if ($request->hasFile('photo_filename1') && $request->file('photo_filename1')->isValid()) {
@ -134,7 +133,7 @@ class UserEditConfirmController extends Controller
$updateData['photo_filename2'] = $changeData['photo_filename2'];
}
if (!empty($changeData['user_pass'])) {
$updateData['user_pass'] = self::customPasswordHash($changeData['user_pass'], $changeData['user_id']);
$updateData['user_pass'] = self::customPasswordHash($changeData['user_pass'], $changeData['user_seq']);
}
DB::table('user')
->where('user_id', $changeData['user_id'])
@ -160,9 +159,9 @@ class UserEditConfirmController extends Controller
/**
* パスワードをSHA256→SALT連結→25回ストレッチでハッシュ化
*/
private static function customPasswordHash($password, $user_id)
private static function customPasswordHash($password, $user_seq)
{
$salt = $user_id . 'SOMSALT';
$salt = $user_seq . 'SOMSALT';
$hash = hash('sha256', $password);
$hash .= $salt;
for ($i = 0; $i < 25; $i++) {

View File

@ -20,10 +20,14 @@ class UserWithdrawController extends Controller
}
$user_name = DB::table('user')->where('user_id', $user_id)->value('user_name');
\Log::info('退会確認画面にアクセス', [
'user_id' => $user_id,
]);
return view('user.withdraw_confirm')
->with([
'active_menu' => 'SWC-1-1',
'user_name' => $user_name ?: '',
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user_name ?: '', // ユーザー名(ヘッダー用)
]);
}
@ -38,6 +42,8 @@ class UserWithdrawController extends Controller
$user = DB::table('user')->where('user_id', $user_id)->first();
$now = now();
// 利用者マスタの退会フラグを立てる
DB::table('user')
->where('user_id', $user_id)
->update([
@ -46,7 +52,7 @@ class UserWithdrawController extends Controller
'updated_at' => $now,
]);
// 定期空き予約マスタ(reserve)の該当ユーザーのupdated_atを退会日時で更新
// 定期空き予約マスタ(reserve)の予約を無効に更新
DB::table('reserve')
->where('user_id', $user_id)
->update([
@ -76,18 +82,24 @@ class UserWithdrawController extends Controller
if (!$contract) {
// 契約なし→退会完了画面
\Log::info('退会完了画面にアクセス', [
'user_id' => $user_id,
]);
session()->forget('user_id');
return view('user.withdraw_complete')->with([
'active_menu' => 'SWC-1-1', // この画面のID
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
// 有効性判定
if ($contract->contract_cancel_flag == 1 || $contract->contract_cancel_flag == 2) {
\Log::info('退会完了画面にアクセス', [
'user_id' => $user_id,
]);
session()->forget('user_id');
return view('user.withdraw_complete')->with([
'active_menu' => 'SWC-1-1', // この画面のID
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
@ -100,9 +112,12 @@ class UserWithdrawController extends Controller
// 今月までなら退会完了
if ($contract_year == $today_year && $contract_month == $today_month) {
\Log::info('退会完了画面にアクセス', [
'user_id' => $user_id,
]);
session()->forget('user_id');
return view('user.withdraw_complete')->with([
'active_menu' => 'SWC-1-1', // この画面のID
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
@ -122,18 +137,23 @@ class UserWithdrawController extends Controller
'updated_at' => $now,
'operator_id' => null,
]);
\Log::info('退会完了画面にアクセス', [
'user_id' => $user_id,
]);
session()->forget('user_id');
return view('user.withdraw_complete')->with([
'active_menu' => 'SWC-1-1', // この画面のID
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
// どのifにも該当しない場合は退会完了画面にエラーメッセージを表示
\Log::info('退会完了画面にアクセス(エラーにつき退会失敗表示)', [
'user_id' => $user_id,
]);
return view('user.withdraw_confirm')->with([
'active_menu' => 'SWC-1-1',
'user_name' => $user ? $user->user_name : '',
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
'error_message' => '退会処理に失敗しました。申し訳ございませんが、So-Managerコールセンター03-5856-4720にご連絡をお願いいたします。',
]);
}
}

View File

@ -39,13 +39,13 @@ return null;
$btn_text = '更新する';
$btn_active = true;
// 契約終了月以外は「ご契約中」
if ($periode_month && $periode_year && ($now->month != $periode_month || $now->year != $periode_year)) {
// 契約終了月より前は「ご契約中」
if ($now->lt($contract_end_dt)) {
$bg = 'bg-white';
$btn_text = 'ご契約中';
$btn_active = false;
} else {
// 猶予期間のCarbon生成
// 契約終了月より後は猶予期間判定
if (is_numeric($start_dd) && is_numeric($end_dd)) {
// 開始日
$start_date = $contract_end_dt->format('Y-m-') . str_pad($start_dd, 2, '0', STR_PAD_LEFT);
@ -53,12 +53,10 @@ return null;
$start_dt = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $start_date . ' ' . $start_time . ':00');
// 終了日
if ($start_dd < $end_dd) {
// 終了月も契約終了月
$end_date=$contract_end_dt->format('Y-m-') . str_pad($end_dd, 2, '0', STR_PAD_LEFT);
$end_time = ($end_hm && preg_match('/^\d{2}:\d{2}$/', $end_hm)) ? $end_hm : '23:59';
$end_dt = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $end_date . ' ' . $end_time . ':00');
} else {
// 終了日は契約終了月の翌月
$next_month_dt = $contract_end_dt->copy()->addMonth();
$end_date = $next_month_dt->format('Y-m-') . str_pad($end_dd, 2, '0', STR_PAD_LEFT);
$end_time = ($end_hm && preg_match('/^\d{2}:\d{2}$/', $end_hm)) ? $end_hm : '23:59';
@ -68,25 +66,18 @@ return null;
$start_dt = null;
$end_dt = null;
}
// 以降は既存のボタン・背景色判定ロジック
if ($update_flag===0) {
$bg='bg-white';
$btn_text='手続き中';
$btn_active=false;
}
elseif ($update_flag===1) {
$bg='bg-white';
$btn_text='更新済';
$btn_active=false;
}
elseif (!is_null($end_dt) && $end_dt->gt($start_dt)) {
if ($start_dt && $now->lt($start_dt)) {
// 猶予期間判定
if ($update_flag === 0) {
$bg = 'bg-white';
$btn_text = 'ご契約中';
$btn_text = '手続き中';
$btn_active = false;
} else {
// 契約終了日を過ぎていて、更新可能期間内は赤背景
if ($contract_end_dt && $now->gt($contract_end_dt) && $start_dt && $end_dt && $now->between($start_dt, $end_dt)) {
} elseif ($update_flag === 1) {
$bg = 'bg-white';
$btn_text = '更新済';
$btn_active = false;
} elseif ($start_dt && $end_dt && $now->between($start_dt, $end_dt)) {
// 猶予期間内
if ($contract_end_dt && $now->gt($contract_end_dt)) {
$bg = 'alert-danger';
$btn_text = '更新する';
$btn_active = true;
@ -95,155 +86,207 @@ return null;
$btn_text = '更新する';
$btn_active = true;
}
}
}
elseif ($start_dt && $start_dt->gt($end_dt)) {
if ($now->lt($start_dt)) {
} else {
$bg = 'bg-white';
$btn_text = 'ご契約中';
$btn_active = false;
} elseif ($now->gte($start_dt) && $now->lte($contract_end_dt->copy()->endOfMonth())) {
$bg = 'alert-warning';
$btn_text = '更新する';
$btn_active = true;
} else {
$bg = 'alert-danger';
$btn_text = '更新する';
$btn_active = true;
}
}
}
@endphp
@endphp
@if($bg == 'bg-white')
<div class="card border-success">
@elseif($bg == 'alert-warning')
<div class="card alert-warning">
@elseif($bg == 'alert-danger')
<div class="card alert-danger">
@else
<div class="card">
@endif
<style>
.table.text-center {
border-radius: 0.25rem !important;
border-collapse: separate !important;
overflow: hidden;
}
// 契約終了月の場合(既存ロジック)
if (is_numeric($start_dd) && is_numeric($end_dd)) {
// 開始日
$start_date = $contract_end_dt->format('Y-m-') . str_pad($start_dd, 2, '0', STR_PAD_LEFT);
$start_time = ($start_hm && preg_match('/^\d{2}:\d{2}$/', $start_hm)) ? $start_hm : '00:00';
$start_dt = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $start_date . ' ' . $start_time . ':00');
// 終了日
if ($start_dd < $end_dd) {
$end_date=$contract_end_dt->format('Y-m-') . str_pad($end_dd, 2, '0', STR_PAD_LEFT);
$end_time = ($end_hm && preg_match('/^\d{2}:\d{2}$/', $end_hm)) ? $end_hm : '23:59';
$end_dt = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $end_date . ' ' . $end_time . ':00');
} else {
$next_month_dt = $contract_end_dt->copy()->addMonth();
$end_date = $next_month_dt->format('Y-m-') . str_pad($end_dd, 2, '0', STR_PAD_LEFT);
$end_time = ($end_hm && preg_match('/^\d{2}:\d{2}$/', $end_hm)) ? $end_hm : '23:59';
$end_dt = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $end_date . ' ' . $end_time . ':00');
}
} else {
$start_dt = null;
$end_dt = null;
}
// 以降は既存のボタン・背景色判定ロジック
if ($update_flag===0) {
$bg='bg-white';
$btn_text='手続き中';
$btn_active=false;
}
elseif ($update_flag===1) {
$bg='bg-white';
$btn_text='更新済';
$btn_active=false;
}
elseif (!is_null($end_dt) && $end_dt->gt($start_dt)) {
if ($start_dt && $now->lt($start_dt)) {
$bg = 'bg-white';
$btn_text = 'ご契約中';
$btn_active = false;
} else {
// 契約終了日を過ぎていて、更新可能期間内は赤背景
if ($contract_end_dt && $now->gt($contract_end_dt) && $start_dt && $end_dt && $now->between($start_dt, $end_dt)) {
$bg = 'alert-danger';
$btn_text = '更新する';
$btn_active = true;
} else {
$bg = 'alert-warning';
$btn_text = '更新する';
$btn_active = true;
}
}
}
elseif ($start_dt && $start_dt->gt($end_dt)) {
if ($now->lt($start_dt)) {
$bg = 'bg-white';
$btn_text = 'ご契約中';
$btn_active = false;
} elseif ($now->gte($start_dt) && $now->lte($contract_end_dt->copy()->endOfMonth())) {
$bg = 'alert-warning';
$btn_text = '更新する';
$btn_active = true;
} else {
$bg = 'alert-danger';
$btn_text = '更新する';
$btn_active = true;
}
}
@endphp
@if($bg == 'bg-white')
<div class="card border-success">
@elseif($bg == 'alert-warning')
<div class="card alert-warning">
@elseif($bg == 'alert-danger')
<div class="card alert-danger">
@else
<div class="card">
@endif
<style>
.table.text-center {
border-radius: 0.25rem !important;
border-collapse: separate !important;
overflow: hidden;
}
.btn-outline-secondary.badge-pill.custom-rounded-btn[disabled],
.btn-outline-secondary.badge-pill.custom-rounded-btn.disabled {
pointer-events: none;
cursor: default !important;
background: #fff !important;
color: #6c757d !important;
border-color: #6c757d !important;
opacity: 1 !important;
}
.btn-outline-secondary.badge-pill.custom-rounded-btn[disabled],
.btn-outline-secondary.badge-pill.custom-rounded-btn.disabled {
pointer-events: none;
cursor: default !important;
background: #fff !important;
color: #6c757d !important;
border-color: #6c757d !important;
opacity: 1 !important;
}
.btn-outline-secondary.badge-pill.custom-rounded-btn:not([disabled]):hover,
.btn-outline-secondary.badge-pill.custom-rounded-btn:not(.disabled):hover {
color: #212529 !important;
}
.btn-outline-secondary.badge-pill.custom-rounded-btn:not([disabled]):hover,
.btn-outline-secondary.badge-pill.custom-rounded-btn:not(.disabled):hover {
color: #212529 !important;
}
.border-warning {
border: 1px solid #ffc107 !important;
}
.border-warning {
border: 1px solid #ffc107 !important;
}
.border-white {
border: 1px solid #fff !important;
}
.border-white {
border: 1px solid #fff !important;
}
.border-danger {
border: 1px solid #dc3545 !important;
}
.border-danger {
border: 1px solid #dc3545 !important;
}
.table-no-margin {
margin-bottom: 0 !important;
padding-bottom: 0 !important;
}
</style>
<table class="table text-center table-no-margin {{ $bg }}
.table-no-margin {
margin-bottom: 0 !important;
padding-bottom: 0 !important;
}
</style>
<table class="table text-center table-no-margin {{ $bg }}
@if($bg == 'alert-warning') border-warning
@elseif($bg == 'bg-white') border-white
@elseif($bg == 'alert-danger') border-danger
@endif">
<tr>
<th>定期契約ID</th>
<td>{{ $contract->contract_id }}</td>
</tr>
<tr>
<th>駐輪場名</th>
<td>{{ $contract->park_name }}</td>
</tr>
<tr>
<th>利用者区分</th>
<td>{{ $contract->usertype_subject1 }}</td>
</tr>
<tr>
<th>車種</th>
<td>{{ $contract->psection_subject ?? '' }}</td>
</tr>
<tr>
<th>階数</th>
<td>{{ $contract->ptype_subject ?? '' }}</td>
</tr>
<tr>
<th>車室番号</th>
<td>{{ $contract->pplace_no ?? '' }}</td>
</tr>
<tr>
<th>利用開始日</th>
<td>{{ \Carbon\Carbon::parse($contract->contract_periods)->format('Y/m/d') }}</td>
</tr>
<tr>
<th>契約月数</th>
<td>{{ $contract->enable_months }}ヶ月</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<div style="display: flex; flex-direction: column; align-items: center;">
<div style="display: flex; gap: 6px; margin-bottom: 12px;">
@if($bg == 'alert-warning' && $btn_active)
<a href="{{ url('regular_contract/update/' . $contract->contract_id) }}" class="btn btn-warning badge-pill custom-rounded-btn">{{ $btn_text }}</a>
@elseif($bg == 'alert-danger' && $btn_active)
<a href="{{ url('regular_contract/update/' . $contract->contract_id) }}" class="btn btn-danger badge-pill custom-rounded-btn">{{ $btn_text }}</a>
@else
<button type="button" class="btn btn-outline-secondary badge-pill custom-rounded-btn" disabled>{{ $btn_text }}</button>
@endif
<tr>
<th>定期契約ID</th>
<td>{{ $contract->contract_id }}</td>
</tr>
<tr>
<th>駐輪場名</th>
<td>{{ $contract->park_name }}</td>
</tr>
<tr>
<th>利用者区分</th>
<td>{{ $contract->usertype_subject1 }}</td>
</tr>
<tr>
<th>車種</th>
<td>{{ $contract->psection_subject ?? '' }}</td>
</tr>
<tr>
<th>階数</th>
<td>{{ $contract->ptype_subject ?? '' }}</td>
</tr>
<tr>
<th>車室番号</th>
<td>{{ $contract->pplace_no ?? '' }}</td>
</tr>
<tr>
<th>利用開始日</th>
<td>{{ \Carbon\Carbon::parse($contract->contract_periods)->format('Y/m/d') }}</td>
</tr>
<tr>
<th>契約月数</th>
<td>{{ $contract->enable_months }}ヶ月</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<div style="display: flex; flex-direction: column; align-items: center;">
<div style="display: flex; gap: 6px; margin-bottom: 12px;">
@if($bg == 'alert-warning' && $btn_active)
<a href="{{ url('regular_contract/update/' . $contract->contract_id) }}" class="btn btn-warning badge-pill custom-rounded-btn">{{ $btn_text }}</a>
@elseif($bg == 'alert-danger' && $btn_active)
<a href="{{ url('regular_contract/update/' . $contract->contract_id) }}" class="btn btn-danger badge-pill custom-rounded-btn">{{ $btn_text }}</a>
@else
<button type="button" class="btn btn-outline-secondary badge-pill custom-rounded-btn" disabled>{{ $btn_text }}</button>
@endif
@if($bg == 'alert-warning')
<button type="button" id="cancelModalBtn" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;" data-bs-toggle="modal" data-bs-target="#cancelModal">解約について</button>
@elseif($bg == 'alert-danger')
<button type="button" id="cancelModalBtn" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;" data-bs-toggle="modal" data-bs-target="#cancelModal">解約について</button>
@else
<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
</div>
@php
$has_receipt = DB::table('inv_publish')->where('contract_id', $contract->contract_id)->exists();
@endphp
@if($has_receipt)
@if($bg == 'alert-warning')
<button type="button" id="cancelModalBtn" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;" data-bs-toggle="modal" data-bs-target="#cancelModal">解約について</button>
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@elseif($bg == 'alert-danger')
<button type="button" id="cancelModalBtn" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;" data-bs-toggle="modal" data-bs-target="#cancelModal">解約について</button>
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@else
<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>
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@endif
@else
@if($bg == 'alert-warning')
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@elseif($bg == 'alert-danger')
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@else
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@endif
@endif
</div>
@php
$has_receipt = DB::table('inv_publish')->where('contract_id', $contract->contract_id)->exists();
@endphp
@if($has_receipt)
@if($bg == 'alert-warning')
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@elseif($bg == 'alert-danger')
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@else
<a href="{{ url('receipt/download/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書再発行</a>
@endif
@else
@if($bg == 'alert-warning')
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-warning badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@elseif($bg == 'alert-danger')
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-danger badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@else
<a href="{{ url('receipt/input/' . $contract->contract_id) }}" class="btn btn-outline-secondary badge-pill custom-rounded-btn" style="background: transparent;">領収書発行</a>
@endif
@endif
</div>
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
</article>
@if($i % 2 == 1 || $i == count($contracts) - 1)
</div>