本日の成果。
玉が発射されるようになりました。

最新ソースはこちら
https://github.com/takishita2nd/hotel-mng
さて、次の課題は、予約登録時にチェックアウト時間を登録し、日毎のチェックアウト時間と部屋を一覧に表示することです。
まずは、チェックアウト時間を登録する処理から作っていきます。
マイグレーションファイルを作成し、予約管理テーブルにチェックアウト時間を登録できるようにします。
class AddCheckout extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('reserve_managements', function (Blueprint $table) {
$table->datetime('checkout')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('reserve_managements', function (Blueprint $table) {
$table->dropColumn('checkout');
});
}
}
次は、予約追加画面にチェックアウト時間を登録できるようにするのですが、30分おきにリストから選択する、という形式にしましょうか。
/**
* 時間一覧を30分おきにして返す
*/
public function getTimeList()
{
$time = 0;
$ret = array();
for($i = 0; $i < 48; $i++)
{
$time = strtotime('00:00 + '.($i * 30).' minute') - strtotime('00:00');
$ret[$time] = date('H:i', $time);
}
return $ret;
}
これでarray[‘チックタイム’] = ’時間:分’というような形でリストを作成します。
これを表示します。
public function create()
{
return view('register.create',
[
'rooms' => $this->roomRepository->getRoomList(),
'timelist' => $this->registerManagement->getTimeList()
]
);
}
<tr>
<th>チェックアウト</th>
<td>{!! Form::select('checkout', $timelist) !!}</td>
</tr>
public function store(ManagementRequest $request)
{
if($this->registerManagement->checkSchedule($request->start_day,
$request->days,
$request->room) == false)
{
return redirect('management/create')
->with(['error' => 'スケジュールが重複します'])
->withInput();
}
$param = $this->registerManagement->getParam();
$this->registerManagement->add([
$param[0] => $request->name,
$param[1] => $request->address,
$param[2] => $request->phone,
$param[3] => $request->num,
$param[4] => $request->days,
$param[5] => $request->start_day,
$param[6] => false,
$param[7] => date('Y-m-d H:i', strtotime($request->start_day.'+'.$request->days.' day') + $request->checkout)
], $request->room);
return redirect('management');
}
チェックアウト時間は、宿泊日+宿泊日数+チェックアウト時間で計算します。
で、これを一覧表示。
public function getList()
{
$select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'checkout', 'start_day'];
return ReserveManagement::select($select)
->where('lodging', false)
->orderBy('start_day')
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->get();
}
public function getListByMonth($year, $month, $room)
{
$select = ['reserve_managements.id as id', 'reserve_managements.name as name', 'address', 'phone', 'num', 'rooms.name as room', 'checkout', 'start_day'];
return ReserveManagement::select($select)
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
->where('reserve_management_room.room_id', $room)
->where('lodging', false)
->orderBy('start_day')
->get();
}
まぁ、やってることは、select句の中にcheckoutを追加しただけですが。
<table class="management">
<tr>
<th class="name">名前</th>
<th class="address">住所</th>
<th class="phone">電話番号</th>
<th class="num">人数</th>
<th class="room">部屋</th>
<th class="date">宿泊日</th>
<th class="checkout">チェックアウト</th>
<th class="command">編集</th>
<th class="command">削除</th>
<th class="command">宿泊</th>
</tr>
@foreach ($registerLists as $list)
<tr>
<td class="name">{{ $list->name }}</td>
<td class="address">{{ $list->address }}</td>
<td class="phone">{{ $list->phone }}</td>
<td class="num">{{ $list->num }}</td>
<td class="room">{{ $list->room }}</td>
<td class="date">{{ $list->start_day }}</td>
<td class="checkout">{{ $list->checkout }}</td>
<td class="command">{{ Html::link('/management/'.$list->id.'/edit', '編集') }}</td>
<td class="command">{{ Html::link('/management/'.$list->id.'/conform', '削除') }}</td>
<td class="command">
{!! Form::open(['url' => action('RegisterManagementController@lodging')]) !!}
{!! Form::hidden('id', $list->id) !!}
{!! Form::submit('宿泊') !!}
{!! Form::close() !!}
</td>
</tr>
@endforeach
</table>
宿泊日数のところをチェックアウト時間に置き換えました。
編集処理も同じように修正しています。
とりあえず、ここまで。
本日の成果。
2Dのキャラを左右に移動させることができました。
前回までの状況はこちら。
最新ソースはこちら。(github)
https://github.com/takishita2nd/hotel-mng
最後は集計処理です。
今までは年月ごとに集計していましたが、今回はさらに部屋ごとに集計します。
さらに、部屋ごとに値段を自由に設定できるようにしたので、合計金額の算出処理も変更になります。
では、Viewに、部屋ごとにフィルタするコントロールを追加します。
{!! Form::open(['url' => action('RegisterManagementController@totalToMonthly')]) !!}
<table>
<tr>
<td>{!! Form::select('room', $rooms) !!}</td>
<td>{!! Form::submit('表示') !!}</td>
</tr>
</table>
{!! Form::close() !!}
<table class="total">
<tr>
<th class="yearmonth">年月</th>
<th class="name">部屋</th>
<th class="couont">件数</th>
<th class="total">売上</th>
</tr>
@foreach ($Lists as $list)
<tr>
<td class="yearmonth">{{ $list->yearmonth }}</td>
<td class="name">{{ $list->roomname }}</td>
<td class="couont">{{ $list->count }}</td>
<td class="total">{{ $list->total }}</td>
</tr>
@endforeach
</table>
フィルタ処理は、他のフィルタ処理と同様に、POSTリクエストすると、クエリパラメータ付きのURLに変換して、GETリクエストにリダイレクトします。
/**
* 月毎の集計を表示
*/
public function total(Request $request)
{
if(is_null($request->input('room')))
{
return view('register.total',
[
'Lists' => $this->registerManagement->countByMonthly(),
'rooms' => $this->roomRepository->getRoomList()
]);
}
else
{
return view('register.total',
[
'Lists' => $this->registerManagement->countByMonthly($request->input('room')),
'rooms' => $this->roomRepository->getRoomList()
]);
}
}
/**
* 月毎の集計を表示
*/
public function totalToMonthly(Request $request)
{
return redirect('management/total?room='.$request->room);
}
次にリポジトリの処理。
今回は集計処理を行うDBアクセスと、部屋の値段を取得するDBアクセスを行い、PHP側で金額を算出させます。
/**
* 月毎に集計する
*/
public function countByMonthly($room = 1)
{
$lists = ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), 'rooms.name as roomname')
->leftJoin('reserve_day_list_reserve_management', 'reserve_day_lists.id', '=', 'reserve_day_list_reserve_management.reserve_day_list_id')
->leftJoin('reserve_managements', 'reserve_day_list_reserve_management.reserve_management_id', '=', 'reserve_managements.id')
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->where('reserve_managements.lodging', true)
->where('rooms.id', $room)
->groupby('yearmonth')
->groupby('roomname')
->get();
$model3 = Room::where('id', $room)->first();
$ret = array();
$index = 0;
foreach($lists as $list)
{
$list->total = $list->count * $model3->price;
$ret[$index] = $list;
$index++;
}
return $ret;
}
テーブルはすべて結合。
年月と部屋名でグループ分けすることで、それごとのレコード数を取得することができます。
さらに、WHERE句で部屋IDを指定することによって、必要な部屋の情報だけを取得することができます。
この関数の引数は部屋ID=1で初期化してあります。
この関数を使用するときに、引数を入れなければ、値1として処理実行されます。
これは部屋IDが指定されない場合のデフォルト処理として使用します。
これで一通り必要な機能は実装できたはず。
最終確認して提出したいと思います。
バナークリックで応援よろしくお願いします。
イノシシ肉を、姿そのままで購入しました。
角煮を作ろうと思いましたが、思った以上にバラにお肉がなくて、 急遽、晩酌用のビールを使ってカルボナード(ビール煮)にしました。
お肉が箸で切れるぐらい柔らかく仕上がりました。
味付けは濃いめにした方が、お酒のあてとしては最高だと思います。
今回使わなかった部位は、後ほど食材として使用します。
ナレーション:ついなちゃん(VOICEROID2)
おそらく、レベル25の楽曲で一番難しいとされている曲「ティアドロップス」
難しいと言われている所以が、以下の3連スライドなのです。
ここでつまずく人が多い。(オイラも含めて)
まず、こういった、同じところでつまずく場合は、一度プレイ画面をキャプチャ録画して、どこでミスしているのかを確認した方が良いです。
上の動画では、二つ目のスライドの始点でミスしているのがわかりますね。
スライドは始点と終点の指の位置が合っていないとミスト判定される可能性が高いです。
始点と終点の指の位置が正確になるように、意識してプレイして見るとクリアできる確率が高くなりますよ。
最後に、オイラはフルコンしたという証拠を。
本日の成果。
まぁ、前回から、反射の設定しただけと、玉の色を変えただけなんですけどね。
テキストの切りが良いので。
前回までの状況はこちら
最新ソースはこちら
https://github.com/takishita2nd/hotel-mng
今回は予約一覧とスケジュール一覧を部屋でフィルタをかける修正を行います。
フィルタに部屋を追加します。
{!! Form::open(['url' => action('RegisterManagementController@indexToMonthly')]) !!}
<table>
<tr>
<td>{!! Form::selectYear('year', 2019, 2020) !!}年</td>
<td>{!! Form::selectMonth('month') !!}</td>
<td>{!! Form::select('room', $rooms) !!}</td>
<td>{!! Form::submit('表示') !!}</td>
</tr>
</table>
{!! Form::close() !!}
部屋情報をViewに渡し、選択した部屋IDを受け取るようにコントローラーを修正します。
public function index(Request $request)
{
if(is_null($request->input('year')) || is_null($request->input('month')) || is_null($request->input('room')))
{
return view('register.index',
[
'registerLists' => $this->registerManagement->getList(),
'rooms' => $this->roomRepository->getRoomList()
]
);
}
else
{
return view('register.index',
[
'registerLists' => $this->registerManagement->getListByMonth($request->input('year'),
$request->input('month'),
$request->input('room')),
'rooms' => $this->roomRepository->getRoomList()
]
);
}
}
public function indexToMonthly(Request $request)
{
return redirect('management?year='.$request->year.'&month='.$request->month.'&room='.$request->room);
}
関数名おかしいけど気にするな。
public function getListByMonth($year, $month, $room)
{
return ReserveManagement::leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
->where('reserve_management_room.room_id', $room)
->where('lodging', false)
->orderBy('start_day')
->get();
}
予約管理テーブルと部屋(正確には中間テーブル)を結合して、指定された部屋番号でwhere句を追加します。
これで得られたリストが年月と部屋でフィルタされたものになります。
同じようにスケジュール一覧も修正します。
public function schedule(Request $request)
{
if(is_null($request->input('year')) || is_null($request->input('month')) || is_null($request->input('room')))
{
return view('register.schedule',
[
'Lists' => $this->registerManagement->getSchedule(),
'rooms' => $this->roomRepository->getRoomList()
]
);
}
else
{
return view('register.schedule',
[
'Lists' => $this->registerManagement->getScheduleByMonth($request->input('year'),
$request->input('month'),
$request->input('room')),
'rooms' => $this->roomRepository->getRoomList()
]
);
}
}
public function scheduleToMonthly(Request $request)
{
return redirect('management/schedule?year='.$request->year.'&month='.$request->month.'&room='.$request->room);
}
public function getScheduleByMonth($year, $month, $room)
{
return ReserveDayList::select('day', 'reserve_managements.name as name', 'rooms.name as room', 'lodging')
->leftJoin('reserve_day_list_reserve_management', 'reserve_day_lists.id', '=', 'reserve_day_list_reserve_management.reserve_day_list_id')
->leftJoin('reserve_managements', 'reserve_day_list_reserve_management.reserve_management_id', '=', 'reserve_managements.id')
->leftJoin('reserve_management_room', 'reserve_managements.id', '=', 'reserve_management_room.reserve_management_id')
->leftJoin('rooms', 'reserve_management_room.room_id', '=', 'rooms.id')
->where('day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
->where('day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
->where('rooms.id', $room)
->orderBy('day')
->get();
}
リポジトリはガッツリ書き換えました。
全部テーブルを結合して、where句でフィルタして、必要な情報をselectして・・・とやって、全部データベース一発で出力できるようにしました。
あとは集計処理ですな。
バナークリックで応援よろしくお願いします。
先日、バンドリクリパのライブビューイングがあったので、その時間までの時間つぶしと、BanG Dream! 3rd seasonの制作発表会のライブ試聴のため、寄っていったお店です。
以前、ランチでおそばを頂いたのですが、ディナーも安く飲めるらしいので、今回このお店を選択しました。
というか、サッポロファクトリーの周りって、飲めるところ少ないよね。
飲み放題90分750円ですが、+230円でビール付きにすることもできます。
日替わりで色々サービスが変わるようです。
入店した日は、鳥ハツとキノコのバター炒めが100円引きでした。
美味しかったのは焼き鶏ね。
味噌とか、特製だれで味付けしてあるの。
めっちゃ美味しかった。
また近くに来ることがあったら寄りたいな。
駅から近いしね。
ごちそうさまでした。
バナークリックで応援よろしくお願いします。
本日の成果。
特にプログラム組まなくてもここまでできました。