krgm.so-manager-dev.com/app/Http/Controllers/Admin/PriceController.php

331 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\PriceRequest;
use App\Models\Park;
use App\Models\Price;
use App\Models\Psection;
use App\Models\Ptype;
use App\Models\Usertype;
use App\Models\Utils;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Response;
class PriceController extends Controller
{
public function list(Request $request)
{
$inputs = [
'isExport' => 0,
'sort' => $request->input('sort', ''), // ソート対象カラム
'sort_type' => $request->input('sort_type', ''), // 昇順/降順
'page' => $request->get('page', 1),
];
// Price::search 内で orderBy を反映させる
$inputs['list'] = Price::search($inputs);
if ($inputs['list']->total() > 0 && $inputs['page'] > $inputs['list']->lastPage()) {
return redirect()->route('prices');
}
$dataList = $this->getDataDropList();
$inputs = array_merge($inputs, $dataList);
return view('admin.prices.list', $inputs);
}
public function add(Request $request)
{
// POST の場合のみバリデーション + 保存
if ($request->isMethod('POST')) {
// ★ 1. 全角数字を半角に変換(例:123 → 123
$request->merge([
'pplace_id' => mb_convert_kana($request->input('pplace_id'), 'n'),
]);
// バリデーション
$validated = $request->validate([
'price_parkplaceid' => 'required|integer', // 駐車場所ID
'park_id' => 'required|integer', // 駐輪場ID
'prine_name' => 'required|string|max:255', // 商品名
'price_month' => 'nullable|integer', // 期間(月)
'user_categoryid' => 'required|integer', // 利用者分類ID
'price' => 'required|numeric|min:0', // 駐輪料金(税込)
'psection_id' => 'required|integer', // 車種区分ID
'price_ptypeid' => 'required|integer', // 駐輪分類ID
'pplace_id' => 'required|integer', // 駐車車室ID
], [
'pplace_id.integer' => '駐車車室ID は整数で入力してください。',
]);
// DB 登録
$type = false;
\DB::transaction(function () use ($validated, &$type) {
$new = new Price();
$new->fill($validated);
if ($new->save()) {
$type = true;
}
});
// 結果
if ($type) {
return redirect()->route('prices')
->with('success', __('新しい成功を創造する。'));
} else {
return redirect()->route('prices')
->with('error', __('新しい作成に失敗しました。'));
}
}
// GET の場合 → 画面表示
$dataList = $this->getDataDropList();
return view('admin.prices.add', $dataList);
}
public function edit(Request $request, $pk ,$view='')
{
$price = Price::getByPk($pk);
if (empty($pk) || empty($price)) {
abort(404);
}
$data = $price->getAttributes();
$dataList = $this->getDataDropList();
$data = array_merge($data, $dataList);
if ($request->isMethod('POST')) {
$type = false;
$requestAll = [
'price_parkplaceid' => $request->input('price_parkplaceid'),
'park_id' => $request->input('park_id'),
'prine_name' => $request->input('prine_name'),
'price_month' => $request->input('price_month',''),
'user_categoryid' => $request->input('user_categoryid'),
'price' => $request->input('price'),
'psection_id' => $request->input('psection_id'),
'price_ptypeid' => $request->input('price_ptypeid'),
'pplace_id' => $request->input('pplace_id'),
];
$data = array_merge($data, $requestAll);
\DB::transaction(function () use ($data, &$type, $price) {
$price->fill($data);
$price->save();
$type = true;
});
if ($type) {
return redirect()->route('prices')->with('success', __('更新に成功しました。'));
} else {
return redirect()->route('prices')->with('error', __('更新に失敗しました。'));
}
}
if ($view != '') {
return view($view, $data);
}
return view('admin.prices.edit', $data);
}
public function delete(Request $request)
{
$arr_pk = $request->get('pk');
if ($arr_pk) {
$ids = is_array($arr_pk) ? $arr_pk : [$arr_pk];
if (Price::deleteByPk($ids)) {
return redirect()->route('prices')->with('success', __("削除成功しました。"));
} else {
return redirect()->route('prices')->with('error', __('削除に失敗しました。'));
}
}
return redirect()->route('prices')->with('error', __('削除するユーザーを選択してください。'));
}
public static function deleteByPk($ids)
{
if (!is_array($ids)) {
$ids = [$ids];
}
return self::whereIn('price_parkplaceid', $ids)->delete();
}
public function export(Request $request)
{
$headers = [
"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"
];
$query = Price::query();
// 🚩 条件付きエクスポートpark_id
if ($request->filled('park_id')) {
$query->where('park_id', $request->input('park_id'));
}
// ソート
if ($request->filled('sort')) {
$query->orderBy($request->input('sort'), $request->input('sort_type', 'asc'));
}
$dataExport = $query->get();
$columns = [
__('駐車場所ID'),
__('商品名'),
__('期間'),
__('駐輪場ID'),
__('駐輪場名'),
__('車種区分ID'),
__('車種区分'),
__('駐輪分類ID'),
__('駐輪分類'),
__('利用者分類ID'),
__('利用者分類'),
__('駐車車室ID'),
__('駐輪料金(税込)'),
];
$filename = "駐輪場所、料金マスタ.csv";
$file = fopen($filename, 'w+');
fputcsv($file, $columns);
foreach ($dataExport as $items) {
fputcsv($file, [
$items->price_parkplaceid,
$items->prine_name,
$items->price_month,
$items->park_id,
optional($items->getPark())->park_name,
$items->psection_id,
optional($items->getPSection())->psection_subject,
$items->price_ptypeid,
optional($items->getPType())->ptype_subject,
$items->user_categoryid,
optional($items->getUserType())->print_name,
$items->pplace_id,
$items->price,
]);
}
fclose($file);
return Response::download($filename, $filename, $headers);
}
public function import(Request $request)
{
$file = $request->file('file');
if (empty($file)) {
return redirect()->route('prices')->with('error', __('CSVファイルを選択してください。'));
}
$data = Utils::csvToArray($file);
$type = true;
$msg = '';
$record = 0;
DB::beginTransaction();
try {
// 先清空数据(全置換仕様なら残す)
Price::query()->delete();
$col = 13; // CSV 項目数
foreach ($data as $key => $items) {
$record = $key + 2; // エラー行番号(ヘッダ行を考慮)
// 項目数チェック
if (count($items) != $col) {
$type = false;
$msg = "行:{$record} 列数が一致しません。";
break;
}
// 必須チェック
if (empty($items[0])) { $type = false; $msg = "行:{$record} 駐車場所IDが未設定です。"; break; }
if (empty($items[1])) { $type = false; $msg = "行:{$record} 商品名が未設定です。"; break; }
if (empty($items[2])) { $type = false; $msg = "行:{$record} 期間が未設定です。"; break; }
if (empty($items[3])) { $type = false; $msg = "行:{$record} 駐輪場IDが未設定です。"; break; }
if (empty($items[5])) { $type = false; $msg = "行:{$record} 車種区分IDが未設定です。"; break; }
if (empty($items[7])) { $type = false; $msg = "行:{$record} 駐輪分類IDが未設定です。"; break; }
if (empty($items[9])) { $type = false; $msg = "行:{$record} 利用者分類IDが未設定です。"; break; }
if (empty($items[11])) { $type = false; $msg = "行:{$record} 駐車車室IDが未設定です。"; break; }
if (empty($items[12])) { $type = false; $msg = "行:{$record} 駐輪料金が未設定です。"; break; }
// マスタ存在チェック
if (!Park::where('park_id', $items[3])->exists()) {
$type = false; $msg = "行:{$record} 駐輪場IDが存在しません。"; break;
}
if (!Psection::where('psection_id', $items[5])->exists()) {
$type = false; $msg = "行:{$record} 車種区分IDが存在しません。"; break;
}
if (!Ptype::where('ptype_id', $items[7])->exists()) {
$type = false; $msg = "行:{$record} 駐輪分類IDが存在しません。"; break;
}
if (!Usertype::where('user_categoryid', $items[9])->exists()) {
$type = false; $msg = "行:{$record} 利用者分類IDが存在しません。"; break;
}
// TODO: 駐車車室ID チェックpplace_id
// 保存
$row = new Price();
$row->price_parkplaceid = $items[0];
$row->prine_name = $items[1];
$row->price_month = $items[2];
$row->park_id = $items[3];
$row->psection_id = $items[5];
$row->price_ptypeid = $items[7];
$row->user_categoryid = $items[9];
$row->pplace_id = $items[11];
$row->price = $items[12];
if (!$row->save()) {
$type = false; $msg = "行:{$record} データ保存に失敗しました。"; break;
}
}
} catch (\Exception $e) {
$type = false;
$msg = "行:{$record} 予期せぬエラー: ".$e->getMessage();
}
if ($type) {
DB::commit();
return redirect()->route('prices')->with('success', __('インポートが正常に完了しました。'));
} else {
DB::rollBack();
return redirect()->route('prices')->with('error', $msg);
}
}
public function info(Request $request, $id)
{
return $this->edit($request, $id, 'admin.prices.info');
}
public function getDataDropList()
{
$data['parks'] = Park::getList() ;
$data['psections'] = Psection::getList() ;
$data['ptypes'] = Ptype::getList() ;
$data['userTypes'] = Usertype::getList() ;
return $data;
}
}