更新 app/Http/Controllers/Admin/RegularContractController.php
This commit is contained in:
parent
58c5835f5b
commit
a5af8ff78c
@ -2,407 +2,527 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Admin;
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
use App\Http\Requests\RegularContractRequest;
|
|
||||||
use App\Models\Park;
|
|
||||||
use App\Models\RegularContract;
|
|
||||||
use App\Models\User;
|
|
||||||
use App\Models\Usertype;
|
|
||||||
use App\Utils;
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Response;
|
|
||||||
|
|
||||||
class RegularContractController extends Controller
|
class RegularContractController
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* 定期契約一覧
|
||||||
|
* - ベース表: regular_contract(rc)
|
||||||
|
* - 付加情報: user(u), usertype(t), park(p)
|
||||||
|
* - 画面変数: $list, $sort, $sort_type(既存に合わせる)
|
||||||
|
*/
|
||||||
public function list(Request $request)
|
public function list(Request $request)
|
||||||
{
|
{
|
||||||
|
// ===== ソート(既定: contract_id DESC)=====
|
||||||
|
$sort = $request->input('sort', 'contract_id');
|
||||||
|
$sortType = strtolower($request->input('sort_type', 'desc')) === 'asc' ? 'asc' : 'desc';
|
||||||
|
|
||||||
$inputs = [
|
// ===== 絞り込み(テキスト系)=====
|
||||||
'isExport' => 0,
|
// フォームの name 属性と完全一致させる&既定値は空文字にして Blade が未定義にならないようにする
|
||||||
'sort' => $request->input('sort', ''),
|
$contract_qr_id = trim((string) $request->input('contract_qr_id', ''));
|
||||||
'sort_type' => $request->input('sort_type', ''),
|
$user_id = trim((string) $request->input('user_id', ''));
|
||||||
'page' => $request->get('page', 1),
|
$park_id = trim((string) $request->input('park_id', ''));
|
||||||
|
$user_phonetic = trim((string) $request->input('user_phonetic', '')); // フリガナ
|
||||||
|
$phone = trim((string) $request->input('phone', '')); // 電話(携帯/自宅)
|
||||||
|
$email = trim((string) $request->input('email', '')); // メール
|
||||||
|
$usertype_name_kw = trim((string) $request->input('usertype_name', '')); // 利用者分類名
|
||||||
|
$park_name_kw = trim((string) $request->input('park_name', '')); // 駐輪場名
|
||||||
|
|
||||||
|
// ===== 絞り込み(日付範囲)=====
|
||||||
|
$reserve_from = $request->input('reserve_date_from', '');
|
||||||
|
$reserve_to = $request->input('reserve_date_to', '');
|
||||||
|
$created_from = $request->input('contract_created_from', '');
|
||||||
|
$created_to = $request->input('contract_created_to', '');
|
||||||
|
$updated_from = $request->input('contract_updated_from', '');
|
||||||
|
$updated_to = $request->input('contract_updated_to', '');
|
||||||
|
$canceled_from = $request->input('contract_canceled_from', '');
|
||||||
|
$canceled_to = $request->input('contract_canceled_to', '');
|
||||||
|
|
||||||
|
// ===== 列挙(全て/0/1)=====
|
||||||
|
$contract_flag = $request->input('contract_flag', '');
|
||||||
|
$contract_permission = $request->input('contract_permission', '');
|
||||||
|
$tag_qr_flag = $request->input('tag_qr_flag', '');
|
||||||
|
$update_flag = $request->input('update_flag', '');
|
||||||
|
$contract_cancel_flag = $request->input('contract_cancel_flag', '');
|
||||||
|
|
||||||
|
// ===== クエリ(結合込み)=====
|
||||||
|
$q = DB::table('regular_contract as rc')
|
||||||
|
->leftJoin('user as u', 'u.user_id', '=', 'rc.user_id')
|
||||||
|
->leftJoin('usertype as t', 't.user_categoryid', '=', 'rc.user_categoryid')
|
||||||
|
->leftJoin('park as p', 'p.park_id', '=', 'rc.park_id')
|
||||||
|
->select([
|
||||||
|
// rc
|
||||||
|
'rc.contract_id',
|
||||||
|
'rc.contract_qr_id',
|
||||||
|
'rc.user_id',
|
||||||
|
'rc.user_categoryid',
|
||||||
|
'rc.reserve_id',
|
||||||
|
'rc.park_id',
|
||||||
|
'rc.price_parkplaceid',
|
||||||
|
'rc.user_securitynum',
|
||||||
|
'rc.reserve_date',
|
||||||
|
'rc.contract_reserve',
|
||||||
|
'rc.contract_created_at',
|
||||||
|
'rc.contract_updated_at',
|
||||||
|
'rc.contract_cancelday',
|
||||||
|
'rc.contract_flag',
|
||||||
|
'rc.contract_permission',
|
||||||
|
'rc.contract_cancel_flag',
|
||||||
|
'rc.tag_qr_flag',
|
||||||
|
'rc.update_flag',
|
||||||
|
'rc.park_position',
|
||||||
|
'rc.ope_id',
|
||||||
|
// user
|
||||||
|
'u.user_name',
|
||||||
|
'u.user_phonetic',
|
||||||
|
'u.user_mobile',
|
||||||
|
'u.user_homephone',
|
||||||
|
'u.user_primemail',
|
||||||
|
// usertype & park
|
||||||
|
DB::raw('t.print_name as usertype_name'),
|
||||||
|
DB::raw('p.park_name as park_name'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
// ===== LIKE / キーワード =====
|
||||||
|
if ($contract_qr_id !== '') {
|
||||||
|
$q->where('rc.contract_qr_id', 'like', "%{$contract_qr_id}%");
|
||||||
|
}
|
||||||
|
if ($user_id !== '') {
|
||||||
|
$q->where('rc.user_id', 'like', "%{$user_id}%");
|
||||||
|
}
|
||||||
|
if ($park_id !== '') {
|
||||||
|
$q->where('rc.park_id', 'like', "%{$park_id}%");
|
||||||
|
}
|
||||||
|
if ($user_phonetic !== '') {
|
||||||
|
$q->where('u.user_phonetic', 'like', "%{$user_phonetic}%");
|
||||||
|
}
|
||||||
|
if ($email !== '') {
|
||||||
|
$q->where('u.user_primemail', 'like', "%{$email}%");
|
||||||
|
}
|
||||||
|
if ($usertype_name_kw !== '') {
|
||||||
|
$q->where('t.print_name', 'like', "%{$usertype_name_kw}%");
|
||||||
|
}
|
||||||
|
if ($park_name_kw !== '') {
|
||||||
|
$q->where('p.park_name', 'like', "%{$park_name_kw}%");
|
||||||
|
}
|
||||||
|
if ($phone !== '') {
|
||||||
|
$q->where(function ($w) use ($phone) {
|
||||||
|
$w->where('u.user_mobile', 'like', "%{$phone}%")
|
||||||
|
->orWhere('u.user_homephone', 'like', "%{$phone}%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== 日付範囲 =====
|
||||||
|
if ($reserve_from) {
|
||||||
|
$q->whereDate('rc.reserve_date', '>=', $reserve_from);
|
||||||
|
}
|
||||||
|
if ($reserve_to) {
|
||||||
|
$q->whereDate('rc.reserve_date', '<=', $reserve_to);
|
||||||
|
}
|
||||||
|
if ($created_from) {
|
||||||
|
$q->whereDate('rc.contract_created_at', '>=', $created_from);
|
||||||
|
}
|
||||||
|
if ($created_to) {
|
||||||
|
$q->whereDate('rc.contract_created_at', '<=', $created_to);
|
||||||
|
}
|
||||||
|
if ($updated_from) {
|
||||||
|
$q->whereDate('rc.contract_updated_at', '>=', $updated_from);
|
||||||
|
}
|
||||||
|
if ($updated_to) {
|
||||||
|
$q->whereDate('rc.contract_updated_at', '<=', $updated_to);
|
||||||
|
}
|
||||||
|
if ($canceled_from) {
|
||||||
|
$q->whereDate('rc.contract_cancelday', '>=', $canceled_from);
|
||||||
|
}
|
||||||
|
if ($canceled_to) {
|
||||||
|
$q->whereDate('rc.contract_cancelday', '<=', $canceled_to);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== 列挙フィルタ =====
|
||||||
|
if ($contract_flag !== '') {
|
||||||
|
$q->where('rc.contract_flag', (int) $contract_flag);
|
||||||
|
}
|
||||||
|
if ($contract_permission !== '') {
|
||||||
|
$q->where('rc.contract_permission', (int) $contract_permission);
|
||||||
|
}
|
||||||
|
if ($tag_qr_flag !== '') {
|
||||||
|
$q->where('rc.tag_qr_flag', (int) $tag_qr_flag);
|
||||||
|
}
|
||||||
|
if ($update_flag !== '') {
|
||||||
|
$q->where('rc.update_flag', (int) $update_flag);
|
||||||
|
}
|
||||||
|
if ($contract_cancel_flag !== '') {
|
||||||
|
$q->where('rc.contract_cancel_flag', (int) $contract_cancel_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== ソート(仮想列は結合側にマッピング)=====
|
||||||
|
$sortable = [
|
||||||
|
'contract_id',
|
||||||
|
'contract_qr_id',
|
||||||
|
'user_id',
|
||||||
|
'user_categoryid',
|
||||||
|
'reserve_id',
|
||||||
|
'park_id',
|
||||||
|
'price_parkplaceid',
|
||||||
|
'user_securitynum',
|
||||||
|
'reserve_date',
|
||||||
|
'contract_reserve',
|
||||||
|
'contract_created_at',
|
||||||
|
'contract_updated_at',
|
||||||
|
'contract_cancelday',
|
||||||
|
'contract_flag',
|
||||||
|
'contract_permission',
|
||||||
|
'contract_cancel_flag',
|
||||||
|
'tag_qr_flag',
|
||||||
|
'update_flag',
|
||||||
|
'park_position',
|
||||||
|
'ope_id',
|
||||||
|
// 結合先の見出し列
|
||||||
|
'user_name',
|
||||||
|
'user_phonetic',
|
||||||
|
'user_mobile',
|
||||||
|
'user_homephone',
|
||||||
|
'user_primemail',
|
||||||
|
'usertype_name',
|
||||||
|
'park_name',
|
||||||
];
|
];
|
||||||
$inputs['list'] = RegularContract::search($inputs);
|
if (!in_array($sort, $sortable, true)) {
|
||||||
//dd($inputs['list']->items());
|
$sort = 'contract_id';
|
||||||
|
|
||||||
// dd($inputs);
|
|
||||||
if ($inputs['list']->total() > 0 && $inputs['page'] > $inputs['list']->lastPage()) {
|
|
||||||
return redirect()->route('regular_contracts');
|
|
||||||
}
|
}
|
||||||
return view('admin.regular_contracts.list', $inputs);
|
$sortMap = [
|
||||||
}
|
'user_name' => 'u.user_name',
|
||||||
|
'user_phonetic' => 'u.user_phonetic',
|
||||||
public function add(Request $request)
|
'user_mobile' => 'u.user_mobile',
|
||||||
{
|
'user_homephone' => 'u.user_homephone',
|
||||||
$inputs = [
|
'user_primemail' => 'u.user_primemail',
|
||||||
'contract_qr_id' => $request->input('contract_qr_id'), // 定期契約QRID
|
'usertype_name' => 't.print_name',
|
||||||
'user_id' => $request->input('user_id'), // 利用者ID
|
'park_name' => 'p.park_name',
|
||||||
'user_categoryid' => $request->input('user_categoryid'), // 利用者分類ID
|
|
||||||
'reserve_id' => $request->input('reserve_id'), // 定期予約ID
|
|
||||||
'park_id' => $request->input('park_id'), // 駐輪場ID
|
|
||||||
'price_parkplaceid' => $request->input('price_parkplaceid'), // 駐輪場所ID
|
|
||||||
'user_securitynum' => $request->input('user_securitynum'), // 防犯登録番号
|
|
||||||
'reserve_date' => $request->input('reserve_date'), // 予約日時
|
|
||||||
'contract_reserve' => $request->input('contract_reserve'), // 予約移行フラグ
|
|
||||||
'contract_created_at' => $request->input('contract_created_at'), // 契約日時
|
|
||||||
'contract_updated_at' => $request->input('contract_updated_at'), // 更新可能日
|
|
||||||
'contract_cancelday' => $request->input('contract_cancelday'), // 解約日時
|
|
||||||
'contract_reduction' => $request->input('contract_reduction'), // 減免措置
|
|
||||||
'contract_periods' => $request->input('contract_periods'), // 有効期間S
|
|
||||||
'contract_periode' => $request->input('contract_periode'), // 有効期間E
|
|
||||||
'contract_taxid' => $request->input('contract_taxid'), // 消費税ID
|
|
||||||
'billing_amount' => $request->input('billing_amount'), // 請求金額
|
|
||||||
'contract_payment_day' => $request->input('contract_payment_day'), // 授受日時
|
|
||||||
'contract_money' => $request->input('contract_money'), // 授受金額
|
|
||||||
'refunds' => $request->input('refunds'), // 解約時返戻金
|
|
||||||
'refunds_comment' => $request->input('refunds_comment'), // 返戻金付随情報
|
|
||||||
'repayment_at' => $request->input('repayment_at'), // 返金日
|
|
||||||
'contact_guid' => $request->input('contact_guid'), // 決済コード
|
|
||||||
'contact_shop_code' => $request->input('contact_shop_code'), // 店舗コード
|
|
||||||
'contract_cvs_class' => $request->input('contract_cvs_class'), // 授受種別
|
|
||||||
'contract_flag' => $request->input('contract_flag'), // 授受フラグ
|
|
||||||
'settlement_transaction_id' => $request->input('settlement_transaction_id'), // 決済トランザクションID
|
|
||||||
'contract_seal_issue' => $request->input('contract_seal_issue'), // シール発行数
|
|
||||||
'seal_reissue_request' => $request->input('seal_reissue_request'), // シール再発行リクエスト
|
|
||||||
'contract_permission' => $request->input('contract_permission'), // シール発行許可
|
|
||||||
'contract_cancel_flag' => $request->input('contract_cancel_flag'), // 解約フラグ
|
|
||||||
'tag_qr_flag' => $request->input('tag_qr_flag'), // タグ/QRフラグ
|
|
||||||
'tag_change_flag' => $request->input('tag_change_flag'), // オペレータータグ変更フラグ
|
|
||||||
'park_position' => $request->input('park_position'), // 駐輪位置番号
|
|
||||||
'ope_id' => $request->input('ope_id'), // オペレータID
|
|
||||||
'contract_manual' => $request->input('contract_manual'), // 手動通知
|
|
||||||
'contract_notice' => $request->input('contract_notice'), // 通知方法
|
|
||||||
'contract_payment_number' => $request->input('contract_payment_number'), // 受付番号
|
|
||||||
'created_at' => $request->input('created_at'),
|
|
||||||
'updated_at' => $request->input('updated_at'),
|
|
||||||
];
|
];
|
||||||
$dataList = $this->getDataDropList();
|
$sortColumn = $sortMap[$sort] ?? ('rc.' . $sort);
|
||||||
$inputs = array_merge($inputs, $dataList);
|
|
||||||
if ($request->isMethod('POST')) {
|
|
||||||
$type = false;
|
|
||||||
$validation = new RegularContractRequest();
|
|
||||||
$rules = $validation->rules();
|
|
||||||
if(!empty($inputs['billing_amount']) ){
|
|
||||||
$rules['billing_amount'] = 'numeric|between:0,999999999999.99';
|
|
||||||
}
|
|
||||||
if(!empty($inputs['contract_money']) ){
|
|
||||||
$rules['contract_money'] = 'numeric|between:0,999999999999.99';
|
|
||||||
}
|
|
||||||
if(!empty($inputs['user_aid']) ){
|
|
||||||
$rules['refunds'] ='numeric|between:0,999999999999.99';
|
|
||||||
}
|
|
||||||
if(!empty($inputs['settlement_transaction_id']) ){
|
|
||||||
$rules['settlement_transaction_id'] = 'integer';
|
|
||||||
}
|
|
||||||
if(!empty($inputs['contract_seal_issue']) ){
|
|
||||||
$rules['contract_seal_issue'] = 'integer';
|
|
||||||
}
|
|
||||||
if(!empty($inputs['ope_id']) ){
|
|
||||||
$rules['ope_id'] = 'integer';
|
|
||||||
}
|
|
||||||
$validator = Validator::make($request->all(), $rules, $validation->messages());
|
|
||||||
if (!$validator->fails()) {
|
|
||||||
\DB::transaction(function () use ($inputs, &$type) {
|
|
||||||
$new = new RegularContract();
|
|
||||||
$new->fill($inputs);
|
|
||||||
if ($new->save()) {
|
|
||||||
$type = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
$list = $q->orderBy($sortColumn, $sortType)->paginate(50);
|
||||||
if ($type) {
|
|
||||||
$request->session()->flash('success', __('新しい成功を創造する。'));
|
|
||||||
return redirect()->route('regular_contracts');
|
|
||||||
} else {
|
|
||||||
$request->session()->flash('error', __('新しい作成に失敗しました'));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$inputs['errorMsg'] = $this->__buildErrorMessasges($validator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return view('admin.regular_contracts.add', $inputs);
|
// ===== 画面へ(Blade 側が参照するすべての変数を渡す)=====
|
||||||
|
return view('admin.regularcontracts.list', [
|
||||||
|
'list' => $list,
|
||||||
|
'sort' => $sort,
|
||||||
|
'sort_type' => $sortType,
|
||||||
|
|
||||||
|
// 入力保持(テキスト)
|
||||||
|
'contract_qr_id' => $contract_qr_id,
|
||||||
|
'user_id' => $user_id,
|
||||||
|
'park_id' => $park_id,
|
||||||
|
'user_phonetic' => $user_phonetic,
|
||||||
|
'phone' => $phone,
|
||||||
|
'email' => $email,
|
||||||
|
'usertype_name' => $usertype_name_kw,
|
||||||
|
'park_name' => $park_name_kw,
|
||||||
|
|
||||||
|
// 入力保持(日付)
|
||||||
|
'reserve_date_from' => $reserve_from,
|
||||||
|
'reserve_date_to' => $reserve_to,
|
||||||
|
'contract_created_from' => $created_from,
|
||||||
|
'contract_created_to' => $created_to,
|
||||||
|
'contract_updated_from' => $updated_from,
|
||||||
|
'contract_updated_to' => $updated_to,
|
||||||
|
'contract_canceled_from' => $canceled_from,
|
||||||
|
'contract_canceled_to' => $canceled_to,
|
||||||
|
|
||||||
|
// 入力保持(列挙)
|
||||||
|
'contract_flag' => $contract_flag,
|
||||||
|
'contract_permission' => $contract_permission,
|
||||||
|
'tag_qr_flag' => $tag_qr_flag,
|
||||||
|
'update_flag' => $update_flag,
|
||||||
|
'contract_cancel_flag' => $contract_cancel_flag,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(Request $request, $contract_id, $view = '')
|
/**
|
||||||
|
* 定期契約編集(GET: 画面表示 / POST: 更新実行)
|
||||||
|
* - 主キー: contract_id
|
||||||
|
*/
|
||||||
|
public function edit(Request $request, $id)
|
||||||
{
|
{
|
||||||
$regular_contract = RegularContract::getByPk($contract_id);
|
$id = (int) $id;
|
||||||
if (empty($contract_id) || empty($regular_contract)) {
|
|
||||||
abort('404');
|
if ($request->isMethod('get')) {
|
||||||
|
$row = DB::table('regular_contract')->where('contract_id', $id)->first();
|
||||||
|
if (!$row) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
return view('admin.regularcontracts.edit', [
|
||||||
|
'row' => $row,
|
||||||
|
'contract_id' => $id,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
$data = $regular_contract->getAttributes();
|
|
||||||
$dataList = $this->getDataDropList();
|
$v = Validator::make($request->all(), [
|
||||||
$data = array_merge($data, $dataList);
|
'user_id' => ['required', 'integer'],
|
||||||
if ($request->isMethod('POST')) {
|
'park_id' => ['required', 'integer'],
|
||||||
$type = false;
|
// 任意項目
|
||||||
$inputs = $request->all();
|
'contract_qr_id' => ['nullable', 'string', 'max:255'],
|
||||||
$validation = new RegularContractRequest();
|
'user_categoryid' => ['nullable', 'integer'],
|
||||||
$rules = $validation->rules();
|
'reserve_id' => ['nullable', 'integer'],
|
||||||
if(!empty($inputs['billing_amount']) ){
|
'price_parkplaceid' => ['nullable', 'integer'],
|
||||||
$rules['billing_amount'] = 'numeric|between:0,999999999999.99';
|
'user_securitynum' => ['nullable', 'string', 'max:255'],
|
||||||
}
|
'reserve_date' => ['nullable', 'date'],
|
||||||
if(!empty($inputs['contract_money']) ){
|
'contract_reserve' => ['nullable', 'string', 'max:255'],
|
||||||
$rules['contract_money'] = 'numeric|between:0,999999999999.99';
|
'contract_created_at' => ['nullable', 'date'],
|
||||||
}
|
'contract_updated_at' => ['nullable', 'date'],
|
||||||
if(!empty($inputs['user_aid']) ){
|
'contract_cancelday' => ['nullable', 'date'],
|
||||||
$rules['refunds'] ='numeric|between:0,999999999999.99';
|
'contract_flag' => ['nullable', 'integer'],
|
||||||
}
|
'contract_permission' => ['nullable', 'integer'],
|
||||||
if(!empty($inputs['settlement_transaction_id']) ){
|
'contract_cancel_flag' => ['nullable', 'integer'],
|
||||||
$rules['settlement_transaction_id'] = 'integer';
|
'tag_qr_flag' => ['nullable', 'integer'],
|
||||||
}
|
'park_position' => ['nullable', 'string', 'max:255'],
|
||||||
if(!empty($inputs['contract_seal_issue']) ){
|
'ope_id' => ['nullable', 'integer'],
|
||||||
$rules['contract_seal_issue'] = 'integer';
|
]);
|
||||||
}
|
|
||||||
if(!empty($inputs['ope_id']) ){
|
if ($v->fails()) {
|
||||||
$rules['ope_id'] = 'integer';
|
return back()->withErrors($v)->withInput();
|
||||||
}
|
|
||||||
$validator = Validator::make($inputs, $rules, $validation->messages());
|
|
||||||
$data = array_merge($data, $inputs);
|
|
||||||
if (!$validator->fails()) {
|
|
||||||
\DB::transaction(function () use ($data, &$type, $regular_contract) {
|
|
||||||
$regular_contract->fill($data);
|
|
||||||
$regular_contract->save();
|
|
||||||
$type = true;
|
|
||||||
});
|
|
||||||
if ($type) {
|
|
||||||
$request->session()->flash('success', __('更新に成功しました'));
|
|
||||||
return redirect()->route('regular_contracts');
|
|
||||||
} else {
|
|
||||||
$request->session()->flash('error', __('更新に失敗しました'));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$data['errorMsg'] = $this->__buildErrorMessasges($validator);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if ($view != '') {
|
|
||||||
return view($view, $data);
|
$data = [
|
||||||
}
|
'contract_qr_id' => $request->input('contract_qr_id'),
|
||||||
return view('admin.regular_contracts.edit', $data);
|
'user_id' => (int) $request->input('user_id'),
|
||||||
|
'user_categoryid' => $request->input('user_categoryid'),
|
||||||
|
'reserve_id' => $request->input('reserve_id'),
|
||||||
|
'park_id' => (int) $request->input('park_id'),
|
||||||
|
'price_parkplaceid' => $request->input('price_parkplaceid'),
|
||||||
|
'user_securitynum' => $request->input('user_securitynum'),
|
||||||
|
'reserve_date' => $request->input('reserve_date'),
|
||||||
|
'contract_reserve' => $request->input('contract_reserve'),
|
||||||
|
'contract_created_at' => $request->input('contract_created_at'),
|
||||||
|
'contract_updated_at' => $request->input('contract_updated_at'),
|
||||||
|
'contract_cancelday' => $request->input('contract_cancelday'),
|
||||||
|
'contract_flag' => $request->input('contract_flag'),
|
||||||
|
'contract_permission' => $request->input('contract_permission'),
|
||||||
|
'contract_cancel_flag' => $request->input('contract_cancel_flag'),
|
||||||
|
'tag_qr_flag' => $request->input('tag_qr_flag'),
|
||||||
|
'park_position' => $request->input('park_position'),
|
||||||
|
'ope_id' => $request->input('ope_id'),
|
||||||
|
'updated_at' => now(),
|
||||||
|
];
|
||||||
|
|
||||||
|
DB::table('regular_contract')->where('contract_id', $id)->update($data);
|
||||||
|
|
||||||
|
return redirect()->route('regularcontracts')->with('success', '定期契約を更新しました。');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定期契約削除
|
||||||
|
* - 物理削除(必要なら cancel フラグ運用に切替)
|
||||||
|
*/
|
||||||
public function delete(Request $request)
|
public function delete(Request $request)
|
||||||
{
|
{
|
||||||
$arr_pk = $request->get('pk');
|
$id = (int) $request->input('id');
|
||||||
if ($arr_pk) {
|
DB::table('regular_contract')->where('contract_id', $id)->delete();
|
||||||
if (RegularContract::deleteByPk($arr_pk)) {
|
|
||||||
return redirect()->route('regular_contracts')->with('success', __("削除が完了しました。"));
|
// 例:論理削除運用にする場合(必要なら運用側で切替)
|
||||||
} else {
|
// DB::table('regular_contract')->where('contract_id', $id)->update([
|
||||||
return redirect()->route('regular_contracts')->with('error', __('削除に失敗しました。'));
|
// 'contract_cancel_flag' => 1,
|
||||||
}
|
// 'contract_cancelday' => now(),
|
||||||
|
// 'updated_at' => now(),
|
||||||
|
// ]);
|
||||||
|
|
||||||
|
return redirect()->route('regularcontracts')->with('success', '定期契約を削除しました。');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定期契約インポート(仮実装)
|
||||||
|
*/
|
||||||
|
public function import(Request $request)
|
||||||
|
{
|
||||||
|
if ($request->isMethod('get')) {
|
||||||
|
// GET で来たら一覧へ
|
||||||
|
return redirect()->route('regularcontracts');
|
||||||
}
|
}
|
||||||
return redirect()->route('regular_contracts')->with('error', __('削除するユーザーを選択してください。'));
|
|
||||||
|
// ファイル必須 & 形式チェック
|
||||||
|
$request->validate([
|
||||||
|
'file' => ['required', 'file', 'mimetypes:text/plain,text/csv,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
|
||||||
|
], [], [
|
||||||
|
'file' => 'インポートファイル',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$file = $request->file('file');
|
||||||
|
|
||||||
|
// TODO: ここで実際のインポート処理(CSV/XLSXの解析とレコード登録)を書く
|
||||||
|
// 例:Storage::putFile('imports', $file); で一旦保存してバッチに回す etc.
|
||||||
|
|
||||||
|
return redirect()->route('regularcontracts')->with('success', 'インポートを受け付けました。');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function info(Request $request, $contract_id)
|
|
||||||
{
|
|
||||||
return $this->edit($request, $contract_id, 'admin.regular_contracts.info');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDataDropList()
|
|
||||||
{
|
|
||||||
$data['users'] = User::getList();
|
|
||||||
$data['listUserType'] = Usertype::getList();
|
|
||||||
$data['park'] = Park::getList();
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定期契約エクスポート(仮実装)
|
||||||
|
* - 現時点では何もしません。ルーティング確認用のプレーンテキストを返します。
|
||||||
|
* - 後で CSV / Excel 出力処理に置き換えてください。
|
||||||
|
*/
|
||||||
|
|
||||||
public function export(Request $request)
|
public function export(Request $request)
|
||||||
{
|
{
|
||||||
|
// ── 出力タイプ(通常 / SMBC / 役所) ──────────────────────────────
|
||||||
|
$type = $request->query('type'); // null | smbc | city
|
||||||
|
|
||||||
$headers = array(
|
// ── 出力ファイル名 ───────────────────────────────────────────────
|
||||||
"Content-type" => "text/csv;charset=UTF-8",
|
$downloadName = '定期契約マスタ.csv';
|
||||||
'Content-Encoding: UTF-8',
|
if ($type === 'smbc')
|
||||||
"Content-Disposition" => "attachment; filename=file.csv",
|
$downloadName = '定期契約マスタ_SMBC.csv';
|
||||||
"Pragma" => "no-cache",
|
if ($type === 'city')
|
||||||
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
|
$downloadName = '定期契約マスタ_役所提出用.csv';
|
||||||
"Expires" => "0"
|
|
||||||
|
// ── 生成先(storage/app/tmp 配下の一時ファイル) ─────────────────
|
||||||
|
$tmpDir = storage_path('app/tmp');
|
||||||
|
if (!is_dir($tmpDir)) {
|
||||||
|
@mkdir($tmpDir, 0755, true);
|
||||||
|
}
|
||||||
|
$tmpPath = $tmpDir . '/' . uniqid('regularcontracts_', true) . '.csv';
|
||||||
|
|
||||||
|
// ── CSV を作成(Excel を考慮し UTF-8 BOM を付与) ───────────────
|
||||||
|
$fp = fopen($tmpPath, 'w+');
|
||||||
|
if ($fp === false) {
|
||||||
|
abort(500, 'CSV一時ファイルを作成できませんでした。');
|
||||||
|
}
|
||||||
|
// Excel 対策:BOM
|
||||||
|
fwrite($fp, "\xEF\xBB\xBF");
|
||||||
|
|
||||||
|
// ヘッダー行(必要に応じて列を増減)
|
||||||
|
fputcsv($fp, ['定期契約ID', '利用者ID', '駐輪場ID', '契約日時']);
|
||||||
|
|
||||||
|
// ── データ取得(大量件数に備え chunk で分割取得) ────────────────
|
||||||
|
// ※ list() と同等の JOIN/SELECT を最低限に簡略化
|
||||||
|
DB::table('regular_contract as rc')
|
||||||
|
->leftJoin('user as u', 'u.user_id', '=', 'rc.user_id')
|
||||||
|
->orderBy('rc.contract_id', 'asc')
|
||||||
|
->select([
|
||||||
|
'rc.contract_qr_id',
|
||||||
|
'rc.user_id',
|
||||||
|
'rc.park_id',
|
||||||
|
'rc.contract_created_at',
|
||||||
|
])
|
||||||
|
->chunk(1000, function ($rows) use ($fp) {
|
||||||
|
foreach ($rows as $r) {
|
||||||
|
fputcsv($fp, [
|
||||||
|
$r->contract_qr_id,
|
||||||
|
$r->user_id,
|
||||||
|
$r->park_id,
|
||||||
|
$r->contract_created_at,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
// ── ダウンロードレスポンス(送信後に一時ファイル削除) ────────────
|
||||||
|
return response()->download(
|
||||||
|
$tmpPath,
|
||||||
|
$downloadName,
|
||||||
|
[
|
||||||
|
'Content-Type' => 'text/csv; charset=UTF-8',
|
||||||
|
'Content-Disposition' => 'attachment; filename="' . $downloadName . '"',
|
||||||
|
'Pragma' => 'no-cache',
|
||||||
|
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
|
||||||
|
'Expires' => '0',
|
||||||
|
]
|
||||||
|
)->deleteFileAfterSend(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 追加:新規登録(GET: 画面表示 / POST: 登録実行)
|
||||||
|
public function add(Request $request)
|
||||||
|
{
|
||||||
|
// 画面表示
|
||||||
|
if ($request->isMethod('get')) {
|
||||||
|
return view('admin.regularcontracts.add');
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========= バリデーション =========
|
||||||
|
// ※ 必須最小限。その他は任意(nullable)
|
||||||
|
$v = Validator::make(
|
||||||
|
$request->all(),
|
||||||
|
[
|
||||||
|
'user_id' => ['required', 'integer'],
|
||||||
|
'park_id' => ['required', 'integer'],
|
||||||
|
'contract_qr_id' => ['nullable', 'string', 'max:255'],
|
||||||
|
'user_categoryid' => ['nullable', 'integer'],
|
||||||
|
'reserve_id' => ['nullable', 'integer'],
|
||||||
|
'price_parkplaceid' => ['nullable', 'integer'],
|
||||||
|
'reserve_date' => ['nullable', 'date'],
|
||||||
|
'contract_created_at' => ['nullable', 'date'],
|
||||||
|
'contract_cancelday' => ['nullable', 'date'],
|
||||||
|
'contract_permission' => ['nullable', 'integer'],
|
||||||
|
'contract_cancel_flag' => ['nullable', 'integer'],
|
||||||
|
'tag_qr_flag' => ['nullable', 'integer'],
|
||||||
|
'update_flag' => ['nullable', 'integer'],
|
||||||
|
'park_position' => ['nullable', 'string', 'max:255'],
|
||||||
|
'ope_id' => ['nullable', 'integer'],
|
||||||
|
// 画面の「定期有効月数」は DB の contract_valid_months に保存する
|
||||||
|
'enable_months' => ['nullable', 'integer', 'min:0'],
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
'user_id' => '利用者ID',
|
||||||
|
'park_id' => '駐輪場ID',
|
||||||
|
'contract_qr_id' => '定期契約QRID',
|
||||||
|
'user_categoryid' => '利用者分類ID',
|
||||||
|
'reserve_id' => '定期予約ID',
|
||||||
|
'price_parkplaceid' => '駐輪場所ID',
|
||||||
|
'reserve_date' => '予約日時',
|
||||||
|
'contract_created_at' => '契約日時',
|
||||||
|
'contract_cancelday' => '解約日時',
|
||||||
|
'contract_permission' => 'シール発行許可',
|
||||||
|
'contract_cancel_flag' => '解約フラグ',
|
||||||
|
'tag_qr_flag' => 'タグ・QR',
|
||||||
|
'update_flag' => '(更新元)契約更新済フラグ',
|
||||||
|
'park_position' => '駐輪位置番号',
|
||||||
|
'ope_id' => 'オペレータID',
|
||||||
|
'enable_months' => '定期有効月数',
|
||||||
|
]
|
||||||
);
|
);
|
||||||
$inputs = [
|
|
||||||
'isMethodPost' => 0,
|
|
||||||
'isExport' => 1,
|
|
||||||
'sort' => $request->input('sort', ''),
|
|
||||||
'sort_type' => $request->input('sort_type', ''),
|
|
||||||
|
|
||||||
|
if ($v->fails()) {
|
||||||
|
return back()->withErrors($v)->withInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========= 登録データ作成 =========
|
||||||
|
// ここでは「regular_contract」テーブルに確実にある列を中心に保存します。
|
||||||
|
// 追加したい列があれば、同様にキーを増やして下さい。
|
||||||
|
$data = [
|
||||||
|
'contract_qr_id' => $request->input('contract_qr_id'),
|
||||||
|
'user_id' => (int) $request->input('user_id'),
|
||||||
|
'user_categoryid' => $request->input('user_categoryid'),
|
||||||
|
'reserve_id' => $request->input('reserve_id'),
|
||||||
|
'park_id' => (int) $request->input('park_id'),
|
||||||
|
'price_parkplaceid' => $request->input('price_parkplaceid'),
|
||||||
|
'reserve_date' => $request->input('reserve_date'),
|
||||||
|
'contract_created_at' => $request->input('contract_created_at') ?: now(), // 未指定なら現在時刻
|
||||||
|
'contract_cancelday' => $request->input('contract_cancelday'),
|
||||||
|
'contract_permission' => $request->input('contract_permission'),
|
||||||
|
'contract_cancel_flag' => $request->input('contract_cancel_flag'),
|
||||||
|
'tag_qr_flag' => $request->input('tag_qr_flag'),
|
||||||
|
'update_flag' => $request->input('update_flag'),
|
||||||
|
'park_position' => $request->input('park_position'),
|
||||||
|
'ope_id' => $request->input('ope_id'),
|
||||||
|
// 画面の enable_months → DB の contract_valid_months
|
||||||
|
'contract_valid_months' => $request->input('enable_months'),
|
||||||
|
'created_at' => now(),
|
||||||
|
'updated_at' => now(),
|
||||||
];
|
];
|
||||||
|
|
||||||
$dataExport = RegularContract::search($inputs);
|
DB::table('regular_contract')->insert($data);
|
||||||
$columns = array(
|
|
||||||
__('定期契約ID'),
|
return redirect()
|
||||||
__('定期契約QRID'),// 1
|
->route('regularcontracts')
|
||||||
__('利用者ID'),// 2
|
->with('success', '定期契約を登録しました。');
|
||||||
__('利用者分類ID'),// 3
|
|
||||||
__('定期予約ID'),// 4
|
|
||||||
__('駐輪場ID'),// 5
|
|
||||||
__('駐輪場所ID'),// 6
|
|
||||||
__('防犯登録番号'),// 7
|
|
||||||
__('予約日時'),// 8
|
|
||||||
__('予約移行フラグ'),// 9
|
|
||||||
__('契約日時'),// 10
|
|
||||||
__('更新可能日'),// 11
|
|
||||||
__('解約日時'),// 12
|
|
||||||
__('減免措置'),// 13
|
|
||||||
__('有効期間S'),// 14
|
|
||||||
__('有効期間E'),// 15
|
|
||||||
__('消費税ID'),// 16
|
|
||||||
__('請求金額'),// 17
|
|
||||||
__('授受日時'),// 18
|
|
||||||
__('授受金額'),// 19
|
|
||||||
__('解約時返戻金'),// 20
|
|
||||||
__('返戻金付随情報'),// 21
|
|
||||||
__('返金日'),// 22
|
|
||||||
__('決済コード'),// 23
|
|
||||||
__('店舗コード'),// 24
|
|
||||||
__('授受種別'),// 25
|
|
||||||
__('授受フラグ'),// 26
|
|
||||||
__('決済トランザクションID'),// 27
|
|
||||||
__('シール発行数'),// 28
|
|
||||||
__('シール再発行リクエスト'),// 29
|
|
||||||
__('シール発行許可'),// 30
|
|
||||||
__('解約フラグ'),// 31
|
|
||||||
__('タグ/QRフラグ'),// 32
|
|
||||||
__('オペレータータグ変更フラグ'),// 33
|
|
||||||
__('駐輪位置番号'),// 34
|
|
||||||
__('オペレータID'),// 35
|
|
||||||
__('手動通知'),// 36
|
|
||||||
__('通知方法'),// 37
|
|
||||||
__('受付番号'),// 38
|
|
||||||
);
|
|
||||||
$filename = "定期契約マスタ.csv";
|
|
||||||
$file = fopen($filename, 'w+');
|
|
||||||
fputcsv($file, $columns);
|
|
||||||
foreach ($dataExport as $items) {
|
|
||||||
fputcsv($file, array(
|
|
||||||
$items->contract_id, // 0
|
|
||||||
$items->contract_qr_id, // 1
|
|
||||||
$items->user_id, // 2
|
|
||||||
$items->user_categoryid, // 3
|
|
||||||
$items->reserve_id, // 4
|
|
||||||
$items->park_id, // 5
|
|
||||||
$items->price_parkplaceid, // 6
|
|
||||||
$items->user_securitynum, // 7
|
|
||||||
$items->reserve_date, // 8
|
|
||||||
$items->contract_reserve, // 9
|
|
||||||
$items->contract_created_at, // 10
|
|
||||||
$items->contract_updated_at, // 11
|
|
||||||
$items->contract_cancelday, // 12
|
|
||||||
$items->contract_reduction, // 13
|
|
||||||
$items->contract_periods, // 14
|
|
||||||
$items->contract_periode, // 15
|
|
||||||
$items->contract_taxid, // 16
|
|
||||||
$items->billing_amount, // 17
|
|
||||||
$items->contract_payment_day, // 18
|
|
||||||
$items->contract_money, // 19
|
|
||||||
$items->refunds, // 20
|
|
||||||
$items->refunds_comment, // 21
|
|
||||||
$items->repayment_at, // 22
|
|
||||||
$items->contact_guid, // 23
|
|
||||||
$items->contact_shop_code, // 24
|
|
||||||
$items->contract_cvs_class, // 25
|
|
||||||
$items->contract_flag, // 26
|
|
||||||
$items->settlement_transaction_id, // 27
|
|
||||||
$items->contract_seal_issue, // 28
|
|
||||||
$items->seal_reissue_request, // 29
|
|
||||||
$items->contract_permission, // 30
|
|
||||||
$items->contract_cancel_flag, // 31
|
|
||||||
$items->tag_qr_flag, // 32
|
|
||||||
$items->tag_change_flag, // 33
|
|
||||||
$items->park_position, // 34
|
|
||||||
$items->ope_id, // 35
|
|
||||||
$items->contract_manual, // 36
|
|
||||||
$items->contract_notice, // 37
|
|
||||||
$items->contract_payment_number, // 38
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
fclose($file);
|
|
||||||
return Response::download($filename, $filename, $headers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function import(Request $request)
|
|
||||||
{
|
|
||||||
$file = $request->file('file');
|
}
|
||||||
if (!empty($file)) {
|
|
||||||
$data = Utils::csvToArray($file);
|
|
||||||
$type = 1;
|
|
||||||
$msg = '';
|
|
||||||
$record = 0;
|
|
||||||
DB::beginTransaction();
|
|
||||||
try {
|
|
||||||
RegularContract::query()->delete();
|
|
||||||
$col = 39;
|
|
||||||
foreach ($data as $key => $items) {
|
|
||||||
$record = $key + 2;
|
|
||||||
if (count($items) == $col) {
|
|
||||||
$row = new RegularContract();
|
|
||||||
$row->contract_id = $items[0];
|
|
||||||
$row->contract_qr_id = $items[1];
|
|
||||||
$row->user_id = $items[2];
|
|
||||||
$row->user_categoryid = $items[3];
|
|
||||||
$row->reserve_id = $items[4];
|
|
||||||
$row->park_id = $items[5];
|
|
||||||
$row->price_parkplaceid = $items[6];
|
|
||||||
$row->user_securitynum = $items[7];
|
|
||||||
$row->reserve_date = $items[8];
|
|
||||||
$row->contract_reserve = $items[9];
|
|
||||||
$row->contract_created_at = $items[10];
|
|
||||||
$row->contract_updated_at = $items[11];
|
|
||||||
$row->contract_cancelday = $items[12];
|
|
||||||
$row->contract_reduction = $items[13];
|
|
||||||
$row->contract_periods = $items[14];
|
|
||||||
$row->contract_periode = $items[15];
|
|
||||||
$row->contract_taxid = $items[16];
|
|
||||||
$row->billing_amount = $items[17];
|
|
||||||
$row->contract_payment_day = $items[18];
|
|
||||||
$row->contract_money = $items[19];
|
|
||||||
$row->refunds = $items[20];
|
|
||||||
$row->refunds_comment = $items[21];
|
|
||||||
$row->repayment_at = $items[22];
|
|
||||||
$row->contact_guid = $items[23];
|
|
||||||
$row->contact_shop_code = $items[24];
|
|
||||||
$row->contract_cvs_class = $items[25];
|
|
||||||
$row->contract_flag = $items[26];
|
|
||||||
$row->settlement_transaction_id = $items[27];
|
|
||||||
$row->contract_seal_issue = $items[28];
|
|
||||||
$row->seal_reissue_request = $items[29];
|
|
||||||
$row->contract_permission = $items[30];
|
|
||||||
$row->contract_cancel_flag = $items[31];
|
|
||||||
$row->tag_qr_flag = $items[32];
|
|
||||||
$row->tag_change_flag = $items[33];
|
|
||||||
$row->park_position = $items[34];
|
|
||||||
$row->ope_id = $items[35];
|
|
||||||
$row->contract_manual = $items[36];
|
|
||||||
$row->contract_notice = $items[37];
|
|
||||||
$row->contract_payment_number = $items[38];
|
|
||||||
if (!$row->save()) {
|
|
||||||
$type = 0;
|
|
||||||
$msg = '行:record型が一致しません。';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$type = 0;
|
|
||||||
$msg = '行:record列数が一致しません。';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
dd($e);
|
|
||||||
$msg = '行:record型が一致しません。';
|
|
||||||
$type = 0;
|
|
||||||
}
|
|
||||||
if ($type) {
|
|
||||||
DB::commit();
|
|
||||||
return redirect()->route('regular_contracts')->with('success', __('輸入成功'));
|
|
||||||
} else {
|
|
||||||
DB::rollBack();
|
|
||||||
return redirect()->route('regular_contracts')->with('error', __($msg, ['record' => $record]));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return redirect()->route('regular_contracts')->with('error', __('あなたはcsvファイルを選択していません。'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user