【Laravel】ホテル予約管理システム完成

もう少しで完成だから、もうちょっとやって終わろうと思ったら、ガッツリ書き換えることになるというプログラマーあるある。

やっぱり、チェックしたかどうかも管理するべきだろう(もはや仕様変更レベル)と思いました。

データベースに、「チェックしたかどうか」を格納するカラムを追加します。

マイグレーションファイルを作成し、マイグレートします。

class AddSubmit extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->boolean('lodging');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserve_managements', function (Blueprint $table) {
            $table->dropColumn('lodging');
        });
    }
}

ちょっと名前がいろいろとアレだけど、あとから直すの面倒くさいので、そのまま使用する。(ちゃんと前もって設計しなさい、という話。)

予約一覧にチェックしたらポチるボタンを設置。

                    <table class="management">
                        <tr>
                            <th class="name">名前</th>
                            <th class="address">住所</th>
                            <th class="phone">電話番号</th>
                            <th class="num">人数</th>
                            <th class="date">宿泊日</th>
                            <th class="num">宿泊日数</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="date">{{ $list->start_day }}</td>
                            <td class="num">{{ $list->days }}</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>

ポチったらPOSTでid番号を受け取り、追加したカラムをtrueに変更して予約一覧へリダイレクト。

    /**
     * 宿泊処理確認
     *
     * @return \Illuminate\Http\Response
     */
    public function lodging(Request $request)
    {
        $this->registerManagement->lodging($request->id);
        return redirect('management');
    }
    /**
     * 宿泊処理を行う
     */
    public function lodging($id)
    {
        $model = $this->getItemById($id);
        $model->lodging = true;
        $model->save();
    }

スケジュール一覧にもチェックしたかどうかを表示します。

                    <table class="schedule">
                        <tr>
                            <th class="date">日時</th>
                            <th class="name">名前</th>
                            <th class="lodging">宿泊状況</th>
                        </tr>
                    @foreach ($Lists as $list)
                        <tr>
                            <td class="date">{{ $list['day'] }}</td>
                            <td class="name">{{ $list['name'] }}</td>
                            @if ($list['lodging'])
                                <td class="lodging">チェック</td>
                            @else
                                <td class="lodging">未チェック</td>
                            @endif
                        </tr>
                    @endforeach
                    </table>
    /**
     * スケジュール一覧を取得する
     */
    public function getSchedule()
    {
        $lists = array();
        $index = 0;
        $models = ReserveDayList::orderBy('day')
                                    ->get();
        foreach($models as $model)
        {
            $lists[$index] = array(
                                'day' => $model->day,
                                'name' => $model->reserveManagements()->first()->name,
                                'lodging' => $model->reserveManagements()->first()->lodging
                            );
            $index++;
        }
        return $lists;
    }

    /**
     * 月別スケジュール一覧を取得する
     */
    public function getScheduleByMonth($year, $month)
    {
        $lists = array();
        $index = 0;
        $models = ReserveDayList::where('day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
                                ->where('day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
                                ->orderBy('day')
                                ->get();
        foreach($models as $model)
        {
            $lists[$index] = array(
                                'day' => $model->day,
                                'name' => $model->reserveManagements()->first()->name,
                                'lodging' => $model->reserveManagements()->first()->lodging
                                );
            $index++;
        }
        return $lists;
    }

集計も、チェック済みのものだけ集計対象にします。

テーブルを結合して、チェック済みの日数を数えます。

    /**
     * 月毎に集計する
     */
    public function countByMonthly()
    {
        return ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), DB::raw('count(*) * 2000 as total'))
                                ->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')
                                ->where('reserve_managements.lodging', true)
                                ->groupby('yearmonth')
                                ->get();
    }

leftJoinが記載が汚いかもしれないけど、これはLaravelであるがゆえの運命。仕方がない。

これで本当に完成。提出してきます。

最終ソースはこちら

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

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

【Laravel】月毎に売上の集計を行う

前回までの状況はこちら

最新ソースはこちら

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

月毎に集計を行います。

このときのデータベースの操作が大変で・・・

    /**
     * 月毎に集計する
     */
    public function countByMonthly()
    {
        return ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), DB::raw('count(*) * 2000 as total'))
                                ->groupby('yearmonth')
                                ->get();
    }

リポジトリはこれでなんとかできました。

select文でdayカラムをYYYY-mmのフォーマットで出力(このカラム名をyearmonthとする)。

yearmonthごとにgroupByでグループ分けし、count(*)で集計を行います。

もっとうまい方法があるかもしれませんが、迷ったらDB::raw()を使ったほうがいいかもしれません。

でも、これができれば完成したも同然。

簡単すぎるので、コードは省略。

あとは最後の微調整で完成ですね。

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