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 927 additions and 59 deletions
Showing only changes of commit 70bfd18204 - Show all commits

View File

@ -0,0 +1,151 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\InvSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class InvSettingController extends Controller
{
/**
* 登録フォーム表示
*/
public function form(Request $request)
{
$row = InvSetting::first();
$zip1 = $zip2 = $tel1 = $tel2 = $tel3 = $fax1 = $fax2 = $fax3 = '';
if ($row) {
// 郵便番号(そのままハイフン分割)
if (!empty($row->zipcode) && str_contains($row->zipcode, '-')) {
[$zip1, $zip2] = explode('-', $row->zipcode);
}
// 電話番号:数字以外を除去 → 2桁+4桁+4桁 に分割
if (!empty($row->tel_num)) {
$tel = preg_replace('/\D/', '', $row->tel_num); // 数字以外を除去
$tel1 = substr($tel, 0, 2);
$tel2 = substr($tel, 2, 4);
$tel3 = substr($tel, 6, 4);
}
// FAX番号同じく 2桁+4桁+4桁
if (!empty($row->fax_num)) {
$fax = preg_replace('/\D/', '', $row->fax_num);
$fax1 = substr($fax, 0, 2);
$fax2 = substr($fax, 2, 4);
$fax3 = substr($fax, 6, 4);
}
}
return view('admin.invsettings._form', compact(
'row', 'zip1', 'zip2', 'tel1', 'tel2', 'tel3', 'fax1', 'fax2', 'fax3'
));
}
/**
* 登録・更新処理
*/
public function save(Request $request)
{
// バリデーションルール
$rules = [
't_number' => 'required|string|max:20',
't_name' => 'required|string|max:50',
'zip1' => 'required|digits:3',
'zip2' => 'required|digits:4',
'adrs' => 'required|string|max:100',
'bldg' => 'nullable|string|max:80',
'tel1' => 'nullable|digits_between:2,4',
'tel2' => 'nullable|digits_between:2,4',
'tel3' => 'nullable|digits_between:3,4',
'fax1' => 'nullable|digits_between:2,4',
'fax2' => 'nullable|digits_between:2,4',
'fax3' => 'nullable|digits_between:3,4',
'company_image' => 'nullable|image|mimes:png,jpg,jpeg|max:2048',
];
// カスタム日本語メッセージ
$messages = [
't_number.required' => '適格請求書発行事業者番号を入力してください。',
't_number.max' => '適格請求書発行事業者番号は20文字以内で入力してください。',
't_name.required' => '適格事業者名を入力してください。',
't_name.max' => '適格事業者名は50文字以内で入力してください。',
'zip1.required' => '郵便番号(前半)を入力してください。',
'zip1.digits' => '郵便番号前半は3桁で入力してください。',
'zip2.required' => '郵便番号(後半)を入力してください。',
'zip2.digits' => '郵便番号後半は4桁で入力してください。',
'adrs.required' => '表示住所を入力してください。',
'adrs.max' => '表示住所は100文字以内で入力してください。',
'bldg.max' => '建物名は80文字以内で入力してください。',
'tel1.digits_between' => '電話番号1は2桁から4桁で入力してください。',
'tel2.digits_between' => '電話番号2は2桁から4桁で入力してください。',
'tel3.digits_between' => '電話番号3は3桁から4桁で入力してください。',
'fax1.digits_between' => 'FAX番号1は2桁から4桁で入力してください。',
'fax2.digits_between' => 'FAX番号2は2桁から4桁で入力してください。',
'fax3.digits_between' => 'FAX番号3は3桁から4桁で入力してください。',
'company_image.image' => '社判画像は画像ファイルを選択してください。',
'company_image.mimes' => '社判画像はpng, jpg, jpeg形式でアップロードしてください。',
'company_image.max' => '社判画像は2MB以下にしてください。',
];
// バリデーション実行(カスタムメッセージ適用)
$request->validate($rules, $messages);
// データ整形
$zipcode = $request->zip1 . '-' . $request->zip2;
$tel = implode('-', array_filter([$request->tel1, $request->tel2, $request->tel3]));
$fax = implode('-', array_filter([$request->fax1, $request->fax2, $request->fax3]));
// 既存レコードを取得1レコード運用
$row = InvSetting::first();
// 画像処理
$imagePath = $row?->company_image_path;
if ($request->hasFile('company_image')) {
if ($imagePath && Storage::disk('public')->exists($imagePath)) {
Storage::disk('public')->delete($imagePath);
}
$imagePath = $request->file('company_image')->store('inv', 'public');
}
// レコードを新規作成 or 更新
if ($row) {
$row->update([
't_number' => $request->t_number,
't_name' => $request->t_name,
'zipcode' => $zipcode,
'adrs' => $request->adrs,
'bldg' => $request->bldg,
'tel_num' => $tel,
'fax_num' => $fax,
'company_image_path' => $imagePath,
]);
} else {
InvSetting::create([
't_number' => $request->t_number,
't_name' => $request->t_name,
'zipcode' => $zipcode,
'adrs' => $request->adrs,
'bldg' => $request->bldg,
'tel_num' => $tel,
'fax_num' => $fax,
'company_image_path' => $imagePath,
]);
}
return back()->with('success', 'インボイス設定を登録しました。');
}
}

