main_kin #18

Merged
go.unhi merged 16 commits from main_kin into main 2025-09-01 10:48:12 +09:00
12 changed files with 614 additions and 11 deletions
Showing only changes of commit 6019e68da7 - Show all commits

View File

@ -0,0 +1,130 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Zone;
class ZoneController extends Controller
{
/**
* 一覧表示(絞り込み対応)
*/
public function list(Request $request)
{
if ($request->input('action') === 'reset') {
return redirect()->route('zones');
}
// ソート設定
$sort = $request->input('sort', 'zone_id');
$sort_type = $request->input('sort_type', 'desc');
// ベースクエリ
$query = Zone::query();
// === 絞り込み条件 ===
if ($request->filled('zone_id')) {
$query->where('zone_id', $request->zone_id);
}
if ($request->filled('zone_name')) {
$query->where('zone_name', 'LIKE', "%{$request->zone_name}%");
}
if ($request->filled('park_id')) {
$query->where('park_id', $request->park_id);
}
if ($request->filled('ptype_id')) {
$query->where('ptype_id', $request->ptype_id);
}
if ($request->filled('psection_id')) {
$query->where('psection_id', $request->psection_id);
}
if ($request->has('use_flag') && $request->use_flag !== '') {
$query->where('use_flag', $request->use_flag);
}
// ページネーション
$zones = $query->orderBy($sort, $sort_type)->paginate(20);
return view('admin.zones.list', compact(
'zones', 'sort', 'sort_type'
));
}
/**
* 新規登録
*/
public function add(Request $request)
{
if ($request->isMethod('post')) {
$data = $this->validateZone($request);
Zone::create($data);
return redirect()->route('zones')
->with('success', 'ゾーンを登録しました');
}
$zone = new Zone();
return view('admin.zones.add', compact('zone'));
}
/**
* 編集
*/
public function edit($id, Request $request)
{
$zone = Zone::findOrFail($id);
if ($request->isMethod('post')) {
$data = $this->validateZone($request);
$zone->update($data);
return redirect()->route('zones')
->with('success', 'ゾーンを更新しました');
}
return view('admin.zones.edit', compact('zone'));
}
/**
* 詳細表示
*/
public function info($id)
{
$zone = Zone::findOrFail($id);
return view('admin.zones.info', compact('zone'));
}
/**
* 削除
*/
public function delete(Request $request)
{
$id = $request->input('id');
if ($id) {
Zone::destroy($id);
return redirect()->route('zones')->with('success', 'ゾーンを削除しました');
}
return redirect()->route('zones')->with('error', '削除対象が指定されていません');
}
/**
* バリデーション共通化
*/
private function validateZone(Request $request)
{
return $request->validate([
'zone_name' => 'required|string|max:50',
'park_id' => 'required|integer',
'ptype_id' => 'nullable|integer',
'psection_id' => 'nullable|integer',
'zone_number' => 'nullable|integer|min:0',
'zone_standard' => 'nullable|integer|min:0',
'zone_tolerance' => 'nullable|integer|min:0',
'use_flag' => 'nullable|boolean',
'memo' => 'nullable|string|max:255',
]);
}
}

44
app/Models/Zone.php Normal file
View File

@ -0,0 +1,44 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Zone extends Model
{
use HasFactory;
/**
* テーブル名
*/
protected $table = 'zone';
/**
* 主キー
*/
protected $primaryKey = 'zone_id';
/**
* タイムスタンプを有効化
*/
public $timestamps = true;
/**
* 一括代入可能なカラム
*/
protected $fillable = [
'park_id',
'ptype_id',
'psection_id',
'zone_name',
'zone_number',
'zone_standard',
'zone_tolerance',
'zone_sort',
'delete_flag',
'ope_id',
'created_at',
'updated_at',
];
}

View File

@ -65,8 +65,8 @@
<thead>
<tr>
{{-- チェック + 編集ボタン --}}
<th style="width:120px;" class="text-left">
<input type="checkbox" class="minimal m-0" id="checkbox_all">
<th style="width:140px;" class="text-left">
<input type="checkbox" onclick="$('input[name*=\'pk\']').prop('checked', this.checked);">
</th>
<th class="sorting {{ ($sort=='regular_type_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="regular_type_id"><span>定期種別ID</span></th>
<th><span>市区名</span></th>

View File

@ -71,9 +71,9 @@
<table class="table table-bordered table-striped dataTable text-nowrap">
<thead>
<tr>
<th style="width:120px;" class="text-left">
<input type="checkbox" class="minimal m-0" id="checkbox_all">
</th>
<th style="width:140px;" class="text-left">
<input type="checkbox" onclick="$('input[name*=\'pk\']').prop('checked', this.checked);">
</th>
<th sort="setting_id" class="sorting {{ ($sort=='setting_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}"><span>{{ __('設定ID') }}</span></th>
<th sort="edit_master" class="sorting {{ ($sort=='edit_master') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}"><span>{{ __('編集マスタ') }}</span></th>
<th sort="web_master" class="sorting {{ ($sort=='web_master') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}"><span>{{ __('ウェブ参照マスタ') }}</span></th>

