# TOLTO（トルト）プロジェクト - Claude Code 指示書

> **このファイルはClaude Codeへの包括的な開発指示書です。**
> プロジェクトの全要件・画面定義・DB設計・API仕様をまとめています。

---

## 1. プロジェクト概要

### サービス名
**TOLTO（トルト）** - イベント予約プラットフォーム

### コンセプト
「挑戦が生まれ、広がり、続くためのインフラ」
予約 × 場所 × 集客 × 信頼 を1つの流れでつなぐ。

### 発注者
株式会社グラシーズ（東北中心にレンタルスペース・民泊16店舗運営）

### 開発者
合同会社terzweb

---

## 2. 技術スタック

```
バックエンド  : PHP 8.2+ / Laravel
DB           : MySQL 8.0+
フロント      : Blade + Tailwind CSS
LINE連携      : LIFF (LINE Front-end Framework)
外部API       : LINE Messaging API / LINE Login / Google Calendar API / Stripe Connect
SSL/WAF       : 本番環境で導入
```

---

## 3. ユーザー定義（確定）

| ロール | 対象 | 説明 |
|--------|------|------|
| **ホスト（Free）** | GRASSESビジネス会員 | 無料プラン。日時固定イベント・GRASSES直営スペースのみ |
| **ホスト（Pro）** | GRASSESビジネス会員 | 有料月額プラン。フリー予約・全スペース利用可 |
| **ゲスト** | イベント参加希望者 | イベント検索・予約・参加 |
| **サポーター** | インフルエンサー等 | Ver 2.0以降。DB余白のみ確保 |
| **マスター** | 株式会社グラシーズ | 全体管理・スペース管理・ダッシュボード |

---

## 4. LINE構成（2層構造・確定）

```
GRASSES公式LINE（既存）
  └ リッチメニューに「イベント管理（TOLTO）」ボタンを追加
      └ タップ → TOLTO公式LINE（新規）へ遷移

TOLTO公式LINE（新規作成）
  └ ゲスト：予約完了通知・リマインド・マイページ
  └ ホスト：イベント作成・管理・予約者確認
```

---

## 5. スペース定義（確定）

| 種別 | 説明 | 予約方法 |
|------|------|----------|
| **GRASSES直営店舗** | GRASSES運営の直営スペース | よやクルproと連携 → Googleカレンダーで空き確認 |
| **準直営店舗** | GRASSES運用代行スペース | TOLTO内カレンダーで空き管理・予約完結 |
| **任意スペース（Pro限定）** | ホストが自身のイベント専用に登録 | ホスト自身のみ使用。ポータル非表示 |

### スペース予約チェックロジック（重要）
- **直営スペース**: よやクルproでスペース予約 → Googleカレンダーに予定が入る → TOLTOがGoogleカレンダーを自動チェック → 予定確認できた場合のみイベント公開可
- **準直営スペース**: TOLTO内カレンダーで枠確保 → 枠が確保されていない状態ではイベント公開不可 → スペース予約キャンセル時はイベント自動非公開
- **任意スペース**: チェックなし（ホスト自身のスペースのため）

---

## 6. 機能定義（Ver 1.0スコープ）

### 6-1. ホスト（Free）
- イベント作成（日時固定のみ）
- スペース選択：GRASSES直営のみ
- 予約受付ページ自動生成（LIFF / WEB）
- 予約者一覧・キャンセル処理
- Googleカレンダー連携
- ポータル掲載（通常表示）
- 同時公開イベント上限（例：3件）

### 6-2. ホスト（Pro）
- 日時未指定フリー予約
- 複数時間帯・無制限・複製
- スペース選択：直営 + 準直営 + 任意スペース登録
- ポータル上位表示・Proバッジ・実績可視化
- 顧客管理・カルテ機能
- 外部予定取込み・Googleカレンダー双方向同期
- Stripe Connect決済連携

### 6-3. ゲスト
- イベント検索（カテゴリ・日付・エリア・参加費）
- イベント詳細・主催者プロフィール確認
- 予約申込み（カード決済 or 当日現金払い）
- 予約完了通知（TOLTO公式LINE）
- マイページ・予約履歴・キャンセル申請
- 領収書PDF発行（予約完了後）
- Googleカレンダー追加

