From a5af8ff78c3985881258749d601947969dd5b84c Mon Sep 17 00:00:00 2001 From: gitadmin Date: Sat, 23 Aug 2025 00:08:58 +0900 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20app/Http/Controllers/Admin?= =?UTF-8?q?/RegularContractController.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/RegularContractController.php | 854 ++++++++++-------- 1 file changed, 487 insertions(+), 367 deletions(-) diff --git a/app/Http/Controllers/Admin/RegularContractController.php b/app/Http/Controllers/Admin/RegularContractController.php index a5d05cd..17a5a55 100644 --- a/app/Http/Controllers/Admin/RegularContractController.php +++ b/app/Http/Controllers/Admin/RegularContractController.php @@ -2,407 +2,527 @@ 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 App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; 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) { - + // ===== ソート(既定: contract_id DESC)===== + $sort = $request->input('sort', 'contract_id'); + $sortType = strtolower($request->input('sort_type', 'desc')) === 'asc' ? 'asc' : 'desc'; - $inputs = [ - 'isExport' => 0, - 'sort' => $request->input('sort', ''), - 'sort_type' => $request->input('sort_type', ''), - 'page' => $request->get('page', 1), + // ===== 絞り込み(テキスト系)===== + // フォームの name 属性と完全一致させる&既定値は空文字にして Blade が未定義にならないようにする + $contract_qr_id = trim((string) $request->input('contract_qr_id', '')); + $user_id = trim((string) $request->input('user_id', '')); + $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); - //dd($inputs['list']->items()); - -// dd($inputs); - if ($inputs['list']->total() > 0 && $inputs['page'] > $inputs['list']->lastPage()) { - return redirect()->route('regular_contracts'); + if (!in_array($sort, $sortable, true)) { + $sort = 'contract_id'; } - return view('admin.regular_contracts.list', $inputs); - } - - public function add(Request $request) - { - $inputs = [ - 'contract_qr_id' => $request->input('contract_qr_id'), // 定期契約QRID - 'user_id' => $request->input('user_id'), // 利用者ID - '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'), + $sortMap = [ + 'user_name' => 'u.user_name', + 'user_phonetic' => 'u.user_phonetic', + 'user_mobile' => 'u.user_mobile', + 'user_homephone' => 'u.user_homephone', + 'user_primemail' => 'u.user_primemail', + 'usertype_name' => 't.print_name', + 'park_name' => 'p.park_name', ]; - $dataList = $this->getDataDropList(); - $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; - } + $sortColumn = $sortMap[$sort] ?? ('rc.' . $sort); - }); - if ($type) { - $request->session()->flash('success', __('新しい成功を創造する。')); - return redirect()->route('regular_contracts'); - } else { - $request->session()->flash('error', __('新しい作成に失敗しました')); - } - } else { - $inputs['errorMsg'] = $this->__buildErrorMessasges($validator); - } - } + $list = $q->orderBy($sortColumn, $sortType)->paginate(50); - 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); - if (empty($contract_id) || empty($regular_contract)) { - abort('404'); + $id = (int) $id; + + 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(); - $data = array_merge($data, $dataList); - if ($request->isMethod('POST')) { - $type = false; - $inputs = $request->all(); - $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($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); - } + + $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'], + 'user_securitynum' => ['nullable', 'string', 'max:255'], + 'reserve_date' => ['nullable', 'date'], + 'contract_reserve' => ['nullable', 'string', 'max:255'], + 'contract_created_at' => ['nullable', 'date'], + 'contract_updated_at' => ['nullable', 'date'], + 'contract_cancelday' => ['nullable', 'date'], + 'contract_flag' => ['nullable', 'integer'], + 'contract_permission' => ['nullable', 'integer'], + 'contract_cancel_flag' => ['nullable', 'integer'], + 'tag_qr_flag' => ['nullable', 'integer'], + 'park_position' => ['nullable', 'string', 'max:255'], + 'ope_id' => ['nullable', 'integer'], + ]); + + if ($v->fails()) { + return back()->withErrors($v)->withInput(); } - if ($view != '') { - return view($view, $data); - } - return view('admin.regular_contracts.edit', $data); + + $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'), + '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) { - $arr_pk = $request->get('pk'); - if ($arr_pk) { - if (RegularContract::deleteByPk($arr_pk)) { - return redirect()->route('regular_contracts')->with('success', __("削除が完了しました。")); - } else { - return redirect()->route('regular_contracts')->with('error', __('削除に失敗しました。')); - } + $id = (int) $request->input('id'); + DB::table('regular_contract')->where('contract_id', $id)->delete(); + + // 例:論理削除運用にする場合(必要なら運用側で切替) + // DB::table('regular_contract')->where('contract_id', $id)->update([ + // '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) { + // ── 出力タイプ(通常 / SMBC / 役所) ────────────────────────────── + $type = $request->query('type'); // null | smbc | city - $headers = array( - "Content-type" => "text/csv;charset=UTF-8", - 'Content-Encoding: UTF-8', - "Content-Disposition" => "attachment; filename=file.csv", - "Pragma" => "no-cache", - "Cache-Control" => "must-revalidate, post-check=0, pre-check=0", - "Expires" => "0" + // ── 出力ファイル名 ─────────────────────────────────────────────── + $downloadName = '定期契約マスタ.csv'; + if ($type === 'smbc') + $downloadName = '定期契約マスタ_SMBC.csv'; + if ($type === 'city') + $downloadName = '定期契約マスタ_役所提出用.csv'; + + // ── 生成先(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); - $columns = array( - __('定期契約ID'), - __('定期契約QRID'),// 1 - __('利用者ID'),// 2 - __('利用者分類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); + DB::table('regular_contract')->insert($data); + + return redirect() + ->route('regularcontracts') + ->with('success', '定期契約を登録しました。'); } - 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ファイルを選択していません。')); - } - } -} \ No newline at end of file + + +}