krgm.so-manager-dev.com/resources/views/admin/regularcontracts/list.blade.php
你的名字 06756440ce
All checks were successful
Deploy main / deploy (push) Successful in 22s
【定期契約マスタ】画面修正
2025-10-31 22:14:50 +09:00

535 lines
33 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

@extends('layouts.app')
@section('title', '定期契約マスタ')
@section('content')
<style>
/* ===== 画面全般(フォント・サイズ) ===== */
.rc-page,
.rc-page .card,
.rc-page .form-control,
.rc-page .btn,
.rc-page table,
.rc-page .breadcrumb {
font-family: "Noto Sans JP","Hiragino Kaku Gothic ProN","Meiryo",system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
font-size: 13px;
line-height: 1.45;
}
/* ===== フィルター列レイアウト ===== */
.rc-filter .field{display:flex;align-items:center;margin-bottom:.6rem;}
.rc-filter .label{flex:0 0 180px;margin:0;color:#333;font-weight:600;white-space:nowrap;}
.rc-filter .input{flex:1 1 auto;min-width:220px;}
.rc-filter .form-control,.rc-filter .custom-select{height:calc(2.0rem + 2px);padding:.25rem .5rem;}
.rc-filter .inline-range{display:flex;gap:.5rem;align-items:center;}
.rc-filter .tilde{color:#666;}
/* ===== 一覧テーブル基礎 ===== */
.rc-table th,.rc-table td{padding:.35rem .5rem;font-size:12px;}
.rc-table thead th{white-space:nowrap;background:#f2f2f2;color:#333;border-bottom-color:#ddd;}
.rc-page .rc-table tbody td:not(.op-cell){background:#fff;}
.rc-page .rc-table tbody td.op-cell{background:#faebd7;}
.rc-table thead th .sort-arrows{display:inline-flex;flex-direction:row;align-items:center;gap:.1rem;margin-left:.2rem;font-size:12px;line-height:1;font-weight:700;text-decoration:none;letter-spacing:-5px;}
.rc-table thead th .sort-arrows .up,.rc-table thead th .sort-arrows .down{color:#b5b5b5;text-decoration:none;}
.rc-table thead th.sorting_asc .sort-arrows .up{color:#000;}
.rc-table thead th.sorting_desc .sort-arrows .down{color:#000;}
/* ===== スクロール固定ヘッダ固定列freeze-table ===== */
.scroll.freeze-table{
position:relative;
background:#fff;
}
/* ===== スクロールラッパsticky正確動作用にposition:relativeを追加 ===== */
.scroll.freeze-table .scroll-x {
position: relative; /* ← ★ これが重要 */
min-width: max-content;
}
.scroll.freeze-table table{
border-collapse:collapse;
width:100%;
}
/* ヘッダー固定 */
.scroll.freeze-table thead th{
position:sticky;
top:0;
z-index:10; /* ヘッダーを前面 */
background:#f2f2f2;
}
/* ===== 左1列No固定幅 50px ===== */
.scroll.freeze-table thead th:first-child,
.scroll.freeze-table tbody td:first-child {
position: sticky;
left: 0;
z-index: 20;
background: #fff;
width: 50px;
min-width: 50px;
max-width: 50px;
}
/* ===== 左2列目操作列固定幅 120px ===== */
.scroll.freeze-table thead th:nth-child(2),
.scroll.freeze-table tbody td:nth-child(2) {
position: sticky;
left: 50px; /* No列と同じ幅 */
z-index: 19; /* 少し下げる(重なり順) */
background: #faebd7;
width: 120px;
min-width: 120px;
max-width: 120px;
box-shadow: inset -1px 0 #ddd; /* 境界を自然にする */
}
/* 行ホバーの視認性(薄め) */
.scroll.freeze-table tbody tr:hover td{background-color:rgba(0,0,0,.02);}
/* ツールバー(左:ボタン群/右:ページャ) */
.rc-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap;}
.rc-toolbar .btn+.btn{margin-left:.4rem;}
</style>
<div class="rc-page">
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-lg-6"><h1 class="m-0 text-dark">定期契約マスタ</h1></div>
<div class="col-lg-6">
<ol class="breadcrumb float-sm-right text-sm">
<li class="breadcrumb-item"><a href="{{ route('home') }}">ホーム</a></li>
<li class="breadcrumb-item active">定期契約マスタ</li>
</ol>
</div>
</div>
<p class="text-muted mb-0">※この画面のデータは通常変更する必要はありません。</p>
</div>
</div>
<section class="content">
<div class="container-fluid">
{{-- 絞り込みフィルター2カラム --}}
<div class="card rc-filter">
<div class="card-header"><h3 class="card-title">絞り込みフィルター</h3></div>
<div class="card-body">
<form action="{{ route('regularcontracts') }}" method="get" id="list-form">
@csrf
<input type="hidden" name="sort" id="sort" value="{{ $sort }}">
<input type="hidden" name="sort_type" id="sort_type" value="{{ $sort_type }}">
<div class="row">
{{-- 左カラム --}}
<div class="col-lg-6">
<div class="field"><label class="label">利用者ID</label>
<div class="input"><input type="text" class="form-control" name="user_id" value="{{ $user_id ?? '' }}" placeholder="123456"></div>
</div>
<div class="field"><label class="label">利用者分類</label>
<div class="input">
<select class="form-control" name="user_categoryid">
<option value="">全て</option>
@foreach(($userTypeOptions ?? []) as $id => $label)
<option value="{{ $id }}" {{ (string)($user_categoryid ?? '') === (string) $id ? 'selected' : '' }}>{{ $label }}</option>
@endforeach
</select>
</div>
</div>
<div class="field"><label class="label">タグシリアル</label>
<div class="input"><input type="text" class="form-control" name="user_tag_serial" value="{{ $user_tag_serial ?? '' }}" placeholder="キーワード…"></div>
</div>
<div class="field"><label class="label">フリガナ</label>
<div class="input"><input type="text" class="form-control" name="user_phonetic" value="{{ $user_phonetic ?? '' }}" placeholder="キーワード…"></div>
</div>
<div class="field"><label class="label">電話番号</label>
<div class="input"><input type="text" class="form-control" name="phone" value="{{ $phone ?? '' }}" placeholder="携帯/自宅いずれも可"></div>
</div>
<div class="field"><label class="label">メールアドレス</label>
<div class="input"><input type="text" class="form-control" name="email" value="{{ $email ?? '' }}" placeholder="キーワード…"></div>
</div>
<div class="field"><label class="label">ワークレコード</label>
<div class="input">
<select class="form-control" name="work_record">
<option value="0" {{ ($work_record ?? '0') === '0' ? 'selected' : '' }}>全レコード表示</option>
<option value="1" {{ ($work_record ?? '0') === '1' ? 'selected' : '' }}>ワークレコード非表示</option>
<option value="2" {{ ($work_record ?? '0') === '2' ? 'selected' : '' }}>ワークレコード表示</option>
</select>
</div>
</div>
<div class="field"><label class="label">定期契約ID</label>
<div class="input"><input type="text" class="form-control" name="contract_qr_id" value="{{ $contract_qr_id ?? '' }}" placeholder="定期契約ID"></div>
</div>
<div class="field"><label class="label">検索</label>
<div class="input"><input type="text" class="form-control" name="zone_keyword" value="{{ $zone_keyword ?? '' }}" placeholder="ゾーンID, 車室番号, 旧会員番号"></div>
</div>
<div class="field"><label class="label">関連住所入力あり</label>
<div class="input">
<div class="form-check" style="padding-left:0;">
<input type="checkbox" class="form-check-input" id="has_address" name="has_address" value="1" {{ !empty($has_address) ? 'checked' : '' }}>
</div>
</div>
</div>
</div>
{{-- 右カラム --}}
<div class="col-lg-6">
<div class="field"><label class="label">駐輪場</label>
<div class="input">
<select class="form-control" name="park_id">
<option value="">全て</option>
@foreach(($parkOptions ?? []) as $id => $name)
<option value="{{ $id }}" {{ (string)($park_id ?? '') === (string) $id ? 'selected' : '' }}>{{ $name }}</option>
@endforeach
</select>
</div>
</div>
<div class="field"><label class="label">予約日時</label>
<div class="input inline-range">
<input type="datetime-local" class="form-control" name="reserve_date_from" value="{{ $reserve_date_from ?? '' }}">
<span class="tilde"></span>
<input type="datetime-local" class="form-control" name="reserve_date_to" value="{{ $reserve_date_to ?? '' }}">
</div>
</div>
<div class="field"><label class="label">契約日時</label>
<div class="input inline-range">
<input type="datetime-local" class="form-control" name="contract_created_from" value="{{ $contract_created_from ?? '' }}">
<span class="tilde"></span>
<input type="datetime-local" class="form-control" name="contract_created_to" value="{{ $contract_created_to ?? '' }}">
</div>
</div>
<div class="field"><label class="label">解約日時</label>
<div class="input inline-range">
<input type="datetime-local" class="form-control" name="contract_canceled_from" value="{{ $contract_canceled_from ?? '' }}">
<span class="tilde"></span>
<input type="datetime-local" class="form-control" name="contract_canceled_to" value="{{ $contract_canceled_to ?? '' }}">
</div>
</div>
<div class="field"><label class="label">授受日時</label>
<div class="input inline-range">
<input type="datetime-local" class="form-control" name="receipt_delivery_from" value="{{ $receipt_delivery_from ?? '' }}">
<span class="tilde"></span>
<input type="datetime-local" class="form-control" name="receipt_delivery_to" value="{{ $receipt_delivery_to ?? '' }}">
</div>
</div>
<div class="field"><label class="label">定期有効月数</label>
<div class="input">
<select class="form-control" name="contract_valid_months">
<option value="">全て</option>
<option value="1" {{ (isset($contract_valid_months) && (string)$contract_valid_months === '1') ? 'selected' : '' }}>直近1ヶ月</option>
<option value="2" {{ (isset($contract_valid_months) && (string)$contract_valid_months === '2') ? 'selected' : '' }}>直近2ヶ月</option>
<option value="3" {{ (isset($contract_valid_months) && (string)$contract_valid_months === '3') ? 'selected' : '' }}>直近3ヶ月</option>
<option value="6" {{ (isset($contract_valid_months) && (string)$contract_valid_months === '6') ? 'selected' : '' }}>直近6ヶ月</option>
<option value="12" {{ (isset($contract_valid_months) && (string)$contract_valid_months === '12') ? 'selected' : '' }}>直近12ヶ月</option>
</select>
</div>
</div>
<div class="field"><label class="label">定期契約継続</label>
<div class="input">
<select class="form-control" name="update_flag">
<option value="0" {{ ($update_flag ?? '0') === '0' ? 'selected' : '' }}>全て</option>
<option value="1" {{ ($update_flag ?? '0') === '1' ? 'selected' : '' }}>継続契約</option>
<option value="2" {{ ($update_flag ?? '0') === '2' ? 'selected' : '' }}>それ以外(新規)</option>
</select>
</div>
</div>
<div class="field"><label class="label">名寄フリガナ</label>
<div class="input"><input type="text" class="form-control" name="merge_phonetic" value="{{ $merge_phonetic ?? '' }}" placeholder="キーワード…"></div>
</div>
<div class="field"><label class="label">ゾーン名検索</label>
<div class="input"><input type="text" class="form-control" name="zone_name" value="{{ $zone_name ?? '' }}" placeholder="キーワード…"></div>
</div>
<div class="field"><label class="label">タグ・QR</label>
<div class="input">
<select class="form-control" name="tag_qr_flag">
<option value="">全て</option>
<option value="0" {{ (isset($tag_qr_flag) && (string)$tag_qr_flag === '0') ? 'selected' : '' }}>タグ</option>
<option value="1" {{ (isset($tag_qr_flag) && (string)$tag_qr_flag === '1') ? 'selected' : '' }}>QR</option>
</select>
</div>
</div>
</div>
</div>
{{-- フィルターボタン --}}
<div class="mt-2">
<button type="submit" class="btn btn-default">絞り込み</button>
<a href="{{ route('regularcontracts') }}" class="btn btn-default">解除</a>
</div>
</form>
</div>
</div>
{{-- ツールバー(左:ボタン群/右:ページャ) --}}
<div class="rc-toolbar mb-2">
<div class="left">
<a href="{{ route('regularcontracts_add') }}" class="btn btn-sm btn-default">新規</a>
<button type="button" class="btn btn-sm btn-default" id="btn-delete-selected">削除</button>
<button type="button" class="btn btn-sm btn-default" data-toggle="modal" data-target="#importModal">インポート</button>
<button type="button" class="btn btn-sm btn-default js-export" data-url="{{ route('regularcontracts_export') }}">CSV出力</button>
<button type="button" class="btn btn-sm btn-default js-export" data-url="{{ route('regularcontracts_export', [], false) }}?type=smbc">SMBC出力</button>
<button type="button" class="btn btn-sm btn-default js-export" data-url="{{ route('regularcontracts_export', [], false) }}?type=city">役所提出用CSV出力</button>
</div>
<div class="right">
{{ $list->appends(request()->except('page'))->links('pagination') }}
</div>
</div>
<iframe id="dlFrame" name="dlFrame" style="width:0;height:0;border:0;visibility:hidden;"></iframe>
{{-- 一覧テーブルfreeze-table でヘッダ左2列固定 --}}
<form action="{{ route('regularcontracts_delete') }}" method="post" id="form_delete">
@csrf
<div class="scroll freeze-table">
<div class="scroll-x">
<table class="table table-bordered table-hover rc-table mb-0 text-nowrap">
@php
$currentSort = $sort ?? 'contract_id';
$currentDir = strtolower($sort_type ?? 'asc');
if (!in_array($currentDir, ['asc','desc'], true)) $currentDir = 'asc';
$sortClass = function(string $key) use($currentSort,$currentDir){
$base = 'sorting';
return $currentSort === $key ? $base.' '.($currentDir==='asc'?'sorting_asc':'sorting_desc') : $base;
};
$renderSortIcon = static function(string $key){
return '<span class="sort-arrows"><span class="up">↑</span><span class="down">↓</span></span>';
};
@endphp
<thead>
<tr>
<th class="text-right no-col">No</th>
{{-- 操作列チェック編集幅120px ※左固定のため列幅は固定推奨 --}}
<th style="width:120px">
<div class="d-flex align-items-center">
<input type="checkbox" id="check-all" class="mr-1"><span></span>
</div>
</th>
<th class="text-right {{ $sortClass('contract_id') }}" sort="contract_id" style="white-space:nowrap;">契約ID {!! $renderSortIcon('contract_id') !!}</th>
<th class="text-right {{ $sortClass('contract_qr_id') }}" sort="contract_qr_id">定期契約ID {!! $renderSortIcon('contract_qr_id') !!}</th>
<th class="{{ $sortClass('old_contract_id') }}" sort="old_contract_id">旧定期契約番号 {!! $renderSortIcon('old_contract_id') !!}</th>
<th class="{{ $sortClass('pplace_no') }}" sort="pplace_no">車室番号 {!! $renderSortIcon('pplace_no') !!}</th>
<th class="{{ $sortClass('user_id') }}" sort="user_id">利用者ID {!! $renderSortIcon('user_id') !!}</th>
<th class="{{ $sortClass('user_categoryid') }}" sort="user_categoryid">利用者分類ID {!! $renderSortIcon('user_categoryid') !!}</th>
<th class="{{ $sortClass('tag_qr_flag') }}" sort="tag_qr_flag">タグ・QR {!! $renderSortIcon('tag_qr_flag') !!}</th>
<th class="text-right {{ $sortClass('park_id') }}" sort="park_id">駐輪場ID {!! $renderSortIcon('park_id') !!}</th>
<th class="{{ $sortClass('reserve_date') }}" sort="reserve_date">予約日時 {!! $renderSortIcon('reserve_date') !!}</th>
<th class="{{ $sortClass('contract_periods') }}" sort="contract_periods">有効期間S {!! $renderSortIcon('contract_periods') !!}</th>
<th class="{{ $sortClass('contract_periode') }}" sort="contract_periode">有効期間E {!! $renderSortIcon('contract_periode') !!}</th>
<th class="text-right {{ $sortClass('price_parkplaceid') }}" sort="price_parkplaceid">駐輪場所ID {!! $renderSortIcon('price_parkplaceid') !!}</th>
<th class="{{ $sortClass('user_securitynum') }}" sort="user_securitynum">防犯登録番号 {!! $renderSortIcon('user_securitynum') !!}</th>
<th class="{{ $sortClass('contract_created_at') }}" sort="contract_created_at">契約日時 {!! $renderSortIcon('contract_created_at') !!}</th>
<th class="{{ $sortClass('contract_updated_at') }}" sort="contract_updated_at">更新可能日 {!! $renderSortIcon('contract_updated_at') !!}</th>
<th class="{{ $sortClass('contract_cancelday') }}" sort="contract_cancelday">解約日時 {!! $renderSortIcon('contract_cancelday') !!}</th>
<th class="{{ $sortClass('contract_reduction') }}" sort="contract_reduction">減免措置 {!! $renderSortIcon('contract_reduction') !!}</th>
<th class="text-right {{ $sortClass('enable_months') }}" sort="enable_months">定期有効月数 {!! $renderSortIcon('enable_months') !!}</th>
<th class="{{ $sortClass('printable_date') }}" sort="printable_date">シール印刷可能日 {!! $renderSortIcon('printable_date') !!}</th>
<th class="text-right {{ $sortClass('billing_amount') }}" sort="billing_amount">請求金額 {!! $renderSortIcon('billing_amount') !!}</th>
<th class="{{ $sortClass('pplace_allocation_flag') }}" sort="pplace_allocation_flag">車室割り当てフラグ {!! $renderSortIcon('pplace_allocation_flag') !!}</th>
<th class="{{ $sortClass('contract_payment_day') }}" sort="contract_payment_day">授受日時 {!! $renderSortIcon('contract_payment_day') !!}</th>
<th class="text-right {{ $sortClass('contract_money') }}" sort="contract_money">授受金額 {!! $renderSortIcon('contract_money') !!}</th>
<th class="{{ $sortClass('contract_flag') }}" sort="contract_flag">授受フラグ {!! $renderSortIcon('contract_flag') !!}</th>
<th class="{{ $sortClass('settlement_transaction_id') }}" sort="settlement_transaction_id">決済トランザクションID {!! $renderSortIcon('settlement_transaction_id') !!}</th>
<th class="text-right {{ $sortClass('contract_seal_issue') }}" sort="contract_seal_issue">シール発行数 {!! $renderSortIcon('contract_seal_issue') !!}</th>
<th class="{{ $sortClass('storage_company_code') }}" sort="storage_company_code">収納企業コード {!! $renderSortIcon('storage_company_code') !!}</th>
<th class="{{ $sortClass('share_storage_company_code') }}" sort="share_storage_company_code">共有先収納企業コード {!! $renderSortIcon('share_storage_company_code') !!}</th>
<th class="{{ $sortClass('accept_number') }}" sort="accept_number">受付番号 {!! $renderSortIcon('accept_number') !!}</th>
<th class="{{ $sortClass('update_flag') }}" sort="update_flag">(更新元)契約更新済フラグ {!! $renderSortIcon('update_flag') !!}</th>
<th class="{{ $sortClass('vehicle_type_id') }}" sort="vehicle_type_id">車種区分ID {!! $renderSortIcon('vehicle_type_id') !!}</th>
<th class="{{ $sortClass('user_phonetic') }}" sort="user_phonetic">チェック用_フリガナ {!! $renderSortIcon('user_phonetic') !!}</th>
<th class="{{ $sortClass('user_regident_zip') }}" sort="user_regident_zip">チェック用_居住所郵便番号 {!! $renderSortIcon('user_regident_zip') !!}</th>
<th class="{{ $sortClass('user_mobile') }}" sort="user_mobile">チェック用_携帯電話番号 {!! $renderSortIcon('user_mobile') !!}</th>
<th class="{{ $sortClass('user_homephone') }}" sort="user_homephone">チェック用_自宅電話番号 {!! $renderSortIcon('user_homephone') !!}</th>
<th class="{{ $sortClass('old_member_number') }}" sort="old_member_number">チェック用_旧会員番号 {!! $renderSortIcon('old_member_number') !!}</th>
</tr>
</thead>
<tbody>
@php
$formatYmd = static function($v){ if(empty($v)) return ''; try{return \Illuminate\Support\Carbon::parse($v)->format('Y-m-d');}catch(\Throwable $e){return mb_substr((string)$v,0,10);} };
$formatYmdHi = static function($v){ if(empty($v)) return ''; try{return \Illuminate\Support\Carbon::parse($v)->format('Y-m-d H:i');}catch(\Throwable $e){return mb_substr((string)$v,0,16);} };
@endphp
@foreach($list as $item)
<tr>
{{-- No左固定 --}}
<td class="text-right" style="width:50px;">{{ $loop->iteration }}</td>
{{-- 操作列(左固定) --}}
<td style="width:120px;">
<div class="d-flex align-items-center">
<input type="checkbox" class="mr-2 row-check" name="ids[]" value="{{ $item->contract_id }}">
<a href="{{ route('regularcontracts_edit', ['contract_id' => $item->contract_id]) }}" class="btn btn-sm btn-default">編集</a>
</div>
</td>
{{-- 以降データ列 --}}
<td class="text-right">{{ $item->contract_id }}</td>
<td class="text-right">{{ $item->contract_qr_id }}</td>
<td>{{ $item->old_contract_id ?? '' }}</td>
<td>{{ $item->pplace_no ?? '' }}</td>
<td>
@if(!empty($item->user_seq))
<a href="{{ route('users_edit', ['seq' => $item->user_seq]) }}" class="text-primary">
{{ trim(($item->user_id ?? '') . ' ' . ($item->user_name ?? '')) }}
</a>
@else
{{ $item->user_id ?? '' }}
@if(!empty($item->user_name))
<div class="text-muted small">{{ $item->user_name }}</div>
@endif
@endif
</td>
@php
$userCategoryLabel = collect([$item->usertype_subject1 ?? '',$item->usertype_subject2 ?? '',$item->usertype_subject3 ?? ''])
->filter(fn($v)=>$v!=='')->implode('/');
@endphp
<td>{{ $userCategoryLabel ?: $item->user_categoryid }}</td>
<td>{{ $item->tag_qr_flag ? 'QR' : 'タグ' }}</td>
<td class="text-right">{{ $item->park_id }}</td>
<td>{{ $formatYmdHi($item->reserve_date ?? '') }}</td>
<td>{{ $formatYmd($item->contract_periods ?? '') }}</td>
<td>{{ $formatYmd($item->contract_periode ?? '') }}</td>
<td class="text-right">{{ $item->price_parkplaceid ?? '' }}</td>
<td>{{ $item->user_securitynum ?? '' }}</td>
<td>{{ $formatYmd($item->contract_created_at ?? '') }}</td>
<td>{{ $formatYmd($item->contract_updated_at ?? '') }}</td>
<td>{{ $formatYmd($item->contract_cancelday ?? '') }}</td>
<td>{{ $item->contract_reduction ?? '' }}</td>
<td class="text-right">{{ $item->enable_months ?? '' }}</td>
<td>{{ $formatYmd($item->printable_date ?? '') }}</td>
<td class="text-right">{{ isset($item->billing_amount) ? number_format($item->billing_amount) : '' }}</td>
<td>{{ ($item->pplace_allocation_flag ?? null) === null ? '' : ($item->pplace_allocation_flag ? '割当済' : '未割当') }}</td>
<td>{{ $formatYmd($item->contract_payment_day ?? '') }}</td>
<td class="text-right">{{ $item->contract_money ?? '' }}</td>
<td>{{ ($item->contract_flag ?? null) === null ? '' : ($item->contract_flag ? '済' : '未') }}</td>
<td>{{ $item->settlement_transaction_id ?? '' }}</td>
<td class="text-right">{{ $item->contract_seal_issue ?? '' }}</td>
<td>{{ $item->storage_company_code ?? '' }}</td>
<td>{{ $item->share_storage_company_code ?? '' }}</td>
<td>{{ $item->accept_number ?? '' }}</td>
<td>{{ ($item->update_flag ?? 0) ? '更新済' : '未更新' }}</td>
<td>{{ $item->vehicle_type_id ?? '' }}</td>
<td>{{ $item->chk_user_phonetic ?? $item->user_phonetic ?? '' }}</td>
<td>{{ $item->user_regident_zip ?? '' }}</td>
<td>{{ $item->user_mobile ?? '' }}</td>
<td>{{ $item->user_homephone ?? '' }}</td>
<td>{{ $item->old_member_number ?? '' }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</form>
</div>
</section>
</div>
{{-- インポート用モーダル --}}
<div class="modal fade" id="importModal" tabindex="-1" role="dialog" aria-labelledby="importModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm" role="document">
<div class="modal-content">
<div class="modal-header py-2">
<h5 class="modal-title" id="importModalLabel">確認</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
</div>
<form method="post" action="{{ route('regularcontracts_import') }}" enctype="multipart/form-data">
@csrf
<div class="modal-body">
<p class="mb-2 text-sm">
データをインポートします。既存データを上書きする場合はテンプレートに従い識別列を設定してください。<br>
新規追加のみの場合は識別列を空欄のままインポートしてください。
</p>
<div class="custom-file">
<input type="file" name="file" id="importFile" class="custom-file-input" accept=".csv,.xlsx,.xls,.tsv,.txt" required>
<label class="custom-file-label" for="importFile">ファイルの選択</label>
</div>
</div>
<div class="modal-footer py-2">
<button type="submit" class="btn btn-primary btn-sm">はい</button>
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">いいえ</button>
</div>
</form>
</div>
</div>
</div>
{{-- 画面内スクリプト --}}
<script>
// インポート:選択ファイル名をラベルへ反映
document.addEventListener('change', function (e) {
if (e.target && e.target.id === 'importFile') {
var label = e.target.nextElementSibling;
if (label) label.textContent = e.target.files.length ? e.target.files[0].name : 'ファイルの選択';
}
});
(function () {
var deleteForm = document.getElementById('form_delete');
var deleteBtn = document.getElementById('btn-delete-selected');
var masterCheckbox = document.getElementById('check-all');
var rowSelector = '.row-check';
// エクスポート各種
document.querySelectorAll('.js-export').forEach(function (btn) {
btn.addEventListener('click', function () {
var url = btn.getAttribute('data-url');
if (!url) return;
var doExport = function () {
var iframe = document.getElementById('dlFrame');
if (iframe) iframe.src = url; else window.location.href = url;
};
if (window.jQuery && typeof window.jQuery.confirm === 'function') {
window.jQuery.confirm({
title: '確認ダイアログ。',
content: 'CSVファイルを出力します。よろしいですか はい/いいえ',
buttons: {
ok: { text: 'はい', btnClass: 'btn-primary', keys: ['enter'], action: doExport },
いいえ: function () {}
}
});
} else if (confirm('CSVファイルを出力します。よろしいですか はい/いいえ')) {
doExport();
}
});
});
// 一括削除
if (deleteBtn && deleteForm) {
deleteBtn.addEventListener('click', function () {
var checked = document.querySelectorAll(rowSelector + ':checked');
if (!checked.length) { alert('削除する定期契約を選択してください。'); return; }
var submitDelete = function () { deleteForm.submit(); };
if (window.jQuery && typeof window.jQuery.confirm === 'function') {
window.jQuery.confirm({
title: '確認ダイアログ。',
content: '削除してよろしいですか? はい/いいえ',
buttons: {
ok: { text: 'はい', btnClass: 'btn-primary', keys: ['enter'], action: submitDelete },
いいえ: function () {}
}
});
} else if (confirm('削除してよろしいですか? はい/いいえ')) { submitDelete(); }
});
}
// 全選択/個別選択
if (masterCheckbox) {
var updateMasterState = function () {
var allRows = document.querySelectorAll(rowSelector);
var checkedRows = document.querySelectorAll(rowSelector + ':checked');
masterCheckbox.checked = allRows.length > 0 && checkedRows.length === allRows.length;
};
masterCheckbox.addEventListener('change', function () {
document.querySelectorAll(rowSelector).forEach(function (cb) { cb.checked = masterCheckbox.checked; });
});
document.addEventListener('change', function (e) {
if (e.target && e.target.matches(rowSelector)) updateMasterState();
});
updateMasterState();
}
})();
</script>
@endsection