### 6-4. マスター（GRASSES）
- 全体ダッシュボード（KPI: ホスト数・ゲスト数・予約数・売上）
- スペース管理（直営・準直営の登録・編集・公開管理）
- ユーザー管理（ホスト/ゲスト一覧・停止・削除）
- イベント管理（一覧・非公開・ポータル掲載管理）
- 予約管理（全予約一覧・CSV出力）
- 特集・推薦枠設定（ポータルのおすすめ枠・バナー）
- メルマガ配信（対象選択・本文・配信履歴）
- 管理者管理（権限：スーパー管理者 / 管理者 / 閲覧専用）
- システム設定（プラン料金・通知設定・API連携キー管理）

### 6-5. Ver 2.0以降（スコープ外・DB余白のみ確保）
- TOLTOポイント（ホスト・ゲスト双方への付与）
- サポーター機能（PRマッチング・拡散依頼）
- よやクルpro完全代替（スペース予約のTOLTO統合）

---

## 7. DB設計（主要テーブル）
- ユーザ名  tolto
- パスワード  s+d;r17,}#C2@q
- DB名  tolto

```sql
-- ユーザー
users
  id, line_user_id, name, email, phone, role(host/guest/supporter/master),
  plan(free/pro), profile_text, profile_image, area, genres(json),
  sns_instagram, sns_x, sns_homepage, sns_line,
  stripe_account_id, google_calendar_id,
  status(active/suspended), created_at, updated_at

-- スペース
spaces
  id, master_id(users.id), name, type(owned/proxy/custom),
  description, address, prefecture, city, building,
  capacity, price_per_hour, amenities(json), images(json),
  available_days(json), open_time, close_time,
  google_calendar_id, yoyakuru_link,
  status(public/private/draft), created_at, updated_at

-- イベント
events
  id, host_id(users.id), space_id(spaces.id),
  title, description, category, images(json),
  type(fixed/free), start_at, end_at,
  capacity, min_capacity, price, payment_type(free/cash/stripe),
  status(draft/public/closed/cancelled),
  portal_featured(bool), google_calendar_event_id,
  space_reserved(bool), -- スペース予約確認フラグ
  created_at, updated_at

-- 予約
bookings
  id, event_id(events.id), guest_id(users.id),
  booking_number(TOLTO-YYYYMMDD-XXXX),
  name, email, phone, note,
  payment_type, payment_status(pending/paid/refunded),
  stripe_payment_intent_id, amount,
  receipt_issued(bool),
  status(confirmed/cancelled), created_at, updated_at

-- 顧客管理（ホスト視点）
host_customers
  id, host_id(users.id), guest_id(users.id),
  tags(json), memo, total_bookings, total_amount,
  first_booked_at, last_booked_at, created_at, updated_at

-- TOLTOポイント（Ver2.0用余白）
point_balances
  id, user_id, balance, created_at, updated_at

point_histories
  id, user_id, action, points, related_id, created_at

-- サポーター（Ver2.0用余白）
supporter_profiles
  id, user_id, genres(json), followers, pr_rate, created_at, updated_at

-- 通知ログ
notification_logs
  id, user_id, type(line/email), trigger, content, sent_at
```

---

## 8. API設計（主要エンドポイント）

```
# 認証
POST   /api/auth/line          LINE Loginコールバック
POST   /api/auth/logout
GET    /api/auth/me

# ユーザー
GET    /api/users/{id}/profile
PUT    /api/users/{id}/profile
PUT    /api/users/{id}/plan    プランアップグレード

# スペース（マスター管理）
GET    /api/spaces
POST   /api/spaces
PUT    /api/spaces/{id}
DELETE /api/spaces/{id}
GET    /api/spaces/{id}/calendar    空き状況取得
POST   /api/spaces/{id}/reserve     枠確保
DELETE /api/spaces/{id}/reserve     枠解放 → イベント自動非公開

# イベント
GET    /api/events             検索・一覧（ゲスト向け公開）
POST   /api/events             作成（ホスト）
GET    /api/events/{id}
PUT    /api/events/{id}
DELETE /api/events/{id}
POST   /api/events/{id}/publish    公開（スペース予約チェック実行）
POST   /api/events/{id}/duplicate  複製（Pro）

# 予約
GET    /api/bookings           一覧（ホスト：自分のイベント / ゲスト：自分の予約）
POST   /api/bookings           予約申込み
PUT    /api/bookings/{id}/cancel
GET    /api/bookings/{id}/receipt  領収書PDF

# 決済（Stripe）
POST   /api/stripe/connect         Stripe Connect連携
POST   /api/stripe/payment-intent  決済インテント作成
POST   /api/stripe/webhook         Stripeウェブフック

# Googleカレンダー
GET    /api/google/auth            OAuth認証URL発行
POST   /api/google/callback        コールバック
GET    /api/google/events          カレンダー予定取得（スペース予約チェック）

# LINE Messaging
POST   /api/line/webhook           LINEウェブフック受信
POST   /api/line/notify/{bookingId} 予約通知送信（内部）

# マスター（管理者専用）
GET    /api/admin/dashboard
GET    /api/admin/users
PUT    /api/admin/users/{id}/status
GET    /api/admin/events
GET    /api/admin/bookings
POST   /api/admin/featured         特集枠設定
POST   /api/admin/newsletter       メルマガ配信
```

