【Laravel】【ホテル予約管理】部屋ごとに集計する

前回までの状況はこちら。

最新ソースはこちら。(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)


【バンドリ】【ガルパ】ティアドロップスの3連スライドを攻略するのです!

おそらく、レベル25の楽曲で一番難しいとされている曲「ティアドロップス」

難しいと言われている所以が、以下の3連スライドなのです。

ここでつまずく人が多い。(オイラも含めて)

まず、こういった、同じところでつまずく場合は、一度プレイ画面をキャプチャ録画して、どこでミスしているのかを確認した方が良いです。

上の動画では、二つ目のスライドの始点でミスしているのがわかりますね。

スライドは始点と終点の指の位置が合っていないとミスト判定される可能性が高いです。

始点と終点の指の位置が正確になるように、意識してプレイして見るとクリアできる確率が高くなりますよ。

最後に、オイラはフルコンしたという証拠を。

【Laravel】【ホテル予約管理】部屋でフィルタをかける

前回までの状況はこちら

最新ソースはこちら

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円引きでした。

美味しかったのは焼き鶏ね。

味噌とか、特製だれで味付けしてあるの。

めっちゃ美味しかった。

また近くに来ることがあったら寄りたいな。

駅から近いしね。

ごちそうさまでした。

バナークリックで応援よろしくお願いします。

【Laravel】スケジュールの重複をチェックする

前回までの状況はこちら。

最新ソースはこちら。

https://github.com/takishita2nd/hotel-mng

今回も内容薄いかもしれん。

今までは予約登録時、日にちが重複していればエラーを表示させていました。

これが通用するのは部屋が一つしか無い場合のみでして、

今回は部屋が複数あるので、日にちだけのチェックだけではなくて、部屋もチェックに含めなければいけません。

というわけで、引数に部屋IDを追加。

    /**
     * 登録処理
     */
    public function store(ManagementRequest $request)
    {
        if($this->registerManagement->checkSchedule($request->start_day, 
                                                    $request->days, 
                                                    $request->room) == false)
        {
            return redirect('management/create')
                        ->with(['error' => 'スケジュールが重複します'])
                        ->withInput();
        }
    /**
     * 更新処理
     */
    public function update(ManagementRequest $request)
    {
        if($this->registerManagement->checkScheduleForUpdate($request->start_day, 
                                                            $request->days, 
                                                            $request->id, 
                                                            $request->room) == false)
        {
            return redirect('management/create')
                        ->with(['error' => 'スケジュールが重複します'])
                        ->withInput();
        }

そしてチェック処理本体。

    /**
     * スケジュールの重複を確認する
     * 
     * @return boolean
     */
    public function checkSchedule($date, $num, $room)
    {
        for($i = 0; $i < $num; $i++)
        {
            $record = ReserveDayList::where(['day' => date('Y-m-d', strtotime($date.'+'.$i.' day'))])->first();
            if(is_null($record) == false)
            {
                if($record->reserveManagements()->first()->rooms()->first()->id == $room)
                {
                    return false;
                }
            }
        }

        return true;
    }
    /**
     * 更新時のスケジュールの重複を確認する
     * 
     * @return boolean
     */
    public function checkScheduleForUpdate($date, $num, $userId, $room)
    {
        for($i = 0; $i < $num; $i++)
        {
            $model2 = ReserveDayList::where(['day' => date('Y-m-d', strtotime($date.'+'.$i.' day'))])->first();
            if(is_null($model2) == false)
            {
                if($model2->reserveManagements()->first()->rooms()->first()->id == $room)
                {
                    if($model2->reserveManagements()->first()->id != $userId)
                    {
                        return false;
                    }
                }
            }
        }

        return true;
    }

strtotime($date.’+0 day’)ってできたんだ。

やってることは部屋チェックを追加しただけです。

簡単ですね。

これで、日付は同じだけど部屋が違う場合は予約可、日付と部屋が同じ場合は予約不可、というロジックが完成しました。

バナークリックで応援よろしくおねがいします。

【バンドリ】【ガルパ】BanG Dream! 3rd SEASON発表会での新情報

本日行われたBanG Dream! 3rd season発表会の内容からバンドリ!ガールズバンドパーティ!の情報を抜粋します。

新曲追加

BanG Dream! 3rd seasonのOP「イニシャル」が本日21時に追加されました。

他2曲も実装予定です。

カバー曲キャンペーン。

Twitter上での予想は、

マクロス・Fの「ライオン」?

五等分の花嫁の「五等分の気持ち」?

「!」はいろいろ予想が別れているようです。

というか、これだけじゃわからんわ。

12月22日のハロハピ放送局で明らかになるようです。

その他、ログインキャンペーンなどが行われます。

年末年始も眠れない。