Compare commits

...

41 Commits

Author SHA1 Message Date
d22bafbc93 メール情報を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
Deploy preview (main_watanabe) / deploy (push) Successful in 15s
2025-10-10 13:06:41 +09:00
0c076466a9 resources/views/regular_contract/update.blade.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
2025-10-09 16:23:43 +09:00
2fdb3ce74a app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 25s
2025-10-09 16:03:04 +09:00
778b3ac9cc Merge pull request '新規契約減免区分修正' (#51) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 25s
Reviewed-on: #51
2025-10-09 15:55:53 +09:00
ae8315ba89 新規契約減免区分修正 2025-10-09 15:55:21 +09:00
fcf07cecc4 Merge pull request '契約履歴 表示条件修正' (#50) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
Reviewed-on: #50
2025-10-09 10:23:37 +09:00
c602b214e4 契約履歴 表示条件修正 2025-10-09 10:22:51 +09:00
a085a47e04 app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-08 16:59:54 +09:00
195f130a46 Merge pull request 'ルート追加' (#49) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
Reviewed-on: #49
2025-10-08 16:56:23 +09:00
3c40565377 ルート追加 2025-10-08 16:55:48 +09:00
0a102e2a47 Merge pull request '契約期間選択修正' (#48) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
Reviewed-on: #48
2025-10-08 16:50:02 +09:00
a6637c9f72 契約期間選択修正 2025-10-08 16:49:40 +09:00
61b3283b58 Merge pull request '契約期間選択エラー処理修正' (#47) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
Reviewed-on: #47
2025-10-08 16:35:52 +09:00
c1e95ce881 契約期間選択エラー処理修正 2025-10-08 16:35:28 +09:00
7e2a25d37b routes/web.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 25s
2025-10-08 16:18:06 +09:00
184860862b resources/views/regular_contract/create_select_period.blade.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 25s
2025-10-08 16:10:37 +09:00
57bae5bcf4 resources/views/regular_contract/create_select_period.blade.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-08 15:55:57 +09:00
63efbb9481 Merge pull request '新規定期契約 定期契約期間選択修正' (#46) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
Reviewed-on: #46
2025-10-08 15:38:13 +09:00
6aebe63251 新規定期契約 定期契約期間選択修正 2025-10-08 15:37:42 +09:00
f29ba66745 routes/web.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-07 18:28:48 +09:00
ebd3a65096 Merge pull request '駐輪場検索修正' (#45) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
Reviewed-on: #45
2025-10-07 18:07:19 +09:00
89465021e4 駐輪場検索修正 2025-10-07 18:06:27 +09:00
5dff9d627a app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-07 17:36:50 +09:00
e13302475e Merge pull request '駐輪場検索 並び替え修正' (#44) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
Reviewed-on: #44
2025-10-07 17:32:06 +09:00
8a9bd9d569 駐輪場検索 並び替え修正 2025-10-07 17:31:46 +09:00
ca283fc9a9 app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-07 17:07:42 +09:00
d84b0fb9e1 app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-07 16:54:59 +09:00
e80b0639ca resources/views/regular_contract/create.blade.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 26s
2025-10-07 16:46:29 +09:00
3cad3b3d0f Merge pull request '駐輪場検索画面 並び替え条件修正' (#43) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 25s
Reviewed-on: #43
2025-10-07 16:17:22 +09:00
a139353a2f 駐輪場検索画面 並び替え条件修正 2025-10-07 16:16:38 +09:00
29f40c37bb app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-07 15:56:39 +09:00
8d33e2bf78 app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-07 15:54:00 +09:00
57efa7f63e app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
2025-10-07 15:49:14 +09:00
9d9717863e app/Http/Controllers/RegularContractCreateController.php を更新
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
2025-10-07 15:32:25 +09:00
f22f447a86 Merge pull request '駐輪場検索画面 並び替え条件修正' (#42) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 27s
Reviewed-on: #42
2025-10-07 15:27:46 +09:00
0afe05606e 駐輪場検索画面 並び替え条件修正 2025-10-07 15:27:12 +09:00
dfa786ca6f Merge pull request '駐輪場ポップアップ ボタンサイズ調整' (#41) from main_higashide into main
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 25s
Reviewed-on: #41
2025-10-06 16:30:01 +09:00
e25df2dd27 駐輪場ポップアップ ボタンサイズ調整 2025-10-06 16:29:21 +09:00
Your Name
253e388058 shj3 修正
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 23s
2025-10-05 01:50:06 +09:00
Your Name
ff21ee5796 Merge branch 'main' of https://git.so-manager-dev.com/so-manager/so-manager-dev.com
All checks were successful
Deploy so-manager (auto) / deploy (push) Successful in 24s
2025-10-03 20:32:33 +09:00
Your Name
9441a34f6f SHJ-9/SHJ-10: 修复定期契約集計処理の統合ロジック
- 定期契約データを psectionusertypemonths で統合
- 新規/更新  減免/通常 を1レコードに集約
- Operator Queue に park_id と operator_id を正確に設定
- SQL に contract_money の SUM を追加
2025-10-03 20:32:09 +09:00
19 changed files with 3043 additions and 1344 deletions

17
.env
View File

@ -46,15 +46,16 @@ REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null REDIS_PASSWORD=null
REDIS_PORT=6379 REDIS_PORT=6379
MAIL_MAILER=log MAIL_MAILER=smtp
MAIL_SCHEME=null #MAIL_SCHEME=null
MAIL_HOST=127.0.0.1 MAIL_HOST=tomatofox9.sakura.ne.jp
MAIL_PORT=2525 MAIL_PORT=587
MAIL_USERNAME=null MAIL_USERNAME=demo@so-rin.jp
MAIL_PASSWORD=null MAIL_PASSWORD=rokuchou4665
MAIL_FROM_ADDRESS="hp@so-manager-dev.com" MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=demo@so-rin.jp
MAIL_FROM_NAME="${APP_NAME}" MAIL_FROM_NAME="${APP_NAME}"
MAIL_ADMIN=null MAIL_ADMIN=demo@so-rin.jp
AWS_ACCESS_KEY_ID= AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY= AWS_SECRET_ACCESS_KEY=

View File

@ -9,7 +9,7 @@ use App\Services\ShjNineService;
/** /**
* SHJ-9 売上集計処理コマンド * SHJ-9 売上集計処理コマンド
* *
* 駐輪場の売上データを日次・月次・年次で集計する処理を実行する * 駐輪場の売上データを日次で集計する処理を実行する
* バックグラウンドで実行される定期バッチ処理 * バックグラウンドで実行される定期バッチ処理
*/ */
class ShjNineCommand extends Command class ShjNineCommand extends Command
@ -18,19 +18,19 @@ class ShjNineCommand extends Command
* コンソールコマンドの名前とシグネチャ * コンソールコマンドの名前とシグネチャ
* *
* 引数: * 引数:
* - type: 集計種別 (daily/monthly/yearly) (必須) * - type: 集計種別 (daily のみ) (必須)
* - target_date: 集計対象日 (オプション、YYYY-MM-DD形式) * - target_date: 集計対象日 (オプション、YYYY-MM-DD形式)
* *
* @var string * @var string
*/ */
protected $signature = 'shj:9 {type : 集計種別(daily/monthly/yearly)} {target_date? : 集計対象日(YYYY-MM-DD)}'; protected $signature = 'shj:9 {type : 集計種別(daily)} {target_date? : 集計対象日(YYYY-MM-DD)}';
/** /**
* コンソールコマンドの説明 * コンソールコマンドの説明
* *
* @var string * @var string
*/ */
protected $description = 'SHJ-9 売上集計処理 - 日次/月次/年次売上データ集計を実行'; protected $description = 'SHJ-9 売上集計処理 - 日次売上データ集計を実行';
/** /**
* SHJ-9サービスクラス * SHJ-9サービスクラス
@ -138,10 +138,9 @@ class ShjNineCommand extends Command
*/ */
private function validateParameters(string $type, ?string $targetDate): bool private function validateParameters(string $type, ?string $targetDate): bool
{ {
// 集計種別チェック // 集計種別チェックSHJ-9 は日次のみ対応)
$allowedTypes = ['daily', 'monthly', 'yearly']; if ($type !== 'daily') {
if (!in_array($type, $allowedTypes)) { $this->error('SHJ-9 は日次集計dailyのみ対応しています。月次/年次は SHJ-10 を使用してください。');
$this->error('集計種別は daily, monthly, yearly のいずれかを指定してください。');
return false; return false;
} }
@ -157,7 +156,7 @@ class ShjNineCommand extends Command
/** /**
* 集計対象日を決定 * 集計対象日を決定
* *
* @param string $type 集計種別 * @param string $type 集計種別daily 固定)
* @param string|null $targetDate 指定日 * @param string|null $targetDate 指定日
* @return string 集計対象日 * @return string 集計対象日
*/ */
@ -167,23 +166,8 @@ class ShjNineCommand extends Command
return $targetDate; return $targetDate;
} }
// パラメータ指定がない場合のデフォルト設定 // パラメータ指定がない場合は昨日本日の1日前
switch ($type) {
case 'daily':
// 日次昨日本日の1日前
return now()->subDay()->format('Y-m-d'); return now()->subDay()->format('Y-m-d');
case 'monthly':
// 月次:前月の最終日
return now()->subMonth()->endOfMonth()->format('Y-m-d');
case 'yearly':
// 年次:前年の最終日
return now()->subYear()->endOfYear()->format('Y-m-d');
default:
return now()->subDay()->format('Y-m-d');
}
} }
/** /**

View File

@ -90,7 +90,7 @@ class RegularContractController extends Controller
->join('usertype', 'regular_contract.user_categoryid', '=', 'usertype.user_categoryid') ->join('usertype', 'regular_contract.user_categoryid', '=', 'usertype.user_categoryid')
->leftJoin('city', 'park.city_id', '=', 'city.city_id') ->leftJoin('city', 'park.city_id', '=', 'city.city_id')
->where('regular_contract.user_id', $user_id) ->where('regular_contract.user_id', $user_id)
->whereNotNull('regular_contract.contract_periods') ->whereNotNull('regular_contract.contract_money')
->select( ->select(
'regular_contract.contract_id', 'regular_contract.contract_id',
'park.park_name', 'park.park_name',

View File

@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Exception; use Exception;
use function redirect; use function redirect;
use Carbon\Carbon;
class RegularContractCreateController extends Controller class RegularContractCreateController extends Controller
{ {
@ -88,14 +89,29 @@ class RegularContractCreateController extends Controller
'station_name_ruby' => 'station.station_name_ruby', 'station_name_ruby' => 'station.station_name_ruby',
'park_id' => 'park.park_id', 'park_id' => 'park.park_id',
]; ];
if (isset($sortable[$sort])) {
$query->orderBy($sortable[$sort], $order);
} else {
$query->orderBy('park.park_id', 'asc'); $query->orderBy('park.park_id', 'asc');
}
$total = $query->count(); $total = $query->count();
$parks_table = $query->skip(($page - 1) * $perPage)->take($perPage)->get(); $parks_table = $query->get();
if ($sort === 'park_ruby' || $sort === 'station_name_ruby') {
$collator = new \Collator('ja');
$parks_table = $parks_table->sort(function ($a, $b) use ($order, $sort, $collator) {
$a_val = $a->$sort ?? '';
$b_val = $b->$sort ?? '';
return $order === 'asc'
? $collator->compare($a_val, $b_val)
: $collator->compare($b_val, $a_val);
})->values();
} else {
// park_id, city_idなどはSQLのorderByで十分なので、ここでPHPソートは不要
if (isset($sortable[$sort])) {
$parks_table = $parks_table->sortBy($sort, SORT_REGULAR, $order === 'desc')->values();
}
}
$page = request()->input('page', 1);
$perPage = 10;
$parks_table = $parks_table->slice(($page - 1) * $perPage, $perPage)->values();
// zoneテーブルデータを取得psectionテーブルとJOINしてpsection_subjectも取得 // zoneテーブルデータを取得psectionテーブルとJOINしてpsection_subjectも取得
$zones = DB::table('zone') $zones = DB::table('zone')
@ -128,7 +144,7 @@ class RegularContractCreateController extends Controller
} }
return view('regular_contract.create', [ return view('regular_contract.create', [
'active_menu' => $active_menu, // 画面ID 'active_menu' => $active_menu, // この画面ID
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用) 'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
'cities' => $cities, 'cities' => $cities,
'stations' => $stations, 'stations' => $stations,
@ -576,7 +592,7 @@ class RegularContractCreateController extends Controller
'user_categoryid' => $user_categoryid, 'user_categoryid' => $user_categoryid,
'park_id' => $park->park_id, 'park_id' => $park->park_id,
'contract_created_at' => now(), 'contract_created_at' => now(),
'contract_reduction' => $ward_residents, 'contract_reduction' => $request->contract_reduction === 'はい' ? 1 : 0,
'update_flag' => 2, 'update_flag' => 2,
'contract_cancel_flag' => 0, 'contract_cancel_flag' => 0,
'psection_id' => $request->psection_id, 'psection_id' => $request->psection_id,
@ -801,14 +817,20 @@ class RegularContractCreateController extends Controller
return redirect('/login'); return redirect('/login');
} }
// 期間選択チェック $contract_id = $request->input('contract_id');
$request->validate([
$validator = Validator::make($request->all(), [
'month' => 'required', 'month' => 'required',
], [ ], [
'month.required' => '契約期間が選択されていません。', 'month.required' => '契約期間が選択されていません。',
]); ]);
$contract_id = $request->input('contract_id'); if ($validator->fails()) {
return redirect()->route('regular_contract.create_confirm_error', ['contract_id' => $contract_id])
->withErrors($validator)
->withInput();
}
$month = $request->input('month'); $month = $request->input('month');
$price = $request->input('price_' . $month); $price = $request->input('price_' . $month);

View File

@ -48,8 +48,8 @@ class EarningsSummary extends Model
'regular_update_amount', // 更新金額 'regular_update_amount', // 更新金額
'regular_update_reduction_count', // 更新成免件数 'regular_update_reduction_count', // 更新成免件数
'regular_update_reduction_amount', // 更新成免金額 'regular_update_reduction_amount', // 更新成免金額
'turnsum_count', // 残金件数 'lumpsum_count', // 一時金件数
'turnsum', // 残 'lumpsum', // 一時
'refunds', // 解時返戻金 'refunds', // 解時返戻金
'other_income', // 分別収入 'other_income', // 分別収入
'other_spending', // 分別支出 'other_spending', // 分別支出
@ -79,8 +79,8 @@ class EarningsSummary extends Model
'regular_update_amount' => 'decimal:2', 'regular_update_amount' => 'decimal:2',
'regular_update_reduction_count' => 'integer', 'regular_update_reduction_count' => 'integer',
'regular_update_reduction_amount' => 'decimal:2', 'regular_update_reduction_amount' => 'decimal:2',
'turnsum_count' => 'integer', 'lumpsum_count' => 'integer',
'turnsum' => 'decimal:2', 'lumpsum' => 'decimal:2',
'refunds' => 'decimal:2', 'refunds' => 'decimal:2',
'other_income' => 'decimal:2', 'other_income' => 'decimal:2',
'other_spending' => 'decimal:2', 'other_spending' => 'decimal:2',
@ -175,8 +175,8 @@ class EarningsSummary extends Model
SUM(regular_new_amount) as total_new_amount, SUM(regular_new_amount) as total_new_amount,
SUM(regular_update_count) as total_update_count, SUM(regular_update_count) as total_update_count,
SUM(regular_update_amount) as total_update_amount, SUM(regular_update_amount) as total_update_amount,
SUM(turnsum_count) as total_turnsum_count, SUM(lumpsum_count) as total_lumpsum_count,
SUM(turnsum) as total_turnsum, SUM(lumpsum) as total_lumpsum,
SUM(refunds) as total_refunds, SUM(refunds) as total_refunds,
SUM(reissue_count) as total_reissue_count, SUM(reissue_count) as total_reissue_count,
SUM(reissue_amount) as total_reissue_amount SUM(reissue_amount) as total_reissue_amount
@ -249,8 +249,8 @@ class EarningsSummary extends Model
'regular_update_amount' => 0.00, 'regular_update_amount' => 0.00,
'regular_update_reduction_count' => 0, 'regular_update_reduction_count' => 0,
'regular_update_reduction_amount' => 0.00, 'regular_update_reduction_amount' => 0.00,
'turnsum_count' => 0, 'lumpsum_count' => 0,
'turnsum' => 0.00, 'lumpsum' => 0.00,
'refunds' => 0.00, 'refunds' => 0.00,
'other_income' => 0.00, 'other_income' => 0.00,
'other_spending' => 0.00, 'other_spending' => 0.00,
@ -273,7 +273,7 @@ class EarningsSummary extends Model
{ {
return $this->regular_new_amount + return $this->regular_new_amount +
$this->regular_update_amount + $this->regular_update_amount +
$this->turnsum + $this->lumpsum +
$this->reissue_amount + $this->reissue_amount +
$this->other_income - $this->other_income -
$this->other_spending - $this->other_spending -

View File

@ -24,7 +24,7 @@ class HardwareCheckLog extends Model
* *
* @var string * @var string
*/ */
protected $primaryKey = 'log_id'; protected $primaryKey = 'hardware_check_log_id';
/** /**
* 一括代入可能な属性 * 一括代入可能な属性
@ -46,7 +46,7 @@ class HardwareCheckLog extends Model
* @var array * @var array
*/ */
protected $casts = [ protected $casts = [
'log_id' => 'integer', 'hardware_check_log_id' => 'integer',
'device_id' => 'integer', 'device_id' => 'integer',
'status' => 'integer', 'status' => 'integer',
'operator_id' => 'integer', 'operator_id' => 'integer',
@ -220,7 +220,7 @@ class HardwareCheckLog extends Model
{ {
return sprintf( return sprintf(
'HardwareCheckLog[ID:%d, Device:%d, Status:%s, Time:%s]', 'HardwareCheckLog[ID:%d, Device:%d, Status:%s, Time:%s]',
$this->log_id, $this->hardware_check_log_id,
$this->device_id, $this->device_id,
$this->getStatusNameAttribute(), $this->getStatusNameAttribute(),
$this->created_at ? $this->created_at->format('Y-m-d H:i:s') : 'N/A' $this->created_at ? $this->created_at->format('Y-m-d H:i:s') : 'N/A'

View File

@ -0,0 +1,97 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* 管轄駐輪場モデル - jurisdiction_parkingテーブル
*
* オペレータが管轄する駐輪場の情報を管理
*/
class JurisdictionParking extends Model
{
/**
* テーブル名
*
* @var string
*/
protected $table = 'jurisdiction_parking';
/**
* プライマリキー
*
* @var string
*/
protected $primaryKey = 'jurisdiction_parking_id';
/**
* タイムスタンプ使用
*
* @var bool
*/
public $timestamps = true;
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at';
/**
* 一括代入可能な属性
*
* @var array
*/
protected $fillable = [
'jurisdiction_parking_name',
'ope_id',
'park_id',
'operator_id'
];
/**
* キャストする属性
*
* @var array
*/
protected $casts = [
'jurisdiction_parking_id' => 'integer',
'ope_id' => 'integer',
'park_id' => 'integer',
'operator_id' => 'integer',
'created_at' => 'datetime',
'updated_at' => 'datetime'
];
/**
* オペレータとの関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function ope()
{
return $this->belongsTo(Ope::class, 'ope_id', 'ope_id');
}
/**
* 駐輪場との関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function park()
{
return $this->belongsTo(Park::class, 'park_id', 'park_id');
}
/**
* 指定駐輪場を管轄するオペレータIDリストを取得
*
* @param int $parkId 駐輪場ID
* @return array オペレータIDの配列
*/
public static function getOperatorIdsByPark(int $parkId): array
{
return self::where('park_id', $parkId)
->pluck('ope_id')
->toArray();
}
}

228
app/Models/Manager.php Normal file
View File

@ -0,0 +1,228 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* 駐輪場管理者モデル - managerテーブル
*
* 駐輪場管理者マスタ情報を管理するモデル
* 各駐輪場に紐づく管理者の情報、警報送信設定などを保持
*/
class Manager extends Model
{
/**
* テーブル名
*
* @var string
*/
protected $table = 'manager';
/**
* プライマリキー
*
* @var string
*/
protected $primaryKey = 'manager_id';
/**
* タイムスタンプ使用
*
* @var bool
*/
public $timestamps = true;
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at';
/**
* 一括代入可能な属性
*
* @var array
*/
protected $fillable = [
'manager_name', // 管理者名
'manager_type', // 管理者種別
'manager_parkid', // 所属駐輪場ID
'manager_device1', // デバイス1
'manager_device2', // デバイス2
'manager_mail', // メールアドレス
'manager_tel', // 電話番号
'manager_alert1', // アラート送信フラグ1
'manager_alert2', // アラート送信フラグ2
'manager_quit_flag', // 退職フラグ
'manager_quitday', // 退職日
'operator_id' // 登録オペレータID
];
/**
* キャストする属性
*
* @var array
*/
protected $casts = [
'manager_id' => 'integer',
'manager_parkid' => 'integer',
'manager_device1' => 'integer',
'manager_device2' => 'integer',
'manager_alert1' => 'boolean',
'manager_alert2' => 'boolean',
'manager_quit_flag' => 'boolean',
'operator_id' => 'integer',
'manager_quitday' => 'date',
'created_at' => 'datetime',
'updated_at' => 'datetime'
];
/**
* 所属駐輪場との関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function park()
{
return $this->belongsTo(Park::class, 'manager_parkid', 'park_id');
}
/**
* 登録オペレータとの関連
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function operator()
{
return $this->belongsTo(Ope::class, 'operator_id', 'ope_id');
}
/**
* アクティブな管理者のみを取得するスコープ
* (退職フラグ = 0
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeActive($query)
{
return $query->where('manager_quit_flag', 0);
}
/**
* メールアドレスが設定されている管理者のみを取得するスコープ
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeHasEmail($query)
{
return $query->whereNotNull('manager_mail')
->where('manager_mail', '!=', '');
}
/**
* 指定駐輪場の管理者を取得するスコープ
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $parkId 駐輪場ID
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeByPark($query, int $parkId)
{
return $query->where('manager_parkid', $parkId);
}
/**
* メール送信対象の駐輪場管理者を取得
*
* 条件:
* - 退職フラグ = 0(在職中)
* - メールアドレスが設定されている
*
* @return \Illuminate\Database\Eloquent\Collection
*/
public static function getMailTargetManagers()
{
return self::active()
->hasEmail()
->select(['manager_id', 'manager_name', 'manager_mail', 'manager_parkid'])
->get()
->map(function ($manager) {
return [
'manager_id' => $manager->manager_id,
'name' => $manager->manager_name,
'email' => $manager->manager_mail,
'park_id' => $manager->manager_parkid
];
});
}
/**
* 指定駐輪場のメール送信対象管理者を取得
*
* @param int $parkId 駐輪場ID
* @return \Illuminate\Database\Eloquent\Collection
*/
public static function getMailTargetManagersByPark(int $parkId)
{
return self::active()
->hasEmail()
->byPark($parkId)
->select(['manager_id', 'manager_name', 'manager_mail', 'manager_parkid'])
->get()
->map(function ($manager) {
return [
'manager_id' => $manager->manager_id,
'name' => $manager->manager_name,
'email' => $manager->manager_mail,
'park_id' => $manager->manager_parkid
];
});
}
/**
* 退職しているかどうかを判定
*
* @return bool 退職しているかどうか
*/
public function isQuit(): bool
{
return (bool) $this->manager_quit_flag;
}
/**
* アクティブ(在職中)かどうかを判定
*
* @return bool 在職中かどうか
*/
public function isActive(): bool
{
return !$this->isQuit();
}
/**
* メールアドレスが設定されているかどうかを判定
*
* @return bool メールアドレスが設定されているかどうか
*/
public function hasEmail(): bool
{
return !empty($this->manager_mail);
}
/**
* 文字列表現
*
* @return string
*/
public function __toString(): string
{
return sprintf(
'Manager[ID:%d, Name:%s, Park:%d, Email:%s]',
$this->manager_id,
$this->manager_name,
$this->manager_parkid,
$this->manager_mail ?? 'N/A'
);
}
}

View File

@ -24,7 +24,7 @@ class PrintJobLog extends Model
* *
* @var string * @var string
*/ */
protected $primaryKey = 'log_id'; protected $primaryKey = 'job_log_id';
/** /**
* 一括代入可能な属性 * 一括代入可能な属性
@ -49,7 +49,7 @@ class PrintJobLog extends Model
* @var array * @var array
*/ */
protected $casts = [ protected $casts = [
'log_id' => 'integer', 'job_log_id' => 'integer',
'park_id' => 'integer', 'park_id' => 'integer',
'user_id' => 'integer', 'user_id' => 'integer',
'contract_id' => 'integer', 'contract_id' => 'integer',
@ -242,7 +242,7 @@ class PrintJobLog extends Model
{ {
return sprintf( return sprintf(
'PrintJobLog[ID:%d, Process:%s, ErrorCode:%d, Time:%s]', 'PrintJobLog[ID:%d, Process:%s, ErrorCode:%d, Time:%s]',
$this->log_id, $this->job_log_id,
$this->process_name, $this->process_name,
$this->error_code, $this->error_code,
$this->created_at ? $this->created_at->format('Y-m-d H:i:s') : 'N/A' $this->created_at ? $this->created_at->format('Y-m-d H:i:s') : 'N/A'

85
app/Models/Setting.php Normal file
View File

@ -0,0 +1,85 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* 設定マスタモデル - settingテーブル
*
* システム全体の設定情報を管理するモデル
*/
class Setting extends Model
{
/**
* テーブル名
*
* @var string
*/
protected $table = 'setting';
/**
* プライマリキー
*
* @var string
*/
protected $primaryKey = 'setting_id';
/**
* タイムスタンプ使用
*
* @var bool
*/
public $timestamps = true;
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at';
/**
* 一括代入可能な属性
*
* @var array
*/
protected $fillable = [
'edit_master',
'web_master',
'auto_change_date',
'auto_chage_master',
're-issue_alert_number',
'image_base_url1',
'image_base_url2',
'printable_alert_flag',
'printable_number',
'printable_alert_number',
'printer_keep_alive',
'operator_id'
];
/**
* キャストする属性
*
* @var array
*/
protected $casts = [
'setting_id' => 'integer',
'printable_alert_flag' => 'boolean',
'printable_number' => 'integer',
'printable_alert_number' => 'integer',
'printer_keep_alive' => 'integer',
'operator_id' => 'integer',
'auto_change_date' => 'datetime',
'created_at' => 'datetime',
'updated_at' => 'datetime'
];
/**
* 設定情報を取得通常はID=1の単一レコード)
*
* @return Setting|null
*/
public static function getSettings(): ?Setting
{
return self::first();
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -55,25 +55,13 @@
<table id="searchTable" class="tablesorter table table-striped"> <table id="searchTable" class="tablesorter table table-striped">
<thead> <thead>
<tr> <tr>
<th class="header"> <th class="header" style="cursor:default; pointer-events: none; background-color: #d4edda !important;">駐輪場名</th>
駐輪場名 <th class="header" style="cursor:default; pointer-events: none;">市町村名</th>
<a href="{{ request()->fullUrlWithQuery(['sort' => 'park_ruby', 'order' => 'asc', 'page' => 1]) }}" class="text-success"><i class="bi bi-caret-up-fill"></i></a> <th class="header" style="cursor:default; pointer-events: none;">駅名</th>
<a href="{{ request()->fullUrlWithQuery(['sort' => 'park_ruby', 'order' => 'desc', 'page' => 1]) }}" class="text-success"><i class="bi bi-caret-down-fill"></i></a> <th class="header" style="cursor:default; pointer-events: none;">自転車</th>
</th> <th class="header" style="cursor:default; pointer-events: none;">原付</th>
<th class="header"> <th class="header" style="cursor:default; pointer-events: none;">自動二輪</th>
市町村名 <th class="header" style="cursor:default; pointer-events: none;">自動車</th>
<a href="{{ request()->fullUrlWithQuery(['sort' => 'city_id', 'order' => 'asc', 'page' => 1]) }}" class="text-success"><i class="bi bi-caret-up-fill"></i></a>
<a href="{{ request()->fullUrlWithQuery(['sort' => 'city_id', 'order' => 'desc', 'page' => 1]) }}" class="text-success"><i class="bi bi-caret-down-fill"></i></a>
</th>
<th class="header">
駅名
<a href="{{ request()->fullUrlWithQuery(['sort' => 'station_name_ruby', 'order' => 'asc', 'page' => 1]) }}" class="text-success"><i class="bi bi-caret-up-fill"></i></a>
<a href="{{ request()->fullUrlWithQuery(['sort' => 'station_name_ruby', 'order' => 'desc', 'page' => 1]) }}" class="text-success"><i class="bi bi-caret-down-fill"></i></a>
</th>
<th class="header">自転車</th>
<th class="header">原付</th>
<th class="header">自動二輪</th>
<th class="header">自動車</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -10,7 +10,7 @@
{{ $errors->first('month') }} {{ $errors->first('month') }}
</div> </div>
@endif @endif
<form class="row form" action="{{ url('regular_contract/update_period') }}" method="post"> <form class="row form" action="{{ route('regular_contract.create_select_period') }}" method="post">
@csrf @csrf
<input type="hidden" name="contract_id" value="{{ $contract_id }}"> <input type="hidden" name="contract_id" value="{{ $contract_id }}">
<div class="col-12 col-md-8 offset-0 offset-md-2 mb30"> <div class="col-12 col-md-8 offset-0 offset-md-2 mb30">

View File

@ -91,7 +91,7 @@
定期契約 定期契約
</button> </button>
@else @else
<button type="button" class="btn btn-danger btn_103 btn-reserve" <button type="button" class="btn btn-danger btn-sm btn_103 btn-reserve"
data-park-id="{{ $park->park_id }}" data-park-id="{{ $park->park_id }}"
data-psection-id="{{ $zone->psection_id }}" data-psection-id="{{ $zone->psection_id }}"
data-ptype-id="{{ $zone->ptype_id }}"> data-ptype-id="{{ $zone->ptype_id }}">
@ -99,7 +99,7 @@
</button> </button>
@endif @endif
@else @else
<button type="button" class="btn btn-danger btn_103 btn-reserve" <button type="button" class="btn btn-danger btn-sm btn_103 btn-reserve"
data-park-id="{{ $park->park_id }}" data-park-id="{{ $park->park_id }}"
data-psection-id="{{ $zone->psection_id }}" data-psection-id="{{ $zone->psection_id }}"
data-ptype-id="{{ $zone->ptype_id }}"> data-ptype-id="{{ $zone->ptype_id }}">

View File

@ -312,7 +312,6 @@ return null;
border-radius: 2rem !important; border-radius: 2rem !important;
padding-left: 2rem !important; padding-left: 2rem !important;
padding-right: 2rem !important; padding-right: 2rem !important;
font-weight: 500;
min-width: 140px; min-width: 140px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }

View File

@ -125,7 +125,8 @@ Route::get('/regular-contract/upload_identity_success', [RegularContractCreateCo
Route::get('/regular-contract/upload_identity_fail', [RegularContractCreateController::class, 'showUploadIdentityFail'])->name('regular_contract.upload_identity_fail'); Route::get('/regular-contract/upload_identity_fail', [RegularContractCreateController::class, 'showUploadIdentityFail'])->name('regular_contract.upload_identity_fail');
Route::get('regular_contract/create_confirm', [RegularContractCreateController::class, 'createConfirm'])->name('regular_contract.create_confirm'); Route::get('regular_contract/create_confirm', [RegularContractCreateController::class, 'createConfirm'])->name('regular_contract.create_confirm');
Route::post('/regular_contract/create_confirm_next/{contract_id}', [RegularContractCreateController::class, 'createConfirmNext'])->name('regular_contract.create_confirm_next'); Route::post('/regular_contract/create_confirm_next/{contract_id}', [RegularContractCreateController::class, 'createConfirmNext'])->name('regular_contract.create_confirm_next');
Route::post('regular_contract/create_select_period', [RegularContractCreateController::class, 'selectPeriod'])->name('regular_contract.create_select_period'); Route::get('/regular_contract/create_confirm_error/{contract_id}', [RegularContractCreateController::class, 'createConfirmNext'])->name('regular_contract.create_confirm_error');
Route::post('/regular_contract/create_select_period', [RegularContractCreateController::class, 'selectPeriod'])->name('regular_contract.create_select_period');
// 定期契約更新 // 定期契約更新
Route::get('regular_contract/update', [RegularContractController::class, 'showInfo'])->name('regular_contract.update'); Route::get('regular_contract/update', [RegularContractController::class, 'showInfo'])->name('regular_contract.update');
@ -145,6 +146,14 @@ Route::get('park_search', [RegularContractCreateController::class, 'show'])->nam
// 空き待ち状況確認 // 空き待ち状況確認
Route::get('park_waitlist', [ParkWaitlistController::class, 'index'])->name('park_waitlist.index'); Route::get('park_waitlist', [ParkWaitlistController::class, 'index'])->name('park_waitlist.index');
Route::get('/park-waitlist/check', [ParkWaitlistController::class, 'check'])->name('park_waitlist.check');
Route::get('/park-waitlist/create', [ParkWaitlistController::class, 'create'])->name('park_waitlist.create');
Route::get('/api/park-detail-wait/{reserve_id}', [ParkDetailController::class, 'showWait']);
Route::get('/park_waitlist/cancel/{reserve_id}', [ParkWaitlistController::class, 'cancelConfirm'])->name('park_waitlist.cancel');
Route::post('/park_waitlist/cancel/{reserve_id}', [ParkWaitlistController::class, 'cancel'])->name('park_waitlist.cancel.post');
Route::get('/park_waitlist/cancel/complete', function () {
return view('park_waitlist.cancel_complete');
})->name('park_waitlist.cancel.complete');
// 会員へのお知らせ // 会員へのお知らせ
Route::get('/user_information', [UserInformationController::class, 'index'])->name('user_information.index'); Route::get('/user_information', [UserInformationController::class, 'index'])->name('user_information.index');