もう少しで完成だから、もうちょっとやって終わろうと思ったら、ガッツリ書き換えることになるというプログラマーあるある。
やっぱり、チェックしたかどうかも管理するべきだろう(もはや仕様変更レベル)と思いました。
データベースに、「チェックしたかどうか」を格納するカラムを追加します。
マイグレーションファイルを作成し、マイグレートします。
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
バナークリックで応援よろしくおねがいします。