---

## 9. 画面一覧

### 認証系
- ホスト登録画面（LINE連携 → プロフィール → プラン選択）
- ホストログイン画面（LINEログイン / メール+パスワード）
- ゲスト登録画面（LINE連携 → 基本情報 → 通知設定）
- ゲストログイン画面（LINEログイン / メール / ゲスト予約）

### ホスト操作系（LIFF / WEB）
- ホストダッシュボード（KPI・イベント一覧・最新予約・売上グラフ）
- イベント作成画面（基本情報・日時・スペース選択・定員・決済・公開設定）
- 空き管理カレンダー（月次カレンダー・時間コマ表示）
- 予約者一覧・管理（絞り込み・キャンセル・CSV出力・一括メール）
- 顧客管理一覧（タグ：VIP/常連/新規/休眠・参加回数・累計金額）
- 顧客カルテ詳細（参加履歴・メモ・タグ管理・個別メッセージ送信）
- プロフィール編集（アイコン・自己紹介・SNSリンク・ジャンル・公開設定）
- Stripe Connect連携設定
- Googleカレンダー連携設定

### ゲスト操作系（LIFF / WEB）
- イベント検索・一覧（キーワード・カテゴリ・日付・エリア・参加費）
- イベント詳細（主催者プロフィール・実績バッジ・申込みボタン）
- 予約申込み（参加者情報・カード決済フォーム・合計確認）
- 予約完了（予約番号・領収書・Googleカレンダー追加・LINE友だち追加）
- マイページ（参加回数・ポイント残高・予約履歴・通知設定）
- 主催者公開ページ（開催実績・イベント一覧・SNSリンク）

### マスター管理画面（AdminLTE風）
- ダッシュボード（KPI4枚・最新予約・今後のイベント・月次サマリー）
- スペース管理（一覧・登録・編集）
- イベント管理（一覧・非公開・掲載管理）
- ユーザー管理（ホスト/ゲストタブ・停止・CSV）
- 予約管理（全件一覧・CSV）
- 特集・推薦枠設定
- メルマガ配信
- 管理者管理（テーブル編集・権限マトリクス）
- システム設定（基本設定・プラン料金・通知設定・API連携キー）

### 共通
- スペース登録・編集画面（基本情報・所在地・写真・利用可能時間帯・設備・外部連携）
- 404エラーページ
- 503メンテナンスページ

---

## 10. 通知設計

| タイミング | 送信先 | LINE | メール |
|-----------|--------|------|--------|
| 予約完了 | ゲスト・ホスト | ✅ | ✅ |
| 前日リマインド | ゲスト | ✅ | — |
| 当日リマインド | ゲスト | ✅ | — |
| キャンセル | ゲスト・ホスト | ✅ | ✅ |
| スペース予約キャンセル → イベント自動非公開 | ホスト | ✅ | — |

---

## 11. 開発スケジュール（目安）

```
フェーズ0（4月中）    : 契約締結・環境構築
フェーズ1（4月下旬〜）: 要件定義・Figma・DB設計・API設計
フェーズ2（5月〜6月） : バックエンド開発（15人日）
フェーズ3（5月〜6月） : フロントエンド開発（15人日）
フェーズ4（6月下旬〜）: テスト・UAT・リリース
リリース目標          : 2026年6月末〜7月上旬
```