View File

@ -0,0 +1,124 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\MailTemplate;
class MailTemplateController extends Controller
{
/**
* 一覧表示
*/
public function list(Request $request)
{
if ($request->input('action') === 'reset') {
return redirect()->route('mail_templates');
}
$sort = $request->input('sort', 'mail_template_id');
$sort_type = $request->input('sort_type', 'desc');
$query = MailTemplate::query();
// 絞り込み
if ($request->filled('mail_template_id')) {
$query->where('mail_template_id', $request->mail_template_id);
}
if ($request->filled('pg_id')) {
$query->where('pg_id', $request->pg_id);
}
if ($request->has('mgr_cc_flag') && $request->mgr_cc_flag !== '') {
$query->where('mgr_cc_flag', $request->mgr_cc_flag);
}
if ($request->has('use_flag') && $request->use_flag !== '') {
$query->where('use_flag', $request->use_flag);
}
if ($request->filled('subject')) {
$query->where('subject', 'LIKE', "%{$request->subject}%");
}
$templates = $query->orderBy($sort, $sort_type)->paginate(20);
return view('admin.mail_templates.list', compact(
'templates', 'sort', 'sort_type'
));
}
/**
* 新規登録
*/
public function add(Request $request)
{
if ($request->isMethod('post')) {
$data = $this->validateTemplate($request);
MailTemplate::create($data);
return redirect()->route('mail_templates')
->with('success', 'テンプレートを登録しました');
}
$mailTemplate = new MailTemplate();
return view('admin.mail_templates.add', compact('mailTemplate'));
}
/**
* 編集
*/
public function edit($id, Request $request)
{
$mailTemplate = MailTemplate::findOrFail($id);
if ($request->isMethod('post')) {
$data = $this->validateTemplate($request);
$mailTemplate->update($data);
return redirect()->route('mail_templates')
->with('success', 'テンプレートを更新しました');
}
return view('admin.mail_templates.edit', compact('mailTemplate'));
}
/**
* 詳細表示
*/
public function info($id)
{
$mailTemplate = MailTemplate::findOrFail($id);
return view('admin.mail_templates.info', compact('mailTemplate'));
}
/**
* 削除
*/
public function delete(Request $request)
{
$id = $request->input('id');
if ($id) {
MailTemplate::destroy($id);
return redirect()->route('mail_templates')->with('success', 'テンプレートを削除しました');
}
return redirect()->route('mail_templates')->with('error', '削除対象が指定されていません');
}
/**
* バリデーション共通化
*/
private function validateTemplate(Request $request)
{
return $request->validate([
'pg_id' => 'nullable|integer',
'internal_id' => 'nullable|integer',
'mgr_cc_flag' => 'nullable|boolean',
'bcc_adrs' => 'nullable|string|max:255',
'use_flag' => 'nullable|boolean',
'memo' => 'nullable|string|max:255',
'subject' => 'required|string|max:255',
'text' => 'required|string',
'operator_id' => 'nullable|integer',
]);
}
}

16
app/Models/InvSetting.php Normal file
View File

@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class InvSetting extends Model
{
protected $table = 'inv_setting';
protected $primaryKey = 'seq';
public $timestamps = true;
protected $fillable = [
't_number', 't_name', 'zipcode', 'adrs', 'bldg', 'tel_num', 'fax_num', 'company_image_path',
];
}

View File

