株式会社WR

株式会社WR

WEB TOTAL CONSULTING

PHPとLaravelで予約・顧客管理システムを構築する際の設計ポイント
ブログ一覧へ
技術ブログ

PHPとLaravelで予約・顧客管理システムを構築する際の設計ポイント

弊社ではガソリンスタンド・サロン・クリニックなど様々な業種向けの予約・顧客管理システムをLaravelで構築してきました。本記事では、再利用性と保守性を高めるための設計ポイントをまとめます。

はじめに

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);
});

まとめ

汎用的な設計を意識することで、業種ごとのカスタマイズを最小限に抑えながら、高品質なシステムを効率よく構築できます。予約・顧客管理システムの開発についてはお気軽にご相談ください。

Category 技術ブログ

Related Posts

関連記事

開発・技術のご相談はお気軽に

お見積りは無料です。まずはお気軽にご相談ください。

お問い合わせ →