View File

@ -87,9 +87,10 @@
<table class="table table-bordered table-striped dataTable text-nowrap">
<thead>
<tr>
<th style="width:120px;" class="text-left">
<input type="checkbox" class="minimal m-0" id="checkbox_all">
<th style="width:140px;" class="text-left">
<input type="checkbox" onclick="$('input[name*=\'pk\']').prop('checked', this.checked);">
</th>
<th class="sorting {{ ($sort=='settlement_transaction_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="settlement_transaction_id"><span>決済トランザクションID</span></th>
<th class="sorting {{ ($sort=='contract_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="contract_id"><span>定期契約ID</span></th>
<th class="sorting {{ ($sort=='status') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="status"><span>ステータス</span></th>
@ -110,10 +111,11 @@
<tr>
<td class="table-warning align-middle">
<div class="d-flex align-items-center">
<input type="checkbox" class="minimal m-0 checkbox" name="ids[]" value="{{ $item->settlement_transaction_id }}">
<input type="checkbox" class="m-0 checkbox" name="pk[]" value="{{ $item->settlement_transaction_id }}">
<a href="{{ route('settlement_transactions_edit', ['id' => $item->settlement_transaction_id]) }}" class="btn btn-sm btn-default ml-2">編集</a>
</div>
</td>
<td class="sm-item text-left align-middle">{{ $item->settlement_transaction_id }}</td>
<td class="sm-item text-left align-middle">{{ $item->contract_id }}</td>
<td class="sm-item text-left align-middle">{{ $item->status }}</td>

View File