@ -0,0 +1,124 @@
@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>
</div>
</div>
<section class="content">
<div class="container-fluid">
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $e)<li>{{ $e }}</li>@endforeach
</ul>
</div>
@endif
<form method="post" action="{{ route('inv_settings_save') }}" enctype="multipart/form-data">
@csrf
{{-- 適格請求書発行事業者番号 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">適格請求書発行事業者番号<span class="text-danger">*</span></label>
<div class="form-group col-4">
<input type="text" name="t_number" class="form-control"
value="{{ old('t_number', $row->t_number ?? '') }}">
</div>
</div>
{{-- 適格事業者名 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">適格事業者名<span class="text-danger">*</span></label>
<div class="form-group col-4">
<input type="text" name="t_name" class="form-control"
value="{{ old('t_name', $row->t_name ?? '') }}">
</div>
</div>
{{-- 郵便番号 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">郵便番号</label>
<div class="col-sm-9 d-flex">
<input type="text" name="zip1" class="form-control" style="max-width:120px;"
value="{{ old('zip1', $zip1) }}">
<span class="mx-2">-</span>
<input type="text" name="zip2" class="form-control" style="max-width:140px;"
value="{{ old('zip2', $zip2) }}">
</div>
</div>
{{-- 表示住所 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">表示住所<span class="text-danger">*</span></label>
<div class="form-group col-4">
<input type="text" name="adrs" class="form-control"
value="{{ old('adrs', $row->adrs ?? '') }}">
</div>
</div>
{{-- 建物名 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">建物名</label>
<div class="form-group col-4">
<input type="text" name="bldg" class="form-control"
value="{{ old('bldg', $row->bldg ?? '') }}">
</div>
</div>
{{-- 表示電話番号 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">表示電話番号</label>
<div class="col-sm-9 d-flex">
<input name="tel1" class="form-control" style="max-width:100px;" value="{{ old('tel1', $tel1) }}">
<span class="mx-2">-</span>
<input name="tel2" class="form-control" style="max-width:100px;" value="{{ old('tel2', $tel2) }}">
<span class="mx-2">-</span>
<input name="tel3" class="form-control" style="max-width:100px;" value="{{ old('tel3', $tel3) }}">
</div>
</div>
{{-- 表示FAX番号 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">表示FAX番号</label>
<div class="col-sm-9 d-flex">
<input name="fax1" class="form-control" style="max-width:100px;" value="{{ old('fax1', $fax1) }}">
<span class="mx-2">-</span>
<input name="fax2" class="form-control" style="max-width:100px;" value="{{ old('fax2', $fax2) }}">
<span class="mx-2">-</span>
<input name="fax3" class="form-control" style="max-width:100px;" value="{{ old('fax3', $fax3) }}">
</div>
</div>
{{-- 社判画像 --}}
<div class="form-group row">
<label class="col-sm-3 col-form-label">社判画像</label>
<div class="col-sm-9">
<input type="file" name="company_image" class="form-control-file">
@if(!empty($row->company_image_path))
<div class="mt-2">
<a href="{{ asset('storage/'.$row->company_image_path) }}" target="_blank">現在の画像を表示</a>
</div>
@endif
</div>
</div>
{{-- 登録ボタン --}}
<div class="form-group row">
<div class="col-sm-3">
<button type="submit" class="btn btn-success px-3">登録</button>
</div>
</div>
</form>
</div>
</section>
@endsection

View File

@ -0,0 +1,144 @@
@if(Session::has('success'))
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
{{ Session::get('success') }}
</div>
@elseif(Session::has('error'))
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i> エラー:</h4>
{!! Session::get('error') !!}
</div>
@endif
<div class="card-header">
@if($isInfo)
<a href="{{ route('mail_templates_add') }}" class="btn btn-lg btn-success">登録</a>
<a href="{{ route('mail_templates_edit', ['id' => $mailTemplate->mail_template_id]) }}" class="btn btn-lg btn-danger">編集</a>
@else
<button type="submit" class="btn btn-lg btn-danger register">保存</button>
@endif
</div>
<div class="card-body">
<div class="row">
{{-- 編集・詳細時のみテンプレートID表示 --}}
@if($isEdit || $isInfo)
<div class="form-group col-3">
<label>テンプレートID</label>
</div>
<div class="form-group col-9">
<input type="text" value="{{ $mailTemplate->mail_template_id ?? '' }}" class="form-control form-control-lg" readonly />
</div>
@endif
<!-- 使用プログラムID -->
<div class="form-group col-3">
<label class="required">使用プログラムID</label>
</div>
<div class="form-group col-9">
<input type="number" name="pg_id" value="{{ old('pg_id', $mailTemplate->pg_id ?? '') }}"
class="form-control form-control-lg" @if($isInfo) readonly @endif required />
</div>
<!-- 内部ID -->
<div class="form-group col-3">
<label>内部ID</label>
</div>
<div class="form-group col-9">
<input type="number" name="internal_id" value="{{ old('internal_id', $mailTemplate->internal_id ?? '') }}"
class="form-control form-control-lg" @if($isInfo) readonly @endif />
</div>
<!-- エリアマネージャー同報 -->
<div class="form-group col-3">
<label>エリアマネージャー同報</label>
</div>
<div class="form-group col-9 mt-2">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="mgr_cc_flag" value="1"
@if(old('mgr_cc_flag', $mailTemplate->mgr_cc_flag ?? '') == 1) checked @endif
@if($isInfo) disabled @endif>
<label class="form-check-label">同報する</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="mgr_cc_flag" value="0"
@if(old('mgr_cc_flag', $mailTemplate->mgr_cc_flag ?? '') == 0) checked @endif
@if($isInfo) disabled @endif>
<label class="form-check-label">同報しない</label>
</div>
</div>
<!-- BCCアドレス -->
<div class="form-group col-3">
<label>BCCアドレス</label>
</div>
<div class="form-group col-9">
<input type="text" name="bcc_adrs" value="{{ old('bcc_adrs', $mailTemplate->bcc_adrs ?? '') }}"
class="form-control form-control-lg" @if($isInfo) readonly @endif />
</div>
<!-- 使用フラグ -->
<div class="form-group col-3">
<label>使用フラグ</label>
</div>
<div class="form-group col-9 mt-2">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="use_flag" value="1"
@if(old('use_flag', $mailTemplate->use_flag ?? '') == 1) checked @endif
@if($isInfo) disabled @endif>
<label class="form-check-label">使用する</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="use_flag" value="0"
@if(old('use_flag', $mailTemplate->use_flag ?? '') == 0) checked @endif
@if($isInfo) disabled @endif>
<label class="form-check-label">使用しない</label>
</div>
</div>
<!-- メモ -->
<div class="form-group col-3">
<label>メモ</label>
</div>
<div class="form-group col-9">
<input type="text" name="memo" value="{{ old('memo', $mailTemplate->memo ?? '') }}"
class="form-control form-control-lg" @if($isInfo) readonly @endif />
</div>
<!-- 件名 -->
<div class="form-group col-3">
<label class="required">件名</label>
</div>
<div class="form-group col-9">
<input type="text" name="subject" value="{{ old('subject', $mailTemplate->subject ?? '') }}"
class="form-control form-control-lg" @if($isInfo) readonly @endif required />
</div>
<!-- 本文 -->
<div class="form-group col-3">
<label class="required">本文</label>
</div>
<div class="form-group col-9">
<textarea name="text" class="form-control form-control-lg" rows="8"
@if($isInfo) readonly @endif required>{{ old('text', $mailTemplate->text ?? '') }}</textarea>
</div>
<!-- オペレータID -->
<div class="form-group col-3">
<label>オペレータID</label>
</div>
<div class="form-group col-9">
<input type="number" name="operator_id" value="{{ old('operator_id', $mailTemplate->operator_id ?? '') }}"
class="form-control form-control-lg" @if($isInfo) readonly @endif />
</div>
</div>
{{-- 下部ボタン --}}
@if($isInfo)
<a href="{{ route('mail_templates_add') }}" class="btn btn-lg btn-success">登録</a>
<a href="{{ route('mail_templates_edit', ['id' => $mailTemplate->mail_template_id]) }}" class="btn btn-lg btn-danger">編集</a>
@else
<button type="submit" class="btn btn-lg btn-danger register">保存</button>
@endif
</div>

View File

@ -0,0 +1,46 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] メール送信テンプレート新規登録')
@section('content')
<!-- Content Header (Page header) -->
<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="javascript:void(0);">[東京都|〇〇駐輪場]</a></li>
<li class="breadcrumb-item">メール送信テンプレート</li>
<li class="breadcrumb-item active">[東京都|〇〇駐輪場] メール送信テンプレート新規登録</li>
</ol>
</div>
</div>
</div>
</div>
<!-- /.content-header -->
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<!-- Card -->
<div class="row">
<div class="col-lg-12">
<div class="card">
<form method="post" action="{{ route('mail_templates_add') }}" enctype="multipart/form-data">
@csrf
@include('admin.mail_templates._form', [
'isEdit' => false,
'isInfo' => false,
'mailTemplate' => $mailTemplate,
])
</form>
</div>
</div>
</div>
</div>
</section>
<!-- /.content -->
@endsection

View File

@ -0,0 +1,20 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] メール送信テンプレート')
@section('content')
<div class="content-header">
<div class="container-fluid">
<h1 class="m-0 text-dark">メール送信テンプレート編集</h1>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="card">
<form method="post" action="{{ route('mail_templates_edit', ['id' => $mailTemplate->mail_template_id]) }}" enctype="multipart/form-data">
@csrf
@include('admin.mail_templates._form', ['isEdit' => 1, 'isInfo' => 0, 'mailTemplate' => $mailTemplate])
</form>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,21 @@
@extends('layouts.app')
@section('title', '[東京都|〇〇駐輪場] メール送信テンプレート')
@section('content')
<div class="content-header">
<div class="container-fluid">
<h1 class="m-0 text-dark">メール送信テンプレート詳細</h1>
</div>
</div>
<section class="content">
<div class="container-fluid">
<div class="card">
{{-- info 画面なので action は不要 --}}
<form method="post" enctype="multipart/form-data">
@csrf
@include('admin.mail_templates._form', ['isEdit' => 0, 'isInfo' => 1, 'mailTemplate' => $mailTemplate])
</form>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,201 @@
@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('mail_templates') }}" 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>
{{-- 行1 --}}
<tr>
<th style="width: 18%; text-align: left; vertical-align: middle;">メールテンプレートID</th>
<td style="width: 32%;">
<input type="text" name="mail_template_id"
value="{{ old('mail_template_id', $mail_template_id ?? '') }}"
class="form-control input-sm" placeholder="123456">
</td>
<th style="width: 18%; text-align: left; vertical-align: middle;">使用プログラムID</th>
<td style="width: 32%;">
<input type="text" name="pg_id"
value="{{ old('pg_id', $pg_id ?? '') }}"
class="form-control input-sm" placeholder="123456">
</td>
</tr>
{{-- 行2 --}}
<tr>
<th style="text-align: left; vertical-align: middle;">エリアマネージャー同報</th>
<td>
<select name="mgr_cc_flag" class="form-control input-sm">
<option value="">全て</option>
<option value="1" {{ old('mgr_cc_flag', $mgr_cc_flag ?? '') === '1' ? 'selected' : '' }}>同報する</option>
<option value="0" {{ old('mgr_cc_flag', $mgr_cc_flag ?? '') === '0' ? 'selected' : '' }}>同報市内</option>
</select>
</td>
<th style="text-align: left; vertical-align: middle;">使用フラグ</th>
<td>
<select name="use_flag" class="form-control input-sm">
<option value="">全て</option>
<option value="1" {{ old('use_flag', $use_flag ?? '') === '1' ? 'selected' : '' }}>使用する</option>
<option value="0" {{ old('use_flag', $use_flag ?? '') === '0' ? 'selected' : '' }}>使用しない</option>
</select>
</td>
</tr>
{{-- 行3 --}}
<tr>
<th style="text-align: left; vertical-align: middle;">件名</th>
<td colspan="3">
<input type="text" name="subject"
value="{{ old('subject', $subject ?? '') }}"
class="form-control input-sm" placeholder="キーワード...">
</td>
</tr>
</tbody>
</table>
{{-- ボタン --}}
<div class="form-group col-12 text-left">
<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">
<button type="button" class="btn btn-sm btn-default mr10" onclick="location.href='{{ route('mail_templates_add') }}'">新規</button>
<button type="button" class="btn btn-sm btn-default mr10" id="delete">削除</button>
<div class="d-flex justify-content-end">
{{ $templates->appends(request()->all())->links('pagination') }}
</div>
</div>
<!-- ツールバー -->
<!-- テーブル -->
<div class="col-lg-12 mb20">
<div class="table-responsive">
<form action="{{ route('mail_templates_delete') }}" method="POST" id="form_delete">
@csrf
<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 class="sorting {{ ($sort=='mail_template_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="mail_template_id"><span>メールテンプレートID</span></th>
<th class="sorting {{ ($sort=='pg_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="pg_id"><span>使用プログラムID</span></th>
<th class="sorting {{ ($sort=='internal_id') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="internal_id"><span>内部ID</span></th>
<th><span>エリアマネージャー同報</span></th>
<th><span>BCCアドレス</span></th>
<th class="sorting {{ ($sort=='use_flag') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="use_flag"><span>使用フラグ</span></th>
<th><span>備考</span></th>
<th class="sorting {{ ($sort=='subject') ? ($sort_type=='asc'?'sorting_asc':'sorting_desc') : '' }}" sort="subject"><span>件名</span></th>
<th><span>本文</span></th>
</tr>
</thead>
<tbody>
@foreach($templates as $item)
<tr>
<td class="table-warning align-middle">
<div class="d-flex align-items-center">
<input type="checkbox" class="minimal m-0 checkbox" name="pk[]" value="{{ $item->mail_template_id }}">
<a href="{{ route('mail_templates_info', ['id' => $item->mail_template_id]) }}" class="btn btn-sm btn-default ml-2">編集</a>
</div>
</td>
<td class="sm-item text-left align-middle">{{ $item->mail_template_id }}</td>
<td class="sm-item text-left align-middle">{{ $item->pg_id }}</td>
<td class="sm-item text-left align-middle">{{ $item->internal_id }}</td>
<td class="sm-item text-left align-middle">{{ $item->mgr_cc_flag ? '同報する' : '同報しない' }}</td>
<td class="sm-item text-left align-middle">{{ $item->bcc_adrs }}</td>
<td class="sm-item text-left align-middle">{{ $item->use_flag ? '使用する' : '使用しない' }}</td>
<td class="sm-item text-left align-middle">{{ $item->memo }}</td>
<td class="sm-item text-left align-middle">{{ $item->subject }}</td>
<td class="sm-item text-left align-middle">{{ Str::limit($item->text, 30) }}</td>
</tr>
@endforeach
</tbody>
</table>
</form>
</div>
</div>
<!-- テーブル -->
</section>
<form action="{{ route('mail_templates_export') }}" method="GET" id="form_export"></form>
@push('scripts')
<script>
// 全選択・全解除
document.getElementById('checkbox_all')?.addEventListener('change', function(e){
document.querySelectorAll('.checkbox').forEach(cb => cb.checked = e.target.checked);
});
// 削除確認
document.getElementById('delete')?.addEventListener('click', function(){
const anyChecked = Array.from(document.querySelectorAll('.checkbox')).some(cb => cb.checked);
if (!anyChecked) {
alert('削除対象が選択されていません。');
return;
}
if (confirm('削除してよろしいですか?')) {
document.getElementById('form_delete').submit();
}
});
// ソート
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

@ -37,11 +37,6 @@
</div> </div>
</div> </div>
<!-- <div class="container-fluid mb20">
<button type="submit" class="btn btn-sm btn-default mr10">{{ __('削除') }}</button>
<button type="submit" class="btn btn-sm btn-default mr10">{{ __('インポート') }}</button>
<button type="submit" class="btn btn-sm btn-default mr10">{{ __('CSV出力') }}</button>
</div> -->
</div> </div>
</section> </section>
<!-- /.content --> <!-- /.content -->

View File

@ -374,12 +374,22 @@
<li class="nav-item has-treeview @if(in_array(app('router')->currentRouteName(),$route )) menu-open @endif"> <li class="nav-item has-treeview @if(in_array(app('router')->currentRouteName(),$route )) menu-open @endif">
<a href="#" class="nav-link @if(in_array(app('router')->currentRouteName(), $route)) active @endif"> <a href="#" class="nav-link @if(in_array(app('router')->currentRouteName(), $route)) active @endif">
<i class="nav-icon fa fa-th"></i> <i class="nav-icon fa fa-object-group"></i>
<p> <p>
{{__("マスタ管理")}} {{__("マスタ管理")}}
<i class="right fa fa-angle-down"></i> <i class="right fa fa-angle-down"></i>
</p> </p>
</a> </a>
<ul class="nav nav-treeview">
<li class="nav-item">
<form method="post" action="{{ route('inv_settings') }}">
@csrf
<a href="{{ route('inv_settings') }}" class="nav-link ml-3">
<p>{{ __("インボイス設定") }}</p>
</a>
</form>
</li>
</ul>
<li class="nav-item has-treeview"> <li class="nav-item has-treeview">
<a href="#" class="nav-link"> <a href="#" class="nav-link">
@ -390,38 +400,38 @@
</a> </a>
<ul class="nav nav-treeview"> <ul class="nav nav-treeview">
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('regular_types') }}" class="nav-link pl-4 @if(app('router')->is('regular_types')) active @endif"> <a href="{{ route('regular_types') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("定期種別マスタ") }}</p> <p class="mb-0">{{ __("定期種別マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('stations') }}" class="nav-link pl-4 @if(app('router')->is('stations')) active @endif"> <a href="{{ route('stations') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("近傍駅マスタ") }}</p> <p class="mb-0">{{ __("近傍駅マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('terms') }}" class="nav-link pl-4 @if(app('router')->is('terms')) active @endif"> <a href="{{ route('terms') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("利用契約マスタ") }}</p> <p class="mb-0">{{ __("利用契約マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('jurisdiction_parkings') }}" class="nav-link pl-4 @if(app('router')->is('jurisdiction_parkings')) active @endif"> <a href="{{ route('jurisdiction_parkings') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("管轄駐輪場マスタ") }}</p> <p class="mb-0">{{ __("管轄駐輪場マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('print_areas') }}" class="nav-link pl-4 @if(app('router')->is('print_areas')) active @endif"> <a href="{{ route('print_areas') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("シール印刷範囲マスタ") }}</p> <p class="mb-0">{{ __("シール印刷範囲マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('contract_allowable_cities') }}" class="nav-link pl-4 @if(app('router')->is('contract_allowable_cities')) active @endif"> <a href="{{ route('contract_allowable_cities') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("契約許容市区マスタ") }}</p> <p class="mb-0">{{ __("契約許容市区マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('managers') }}" class="nav-link pl-4 @if(app('router')->is('managers')) active @endif"> <a href="{{ route('managers') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("駐輪場管理者マスタ") }}</p> <p class="mb-0">{{ __("駐輪場管理者マスタ") }}</p>
</a> </a>
</li> </li>
@ -432,7 +442,7 @@
<li class="nav-item has-treeview"> <li class="nav-item has-treeview">
<a href="#" class="nav-link"> <a href="#" class="nav-link">
<i class="fa fa-credit-card nav-icon"></i> <i class="nav-icon fa fa-crop"></i>
<p> <p>
{{ __("決済マスタ") }} {{ __("決済マスタ") }}
<i class="right fa fa-angle-down"></i> <i class="right fa fa-angle-down"></i>
@ -440,18 +450,18 @@
</a> </a>
<ul class="nav nav-treeview"> <ul class="nav nav-treeview">
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('tax') }}" class="nav-link pl-4 @if(app('router')->is('tax')) active @endif"> <a href="{{ route('tax') }}" class="nav-link ml-3">
<p class="mb-0">{{ __('消費税マスタ') }}</p> <p class="mb-0">{{ __('消費税マスタ') }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('payments') }}" class="nav-link pl-4 @if(app('router')->is('payments')) active @endif"> <a href="{{ route('payments') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("決済情報マスタ") }}</p> <p class="mb-0">{{ __("決済情報マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('settlement_transactions') }}" class="nav-link pl-4 @if(app('router')->is('settlement_transactions')) active @endif"> <a href="{{ route('settlement_transactions') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("決済トランザクション") }}</p> <p class="mb-0">{{ __("決済トランザクション") }}</p>
</a> </a>
</li> </li>
@ -462,34 +472,36 @@
<a href="#" class="nav-link"> <a href="#" class="nav-link">
<i class="nav-icon fa fa-cog"></i> <i class="nav-icon fa fa-cog"></i>
<p> <p>
システムマスタ {{ __("システムマスタ") }}
<i class="right fa fa-angle-down"></i> <i class="right fa fa-angle-down"></i>
</p> </p>
</a> </a>
<ul class="nav nav-treeview"> <ul class="nav nav-treeview">
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('opes') }}" class="nav-link @if(app('router')->is('opes')) active @endif"> <a href="{{ route('opes') }}" class="nav-link ml-3">
<i class="fa fa-circle-o nav-icon"></i> <p class="mb-0">{{ __("オペレーターマスタ") }}</p>
<p>{{ __("オペレーターマスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('devices') }}" class="nav-link @if(app('router')->is('devices')) active @endif"> <a href="{{ route('devices') }}" class="nav-link ml-3">
<i class="fa fa-circle-o nav-icon"></i> <p class="mb-0">{{ __("デバイス管理マスタ") }}</p>
<p>{{ __("デバイス管理マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a href="{{ route('operator_ques') }}" class="nav-link @if(app('router')->is('operator_ques')) active @endif"> <a href="{{ route('operator_ques') }}" class="nav-link ml-3">
<i class="fa fa-circle-o nav-icon"></i> <p class="mb-0">{{ __("オペレーターキュー") }}</p>
<p>{{ __("オペレーターキュー") }}</p>
</a> </a>
</li><li class="nav-item"> </li>
<a href="{{ route('settings') }}" class="nav-link @if(app('router')->is('settings')) active @endif"> <li class="nav-item">
<i class="fa fa-circle-o nav-icon"></i> <a href="{{ route('settings') }}" class="nav-link ml-3">
<p>{{ __("設定マスタ") }}</p> <p class="mb-0">{{ __("設定マスタ") }}</p>
</a> </a>
</li> </li>
<li class="nav-item">
<a href="{{ route('mail_templates') }}" class="nav-link ml-3">
<p class="mb-0">{{ __("メール送信テンプレート") }}</p>
</a>
</li>
</ul> </ul>
</li> </li>

View File

@ -18,6 +18,8 @@ use App\Http\Controllers\Admin\OpeController;
use App\Http\Controllers\Admin\DeviceController; use App\Http\Controllers\Admin\DeviceController;
use App\Http\Controllers\Admin\OperatorQueController; use App\Http\Controllers\Admin\OperatorQueController;
use App\Http\Controllers\Admin\SettingController; use App\Http\Controllers\Admin\SettingController;
use App\Http\Controllers\Admin\MailTemplateController;
use App\Http\Controllers\Admin\InvSettingController;
/** /**
@ -244,57 +246,69 @@ Route::middleware('auth')->group(function () {
Route::get('/settlement_transactions/export', [SettlementTransactionController::class, 'export'])->name('settlement_transactions_export'); Route::get('/settlement_transactions/export', [SettlementTransactionController::class, 'export'])->name('settlement_transactions_export');
// [東京都|〇〇駐輪場] オペレーターマスタ // [東京都|〇〇駐輪場] オペレーターマスタ
Route::match(['get', 'post'], '/ope', [OpeController::class, 'list'])->name('opes'); Route::match(['get', 'post'], '/opes', [OpeController::class, 'list'])->name('opes');
Route::match(['get', 'post'], '/ope/add', [OpeController::class, 'add'])->name('opes_add'); Route::match(['get', 'post'], '/opes/add', [OpeController::class, 'add'])->name('opes_add');
Route::match(['get', 'post'], '/ope/edit/{id}', [OpeController::class, 'edit']) Route::match(['get', 'post'], '/opes/edit/{id}', [OpeController::class, 'edit'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('opes_edit'); ->name('opes_edit');
Route::get('/ope/info/{id}', [OpeController::class, 'info']) Route::get('/opes/info/{id}', [OpeController::class, 'info'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('opes_info'); ->name('opes_info');
Route::match(['get', 'post'], '/ope/delete', [OpeController::class, 'delete'])->name('opes_delete'); Route::match(['get', 'post'], '/opes/delete', [OpeController::class, 'delete'])->name('opes_delete');
Route::post('/ope/import', [OpeController::class, 'import'])->name('opes_import'); Route::post('/opes/import', [OpeController::class, 'import'])->name('opes_import');
Route::get('/ope/export', [OpeController::class, 'export'])->name('opes_export'); Route::get('/opes/export', [OpeController::class, 'export'])->name('opes_export');
// [東京都|〇〇駐輪場] デバイス管理マスタ // [東京都|〇〇駐輪場] デバイス管理マスタ
Route::match(['get', 'post'], '/device', [DeviceController::class, 'list'])->name('devices'); Route::match(['get', 'post'], '/devices', [DeviceController::class, 'list'])->name('devices');
Route::match(['get', 'post'], '/device/add', [DeviceController::class, 'add'])->name('devices_add'); Route::match(['get', 'post'], '/devices/add', [DeviceController::class, 'add'])->name('devices_add');
Route::match(['get', 'post'], '/device/edit/{id}', [DeviceController::class, 'edit']) Route::match(['get', 'post'], '/devices/edit/{id}', [DeviceController::class, 'edit'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('devices_edit'); ->name('devices_edit');
Route::get('/device/info/{id}', [DeviceController::class, 'info']) Route::get('/devices/info/{id}', [DeviceController::class, 'info'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('devices_info'); ->name('devices_info');
Route::match(['get', 'post'], '/device/delete', [DeviceController::class, 'delete'])->name('devices_delete'); Route::match(['get', 'post'], '/devices/delete', [DeviceController::class, 'delete'])->name('devices_delete');
Route::post('/device/import', [DeviceController::class, 'import'])->name('devices_import'); Route::post('/devices/import', [DeviceController::class, 'import'])->name('devices_import');
// [東京都|〇〇駐輪場] オペレーターキュー // [東京都|〇〇駐輪場] オペレーターキュー
Route::match(['get', 'post'], '/operator_que', [OperatorQueController::class, 'list'])->name('operator_ques'); Route::match(['get', 'post'], '/operator_ques', [OperatorQueController::class, 'list'])->name('operator_ques');
Route::match(['get', 'post'], '/operator_que/add', [OperatorQueController::class, 'add'])->name('operator_ques_add'); Route::match(['get', 'post'], '/operator_ques/add', [OperatorQueController::class, 'add'])->name('operator_ques_add');
Route::match(['get', 'post'], '/operator_que/edit/{id}', [OperatorQueController::class, 'edit']) Route::match(['get', 'post'], '/operator_ques/edit/{id}', [OperatorQueController::class, 'edit'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('operator_ques_edit'); ->name('operator_ques_edit');
Route::get('/operator_que/info/{id}', [OperatorQueController::class, 'info']) Route::get('/operator_ques/info/{id}', [OperatorQueController::class, 'info'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('operator_ques_info'); ->name('operator_ques_info');
Route::match(['get', 'post'], '/operator_que/delete', [OperatorQueController::class, 'delete'])->name('operator_ques_delete'); Route::match(['get', 'post'], '/operator_ques/delete', [OperatorQueController::class, 'delete'])->name('operator_ques_delete');
Route::post('/operator_que/import', [OperatorQueController::class, 'import'])->name('operator_ques_import'); Route::post('/operator_ques/import', [OperatorQueController::class, 'import'])->name('operator_ques_import');
Route::get('/operator_que/export', [OperatorQueController::class, 'export'])->name('operator_ques_export'); Route::get('/operator_ques/export', [OperatorQueController::class, 'export'])->name('operator_ques_export');
// [東京都|〇〇駐輪場] 設定マスタ // [東京都|〇〇駐輪場] 設定マスタ
Route::match(['get', 'post'], '/setting', [SettingController::class, 'list'])->name('settings'); Route::match(['get', 'post'], '/settings', [SettingController::class, 'list'])->name('settings');
Route::match(['get', 'post'], '/setting/add', [SettingController::class, 'add'])->name('settings_add'); Route::match(['get', 'post'], '/settings/add', [SettingController::class, 'add'])->name('settings_add');
Route::match(['get', 'post'], '/setting/edit/{id}', [SettingController::class, 'edit']) Route::match(['get', 'post'], '/settings/edit/{id}', [SettingController::class, 'edit'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('settings_edit'); ->name('settings_edit');
Route::get('/setting/info/{id}', [SettingController::class, 'info']) Route::get('/settings/info/{id}', [SettingController::class, 'info'])
->where(['id' => '[0-9]+']) ->where(['id' => '[0-9]+'])
->name('settings_info'); ->name('settings_info');
Route::match(['get', 'post'], '/setting/delete', [SettingController::class, 'delete'])->name('settings_delete'); Route::match(['get', 'post'], '/settings/delete', [SettingController::class, 'delete'])->name('settings_delete');
// [東京都|〇〇駐輪場] メール送信テンプレートマスタ
Route::match(['get', 'post'], '/mail_templates', [MailTemplateController::class, 'list'])->name('mail_templates');
Route::match(['get', 'post'], '/mail_templates/add', [MailTemplateController::class, 'add'])->name('mail_templates_add');
Route::match(['get', 'post'], '/mail_templates/edit/{id}', [MailTemplateController::class, 'edit'])
->where(['id' => '[0-9]+'])
->name('mail_templates_edit');
Route::get('/mail_templates/info/{id}', [MailTemplateController::class, 'info'])
->where(['id' => '[0-9]+'])
->name('mail_templates_info');
Route::match(['get', 'post'], '/mail_templates/delete', [MailTemplateController::class, 'delete'])->name('mail_templates_delete');
Route::post('/mail_templates/import', [MailTemplateController::class, 'import'])->name('mail_templates_import');
Route::get('/mail_templates/export', [MailTemplateController::class, 'export'])->name('mail_templates_export');
// [東京都|〇〇駐輪場] インボイス設定マスタ
Route::match(['get', 'post'], '/inv_settings', [InvSettingController::class, 'form'])->name('inv_settings');
Route::post('/inv_settings/save', [InvSettingController::class, 'save'])->name('inv_settings_save');
}); });