---

## 12. 実装上の注意事項

### セキュリティ
- CSRF対策（LaravelデフォルトのCSRFトークン）
- LIFF経由はLINEトークン検証を必須とする
- Stripeウェブフックは署名検証を実装
- 管理画面はIP制限 or 2段階認証を検討

### スペース予約チェック（重要ロジック）
```php
// イベント公開時のチェックフロー
public function publishEvent(Event $event): bool
{
    if ($event->space->type === 'owned') {
        // 直営：Googleカレンダーに該当予定があるか確認
        return $this->googleCalendarService->checkReservation($event);
    }
    if ($event->space->type === 'proxy') {
        // 準直営：TOLTO内で枠が確保されているか確認
        return $event->space_reserved === true;
    }
    // 任意スペース：チェックなし
    return true;
}

// 枠解放時にイベントを自動非公開
public function releaseSpaceReservation(Space $space, Carbon $date): void
{
    Event::where('space_id', $space->id)
        ->whereDate('start_at', $date)
        ->where('status', 'public')
        ->update(['status' => 'closed', 'space_reserved' => false]);

    // ホストにLINE通知
    $this->lineService->notifyHostSpaceCancelled($space, $date);
}
```

### 任意スペース（Pro）
- ホスト自身のみが使用するスペース
- ポータル・スペース一覧には表示しない（`portal_visible = false`）
- マスターのスペース管理一覧にも表示しない

### 領収書PDF
- 予約完了後に自動生成
- LINEまたはメールでPDFリンクを送付
- ゲストがダウンロード・印刷できる形式

### ヘッダー制御
- LIFF表示時：ヘッダーなし（LINEのバーが代替）
- WEB表示時：TOLTOヘッダー（ロゴ・ナビメニュー）あり
- LP（サービス紹介ページ）は別途制作（今回スコープ外）

---

## 13. ディレクトリ構成（推奨）

```
tolto/
├── app/
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Auth/          LINE認証
│   │   │   ├── Host/          ホスト操作
│   │   │   ├── Guest/         ゲスト操作
│   │   │   ├── Admin/         マスター管理
│   │   │   └── Api/           APIエンドポイント
│   │   └── Middleware/
│   │       ├── CheckRole.php   ロール確認
│   │       └── CheckLiff.php   LIFF検証
│   ├── Models/
│   │   ├── User.php
│   │   ├── Space.php
│   │   ├── Event.php
│   │   ├── Booking.php
│   │   └── HostCustomer.php
│   └── Services/
│       ├── LineService.php        LINE Messaging API
│       ├── GoogleCalendarService.php
│       ├── StripeService.php
│       └── NotificationService.php
├── resources/views/
│   ├── liff/          LIFF画面（ヘッダーなし）
│   ├── web/           WEB画面（ヘッダーあり）
│   └── admin/         管理画面（AdminLTE）
└── routes/
    ├── api.php
    ├── web.php
    └── admin.php
```

---

## 14. 環境変数（.env）

```env
APP_NAME=TOLTO
APP_URL=https://tolto.jp

DB_CONNECTION=mysql
DB_DATABASE=tolto
DB_USERNAME=
DB_PASSWORD=

# LINE
LINE_CHANNEL_ID=
LINE_CHANNEL_SECRET=
LINE_CHANNEL_ACCESS_TOKEN=
LINE_LIFF_ID=
LINE_REDIRECT_URI=

# Googleカレンダー
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=

# Stripe
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_WEBHOOK_SECRET=
```

---

## 15. 開発優先順位

```
Step 1: Laravelプロジェクト作成・DB設計・マイグレーション
Step 2: LINE Login認証実装
Step 3: スペース管理API（マスター）
Step 4: イベント管理API（ホスト）
Step 5: 予約管理API（ゲスト）
Step 6: スペース予約チェックロジック実装
Step 7: Stripe Connect連携
Step 8: LINE Messaging通知
Step 9: Googleカレンダー連携
Step 10: LIFF画面実装
Step 11: WEBポータル実装
Step 12: 管理者画面（AdminLTE）実装
Step 13: 領収書PDF生成
Step 14: テスト・UAT
```

---

*最終更新: 2026年5月*
*作成: 合同会社terzweb 湯澤照人*