はじめに
Laravelで予約・顧客管理システムを構築する際、業種ごとの仕様の違いをどう吸収するかが設計の鍵になります。弊社が複数業種のシステムを開発してきた経験から、実際に役立った設計ポイントをご紹介します。
1. スキーマ設計:予約の汎用化
業種を問わず共通する「予約」の本質は「誰が・いつ・何を・どこで予約するか」です。
reservations
- id
- customer_id
- resource_id // スタッフ / 席 / 部屋など
- service_id // メニュー / 施術内容など
- start_at
- end_at
- status // pending / confirmed / cancelled
- note
このように汎用化しておくと、業種が変わっても基本ロジックを流用できます。
2. ダブルブッキング防止
予約システムで最も重要なのは同一リソースの重複予約を防ぐことです。
public function isAvailable(int $resourceId, Carbon $start, Carbon $end): bool
{
return !Reservation::where('resource_id', $resourceId)
->where('status', '!=', 'cancelled')
->where(function ($q) use ($start, $end) {
$q->whereBetween('start_at', [$start, $end])
->orWhereBetween('end_at', [$start, $end])
->orWhere(function ($q) use ($start, $end) {
$q->where('start_at', '<=', $start)
->where('end_at', '>=', $end);
});
})->exists();
}
3. 顧客管理:来店履歴の活用
顧客管理において「来店回数」「最終来店日」「累計利用金額」はCRM的な観点から重要なデータです。
// Customerモデルに追加
public function getVisitCountAttribute(): int
{
return $this->reservations()->where('status', 'completed')->count();
}
public function getLastVisitAttribute(): ?Carbon
{
return $this->reservations()
->where('status', 'completed')
->max('start_at');
}
4. 管理画面の権限管理
スタッフ・管理者など役割ごとに操作できる機能を分けます。Laravelのミドルウェアを活用して実装します。
// routes/web.php
Route::middleware(['auth:admin'])->group(function () {
Route::resource('customers', Admin\CustomerController::class);
Route::resource('staff', Admin\StaffController::class);
});
まとめ
汎用的な設計を意識することで、業種ごとのカスタマイズを最小限に抑えながら、高品質なシステムを効率よく構築できます。予約・顧客管理システムの開発についてはお気軽にご相談ください。