@ -0,0 +1,93 @@
@csrf
<div class="form-group row">
<label class="col-lg-2 col-form-label">ゾーン名ID<span class="text-danger"></span></label>
<div class="col-lg-6">
<input type="text" name="zone_id" class="form-control"
value="{{ old('zone_id', $zone->zone_id ?? '') }}" required>
@error('zone_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">駐輪場ID<span class="text-danger"></span></label>
<div class="col-lg-6">
<input type="number" name="park_id" class="form-control"
value="{{ old('park_id', $zone->park_id ?? '') }}" required>
@error('park_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">駐輪分類ID</label>
<div class="col-lg-6">
<input type="number" name="ptype_id" class="form-control"
value="{{ old('ptype_id', $zone->ptype_id ?? '') }}">
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">車種区分ID</label>
<div class="col-lg-6">
<input type="number" name="psection_id" class="form-control"
value="{{ old('psection_id', $zone->psection_id ?? '') }}">
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">ゾーン名<span class="text-danger"></span></label>
<div class="col-lg-6">
<input type="text" name="zone_name" class="form-control"
value="{{ old('zone_name', $zone->zone_name ?? '') }}" required>
@error('zone_name')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">ゾーン内現在契約台数</label>
<div class="col-lg-6">
<input type="number" name="zone_number" class="form-control"
value="{{ old('zone_number', $zone->zone_number ?? '') }}">
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">ゾーン内標準台数</label>
<div class="col-lg-6">
<input type="number" name="zone_standard" class="form-control"
value="{{ old('zone_standard', $zone->zone_standard ?? '') }}">
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">ゾーン内許容台数</label>
<div class="col-lg-6">
<input type="number" name="zone_tolerance" class="form-control"
value="{{ old('zone_tolerance', $zone->zone_tolerance ?? '') }}">
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">ゾーン順</label>
<div class="col-lg-6">
<input type="number" name="zone_sort" class="form-control form-control-lg"
value="{{ old('zone_sort', $zone->zone_sort ?? '') }}">
</div>
</div>
<div class="form-group col-12 text-left">
@if(isset($zone) && $zone->zone_id)
{{-- 編集画面 --}}
<button type="submit" class="btn btn-primary">保存</button>
<a href="{{ route('zones') }}" class="btn btn-secondary">戻る</a>
@else
{{-- 新規画面 --}}
<button type="submit" class="btn btn-success">登録</button>
<a href="{{ route('zones') }}" class="btn btn-secondary">削除</a>
@endif
</div>

View File

@ -0,0 +1,34 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] ゾーンマスタ新規登録')
@section('content')
<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') }}">XX様info(ホーム)</a></li>
<li class="breadcrumb-item"><a href="{{ route('zones') }}">ゾーンマスタ</a></li>
<li class="breadcrumb-item active">新規登録</li>
</ol>
</div>
</div>
</div>
</div>
<section class="content">
<div class="col-lg-12">
<div class="card">
<div class="card-body">
<form action="{{ route('zones_add') }}" method="POST" class="form-horizontal">
@include('admin.zones._form')
</form>
</div>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,35 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] ゾーンマスタ編集')
@section('content')
<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') }}">XX様info(ホーム)</a></li>
<li class="breadcrumb-item"><a href="{{ route('zones') }}">ゾーンマスタ</a></li>
<li class="breadcrumb-item active">編集</li>
</ol>
</div>
</div>
</div>
</div>
<section class="content">
<div class="col-lg-12">
<div class="card">
<div class="card-body">
<form action="{{ route('zones_edit', $zone->zone_id) }}" method="POST" class="form-horizontal">
@method('POST')
@include('admin.zones._form')
</form>
</div>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,51 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] ゾーンマスタ詳細')
@section('content')
<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') }}">XX様info(ホーム)</a></li>
<li class="breadcrumb-item"><a href="{{ route('zones') }}">ゾーンマスタ</a></li>
<li class="breadcrumb-item active">詳細</li>
</ol>
</div>
</div>
</div>
</div>
<section class="content">
<div class="col-lg-12">
<div class="card">
<div class="card-body">
{{-- 共通フォームをインクルード --}}
<form class="form-horizontal">
@csrf
{{-- form.blade.phpの内容を読み込み --}}
@include('admin.zones.form', ['zone' => $zone])
{{-- すべてのフォーム要素を非活性にするJS --}}
<script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('input, select, textarea').forEach(function(el) {
el.setAttribute('disabled', true);
});
});
</script>
<div class="form-group col-12 text-center">
<a href="{{ route('zones') }}" class="btn btn-secondary">戻る</a>
</div>
</form>
</div>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,194 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] ゾーンマスタ')
@section('content')
<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') }}">XX様info(ホーム)</a></li>
<li class="breadcrumb-item active">ゾーンマスタ</li>
</ol>
</div>
</div>
</div>
</div>
<section class="content">
<!-- 絞り込みフィルター -->
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<h3 class="card-title">絞り込みフィルター</h3>
</div>
<div class="card-body">
<form action="{{ route('zones') }}" method="POST" id="list-form" class="form-horizontal">
@csrf
<input type="hidden" name="sort" value="{{ $sort ?? '' }}">
<input type="hidden" name="sort_type" value="{{ $sort_type ?? '' }}">
<table class="table table-borderless mb-0" style="width: 100%;">
<tbody>
<tr>
<th style="text-align: left;">駐輪場ID</th>
<td>
<input type="text" name="park_id" value="{{ old('park_id', $park_id ?? '') }}"
class="form-control input-sm" placeholder="123456">
</td>
<th style="text-align: left;">駐輪分類ID</th>
<td>
<input type="text" name="ptype_id" value="{{ old('ptype_id', $ptype_id ?? '') }}"
class="form-control input-sm" placeholder="1">
</td>
</tr>
<tr>
<th style="text-align: left;">車種区分ID</th>
<td>
<input type="text" name="psection_id" value="{{ old('psection_id', $psection_id ?? '') }}"
class="form-control input-sm" placeholder="2">
</td>
</tr>
</tbody>
</table>
<div class="form-group col-12 text-left mt-3">
<button type="submit" name="action" value="filter" class="btn btn-default">絞り込み</button>
<button type="submit" name="action" value="reset" class="btn btn-default">解除</button>
</div>
</form>
</div>
</div>
</div>
<!-- 絞り込みフィルター -->
<!-- ツールバー -->
<div class="container-fluid mb20">
<a href="{{ route('zones_add') }}" class="btn btn-sm btn-default mr10">新規</a>
<button type="submit" form="deleteForm" class="btn btn-sm btn-default mr10"
onclick="return confirm('選択したゾーンを削除しますか?');">削除</button>
<div class="d-flex justify-content-end">
{{ $zones->appends(request()->all())->links('pagination') }}
</div>
</div>
<!-- ツールバー -->
<!-- 一覧テーブル -->
<div class="col-lg-12 mb20">
<div class="table-responsive">
<form id="deleteForm" method="POST" action="{{ route('zones_delete') }}">
@csrf
<table class="table table-bordered table-striped dataTable text-nowrap">
<thead>
<tr>
<!-- 全選択チェックボックス -->
<th style="width:140px;" class="text-left">
<input type="checkbox" onclick="$('input[name*=\'pk\']').prop('checked', this.checked);">
</th>
<!-- ゾーンID -->
<th class="sorting {{ ($sort=='zone_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="zone_id">
<span>ゾーンID</span>
</th>
<!-- 駐輪場ID -->
<th class="sorting {{ ($sort=='park_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="park_id">
<span>駐輪場ID</span>
</th>
<!-- 駐輪分類ID -->
<th class="sorting {{ ($sort=='ptype_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="ptype_id">
<span>駐輪分類ID</span>
</th>
<!-- ゾーン名 -->
<th class="sorting {{ ($sort=='zone_name') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="zone_name">
<span>ゾーン名</span>
</th>
<!-- ゾーン内現在契約台数 -->
<th class="sorting {{ ($sort=='zone_number') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="zone_number">
<span>ゾーン内現在契約台数</span>
</th>
<!-- ゾーン内標準台数 -->
<th class="sorting {{ ($sort=='zone_standard') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="zone_standard">
<span>ゾーン内標準台数</span>
</th>
<!-- ゾーン内許容台数 -->
<th class="sorting {{ ($sort=='zone_tolerance') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="zone_tolerance">
<span>ゾーン内許容台数</span>
</th>
<!-- ゾーン順 -->
<th class="sorting {{ ($sort=='zone_sort') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="zone_sort">
<span>ゾーン順</span>
</th>
<!-- 車種区分ID -->
<th class="sorting {{ ($sort=='psection_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="psection_id">
<span>車種区分ID</span>
</th>
</tr>
</thead>
<tbody>
@foreach($zones as $item)
<tr>
<td class="table-warning align-middle">
<div class="d-flex align-items-center">
<input type="checkbox" class="m-0 checkbox" name="pk[]" value="{{ $item->zone_id }}">
<a href="{{ route('zones_edit', ['id' => $item->zone_id]) }}" class="btn btn-sm btn-default ml-2">編集</a>
</div>
</td>
<td>{{ $item->zone_id }}</td>
<td>{{ $item->park_id }}</td>
<td>{{ $item->ptype_id }}</td>
<td>{{ $item->zone_name }}</td>
<td>{{ $item->zone_number }}</td>
<td>{{ $item->zone_standard }}</td>
<td>{{ $item->zone_tolerance }}</td>
<td>{{ $item->zone_sort }}</td>
<td>{{ $item->psection_id }}</td>
</tr>
@endforeach
</tbody>
</table>
</form>
</div>
</div>
<!-- 一覧テーブル -->
</section>
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function () {
// ---------------------
// ソート機能
// ---------------------
document.querySelectorAll('th.sorting').forEach(th => {
th.addEventListener('click', function() {
const form = document.getElementById('list-form');
const current = "{{ $sort ?? '' }}";
const currentType = "{{ $sort_type ?? '' }}";
const nextCol = this.getAttribute('sort');
let nextType = 'asc';
if (current === nextCol) {
nextType = (currentType === 'asc') ? 'desc' : 'asc';
}
form.querySelector('[name=sort]').value = nextCol;
form.querySelector('[name=sort_type]').value = nextType;
form.submit();
});
});
});
</script>
@endpush
@endsection

View File

@ -399,6 +399,11 @@
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('zones') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("ゾーンマスタ") }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('regular_types') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("定期種別マスタ") }}</p>
@ -409,8 +414,7 @@
<p class="mb-0">{{ __("近傍駅マスタ") }}</p>
</a>
</li>
<li class="nav-item">
<li class="nav-item">
<a href="{{ route('terms') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("利用契約マスタ") }}</p>
</a>
@ -438,7 +442,6 @@
</ul>
</li>
<li class="nav-item has-treeview">
<a href="#" class="nav-link">

View File

@ -20,6 +20,8 @@ use App\Http\Controllers\Admin\OperatorQueController;
use App\Http\Controllers\Admin\SettingController;
use App\Http\Controllers\Admin\MailTemplateController;
use App\Http\Controllers\Admin\InvSettingController;
use App\Http\Controllers\Admin\ZoneController;
/**
@ -311,4 +313,19 @@ Route::middleware('auth')->group(function () {
Route::match(['get', 'post'], '/inv_settings', [InvSettingController::class, 'form'])->name('inv_settings');
Route::post('/inv_settings/save', [InvSettingController::class, 'save'])->name('inv_settings_save');
// [東京都|〇〇駐輪場] ゾーンマスタ
Route::match(['get', 'post'], '/zones', [ZoneController::class, 'list'])->name('zones');
Route::match(['get', 'post'], '/zones/add', [ZoneController::class, 'add'])->name('zones_add');
Route::match(['get', 'post'], '/zones/edit/{id}', [ZoneController::class, 'edit'])
->where(['id' => '[0-9]+'])
->name('zones_edit');
Route::match(['get', 'post'], '/zones/info/{id}', [ZoneController::class, 'info'])
->where(['id' => '[0-9]+'])
->name('zones_info');
Route::match(['get', 'post'], '/zones/delete', [ZoneController::class, 'delete'])
->name('zones_delete');
//kin 2025/08/29 end
});