Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
詳細なドキュメントは docs/ フォルダにあります。 ❌ 新規ページ作成時のチェックリスト • Guidelines.mdの店舗識別色を適用 • 公演カテゴリ色を正しく使用 • ShadCN UIコンポーネントを優先使用 • container mx-auto px-4 + space-y-6の統一レイアウト • 警告表示はborder-2でアウトライン(背景色なし) • タイポグラフィはglobals.cssに依存、Tailwindクラス禁止 📅 スケジュール管理(リストカレンダー特殊仕様) • 月間Table形式: 従来のグリッド型カレンダーではなく、独特なTable構造のリスト表示 • 複雑なデータ構造: scheduleEvents[monthKey: DaySchedule[]]による階層管理 • 6店舗×時間帯対応: 朝・昼・夜の3時間帯に加え、自由時間設定可能 • 状態管理: localStorage + Supabase双方向同期 • 色システム: 店舗識別色(背景)+ 公演カテゴリ色(バッジ)の複合表示 • 公演中止・復活機能: isCancelledフラグ + opacity-50 + Ban icon表示 • 予約連携: モックデータによる予約人数表示(将来的にStores予約API連携)檢視完整 README ↗
6店舗対応のマーダーミステリー店舗管理システム
詳細なドキュメントは docs/ フォルダにあります。
| ドキュメント | 説明 |
|---|---|
| docs/index.md | ドキュメント目次(ここから始める) |
| docs/system-overview.md | システム全体像・技術スタック |
| docs/features.md | 各機能の概要 |
| docs/pages.md | 全ページ一覧・ルーティング |
| docs/development/ | 開発ルール・コーディング規約 |
| docs/setup/ | 各種セットアップガイド |
| docs/features/ | 機能別詳細ドキュメント |
text-*, font-*, leading-*クラス使用絶対禁止container mx-auto px-4 + space-y-6の統一レイアウトborder-2でアウトライン(背景色なし)scheduleEvents[monthKey: DaySchedule[]]による階層管理isCancelledフラグ + opacity-50 + Ban icon表示npm install
.env.local ファイルを作成:
VITE_SUPABASE_URL=https://lgyhbagdfdyycerijtmk.supabase.co
VITE_SUPABASE_PUBLISHABLE_KEY=sb_publishable_...
# 互換用(Legacy API Keysが有効な場合のみ)
# VITE_SUPABASE_ANON_KEY=eyJ...
# スキーマの確認
npm run db:check
# データベースの差分確認
npm run db:diff
# データベースリセット(必要に応じて)
npm run db:reset
npm run dev
database/create_tables.sqldatabase/README.mdnpm run db:checkgm_fee → gm_assignmentsへの移行INTEGER → JSONBへの変更CHECK制約の追加database/README.mdを更新npm run build
# dist フォルダをNetlifyにデプロイ
npm run build
# Vercel CLIまたはGitHub連携でデプロイ
| 店舗名 | 短縮名 | カラー | 収容人数 | Guidelines.md色指定 |
|---|---|---|---|---|
| 高田馬場店 | 馬場 | 🔵 青 | 8名 | bg-blue-50 border-blue-200 |
| 別館① | 別館① | 🟢 緑 | 6名 | bg-green-50 border-green-200 |
| 別館② | 別館② | 🟣 紫 | 6名 | bg-purple-50 border-purple-200 |
| 大久保店 | 大久保 | 🟠 橙 | 7名 | bg-orange-50 border-orange-200 |
| 大塚店 | 大塚 | 🔴 赤 | 6名 | bg-red-50 border-red-200 |
| 埼玉大宮店 | 埼玉大宮 | 🟤 茶 | 8名 | bg-amber-50 border-amber-200 |
ログインページ(共通)
role=admin/staff/customerでルーティング自動切替管理者ダッシュボード(Admin専用)
店舗管理ページ
シナリオ管理ページ
スタッフ管理ページ
リストカレンダー(ScheduleManager)
スケジュール詳細/編集
予約一覧(管理用)
顧客管理ページ
顧客トップページ
公演一覧ページ(顧客用)
予約フォームページ
マイページ(顧客用)
売上管理ページ
在庫管理ページ
通知・リマインダーシステム
schedule_events 正規化(必須対応)-- 段階的移行推奨
-- フェーズ1: 既存システム維持
-- フェーズ2: 新カラム追加
ALTER TABLE schedule_events
ADD COLUMN scenario_id UUID REFERENCES scenarios(id) ON DELETE RESTRICT,
ADD COLUMN store_id UUID REFERENCES stores(id) ON DELETE RESTRICT,
ADD COLUMN start_at TIMESTAMPTZ NOT NULL,
ADD COLUMN end_at TIMESTAMPTZ NOT NULL,
ADD COLUMN published BOOLEAN NOT NULL DEFAULT false,
ADD COLUMN capacity INTEGER,
ADD COLUMN status TEXT NOT NULL DEFAULT 'scheduled';
-- フェーズ3: データ移行スクリプト実行
-- フェーズ4: 旧カラム削除
-- Role ENUM化(タイプミス防止)
CREATE TYPE app_role AS ENUM ('admin','staff','customer');
ALTER TABLE users
ALTER COLUMN role TYPE app_role USING role::app_role,
ALTER COLUMN role SET NOT NULL;
-- RLS基本設定
ALTER TABLE customers ENABLE ROW LEVEL SECURITY;
CREATE POLICY customers_select_self ON customers FOR SELECT
USING (auth.uid() = user_id);
| カラム名 | 型 | 説明 |
|---|---|---|
| id | UUID | PK |
| name | TEXT | 氏名 |
| line_name | TEXT | LINE名 |
| x_account | TEXT | X(旧Twitter)アカウント |
| role | TEXT[] | 役割(複数可) |
| stores | TEXT[] | 担当店舗 |
| ng_days | TEXT[] | 出勤不可日 |
| want_to_learn | TEXT[] | 学びたい内容 |
| available_scenarios | TEXT[] | 担当可能シナリオ(表示用) |
| notes | TEXT | メモ |
| phone | TEXT | 電話番号 |
| TEXT | メールアドレス | |
| availability | TEXT[] | 出勤可能日 |
| experience | INTEGER | 経験年数 |
| special_scenarios | TEXT[] | 得意シナリオ |
| status | TEXT | 'active' / 'inactive' / 'on-leave' |
| created_at | TIMESTAMPTZ | 作成日時 |
| updated_at | TIMESTAMPTZ | 更新日時 |
| カラム名 | 型 | 説明 |
|---|---|---|
| staff_id | UUID | staff.id(FK) |
| scenario_id | UUID | scenarios.id(FK) |
| assigned_at | TIMESTAMPTZ | 担当開始日時 |
| notes | TEXT | 備考 |
| PRIMARY KEY | (staff_id, scenario_id) | 複合主キー |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | UUID | PK |
| title | TEXT | シナリオ名 |
| description | TEXT | 説明 |
| author | TEXT | 作者 |
| license_amount | INTEGER | ライセンス料 |
| duration | INTEGER | 所要時間(分) |
| player_count_min | INTEGER | 最小プレイヤー数 |
| player_count_max | INTEGER | 最大プレイヤー数 |
| difficulty | INTEGER | 難易度(1-5) |
| available_gms | TEXT[] | 担当可能GM |
| rating | DECIMAL(2,1) | 評価 |
| play_count | INTEGER | 累計公演回数 |
| status | TEXT | 'available' / 'maintenance' / 'retired' |
| required_props | TEXT[] | 必要小道具 |
| props | JSONB | 小道具詳細({ name, cost, costType }) |
| genre | TEXT[] | ジャンル |
| production_cost | INTEGER | 制作費合計 |
| production_cost_items | JSONB | 制作費内訳リスト |
| gm_fee | INTEGER | GM代金(標準値) |
| participation_fee | INTEGER | 参加費(標準値) |
| notes | TEXT | メモ |
| has_pre_reading | BOOLEAN | 事前読解有無 |
| release_date | DATE | 公開日 |
| created_at | TIMESTAMPTZ | 作成日時 |
| updated_at | TIMESTAMPTZ | 更新日時 |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | UUID | PK |
| date | DATE | 公演日 |
| venue | TEXT | 会場 |
| scenario | TEXT | シナリオ名 |
| gms | TEXT[] | 担当GM |
| start_time | TIME | 開始時刻 |
| end_time | TIME | 終了時刻 |
| category | TEXT | 公演種別(オープン/貸切/テスト等) |
| reservation_info | TEXT | 予約情報 |
| notes | TEXT | メモ |
| is_cancelled | BOOLEAN | キャンセルフラグ |
| created_at | TIMESTAMPTZ | 作成日時 |
| updated_at | TIMESTAMPTZ | 更新日時 |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | UUID | PK |
| reservation_number | TEXT | 予約番号(ユニーク) |
| reservation_page_id | TEXT | 予約ページID |
| title | TEXT | 予約タイトル |
| scenario_id | UUID | FK: シナリオ |
| store_id | UUID | FK: 店舗 |
| customer_id | UUID | FK: 顧客 |
| requested_datetime | TIMESTAMPTZ | 希望日時 |
| actual_datetime | TIMESTAMPTZ | 実際の来店日時 |
| duration | INTEGER | 予約時間(分) |
| participant_count | INTEGER | 参加人数 |
| participant_names | TEXT[] | 参加者名リスト |
| assigned_staff | TEXT[] | 担当スタッフID配列 |
| gm_staff | TEXT | メインGMスタッフID |
| base_price | INTEGER | 基本料金 |
| options_price | INTEGER | オプション料金 |
| total_price | INTEGER | 合計金額 |
| discount_amount | INTEGER | 割引額 |
| final_price | INTEGER | 最終支払額 |
| payment_status | TEXT | 支払状況 |
| payment_method | TEXT | 支払方法 |
| payment_datetime | TIMESTAMPTZ | 支払日時 |
| status | TEXT | 予約ステータス |
| customer_notes | TEXT | 顧客メモ |
| staff_notes | TEXT | スタッフメモ |
| special_requests | TEXT | 特別な要望 |
| cancellation_reason | TEXT | キャンセル理由 |
| cancelled_at | TIMESTAMPTZ | キャンセル日時 |
| external_reservation_id | TEXT | 外部システムID |
| reservation_source | TEXT | 予約経路 |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | UUID | PK |
| name | TEXT | 店舗名 |
| short_name | TEXT | 略称 |
| address | TEXT | 住所 |
| phone_number | TEXT | 電話番号 |
| TEXT | メールアドレス | |
| opening_date | DATE | 開店日 |
| manager_name | TEXT | 店長名 |
| status | TEXT | 'active' / 'temporarily_closed' / 'closed' |
| capacity | INTEGER | 定員 |
| rooms | INTEGER | 部屋数 |
| notes | TEXT | メモ |
| color | TEXT | カラーコード |
| created_at | TIMESTAMPTZ | 作成日時 |
| updated_at | TIMESTAMPTZ | 更新日時 |
| カラム名 | 型 | 説明 |
|---|---|---|
| id | UUID | PK |
| scenario_id | UUID | FK: シナリオ |
| scenario_title | TEXT | シナリオ名 |
| kit_number | INTEGER | キット番号 |
| condition | TEXT | 状態(excellent/good/fair/poor/damaged) |
| last_used | DATE | 最終使用日 |
| notes | TEXT | メモ |
| store_id | UUID | FK: 店舗 |
| created_at | TIMESTAMPTZ | 作成日時 |
| updated_at | TIMESTAMPTZ | 更新日時 |
// ✅ 正しい実装例
<Card className="bg-blue-50 border-blue-200"> {/* 店舗識別色 */}
<CardHeader>
<CardTitle>高田馬場店の公演</CardTitle> {/* globals.cssタイポグラフィ */}
</CardHeader>
<CardContent className="space-y-4">
<Badge className="bg-purple-100 text-purple-800">貸切公演</Badge> {/* カテゴリ色 */}
<p>公演の詳細説明...</p> {/* globals.css自動適用 */}
</CardContent>
</Card>
// ❌ 避けるべき実装
<div className="bg-gradient-to-r from-purple-500 to-pink-500 text-2xl font-bold">
{/* 派手な装飾・Tailwindフォントクラス使用 */}
</div>
/* 店舗識別色の正しい使用 */
.takadanobaba-theme {
background: theme(colors.blue.50);
border-color: theme(colors.blue.200);
color: theme(colors.blue.800);
}
/* 公演カテゴリの正しい使用 */
.open-performance-badge {
background: theme(colors.blue.100);
color: theme(colors.blue.800);
}
// 統一レイアウトパターン
<main className="container mx-auto px-4 py-6">
<div className="space-y-6">
<section className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{/* コンテンツ */}
</section>
</div>
</main>
text-*, font-*, leading-*の使用厳禁このシステムは Resend API + 独自ドメイン(mmq.game) を使用してメール送信を行っています。
| メール種類 | トリガー | 送信方法 | 送信元 | ステータス |
|---|---|---|---|---|
| 予約確認メール | 予約完了時 | Edge Function → Resend API | [email protected] | ✅ 実装済み |
| リマインダーメール | スケジュール設定 | Edge Function → Resend API | [email protected] | ✅ 実装済み |
| スタッフ招待メール | スタッフ招待時 | Edge Function → Resend API | [email protected] | ✅ 実装済み |
| パスワードリセット | リセット要求時 | Supabase Auth → Resend SMTP | [email protected] | ✅ 実装済み |
| サインアップ確認 | アカウント作成時 | Supabase Auth → Resend SMTP | [email protected] | ✅ 実装済み |
| キャンセル確認 | 予約キャンセル時 | - | - | ❌ 未実装 |
| 貸切確定通知 | 貸切承認時 | - | - | ❌ 未実装 |
| 貸切却下通知 | 貸切却下時 | - | - | ❌ 未実装 |
メール機能の特徴:
mmq.game を使用(SPF/DKIM/DMARC認証済み)パスワードリセットメールを有効にするには、Supabase Auth SMTP設定が必要です:
1. Supabase Dashboard にアクセス:
https://supabase.com/dashboard/project/cznpcewciwywcqcxktba/settings/auth
2. SMTP Settings セクションで以下を設定:
- Enable Custom SMTP: ON
- Host: smtp.resend.com
- Port: 587
- Username: resend
- Password: [RESEND_API_KEY]
- Sender: [email protected]
3. Save をクリック
詳細: RESEND_QUICK_SETUP.md を参照
完全なセットアップ手順(ドメイン認証、Edge Functions デプロイなど):
# 1. Resend APIキーをSupabase Secretsに設定
supabase secrets set RESEND_API_KEY=re_your_api_key
# 2. すべてのEdge Functionsをデプロイ
./deploy-functions.sh
# または個別にデプロイ
./deploy-single-function.sh send-booking-confirmation
./deploy-single-function.sh send-reminder-emails
./deploy-single-function.sh invite-staff
詳細: EMAIL_SETUP.md を参照
詳細: EMAIL_USAGE_SCENARIOS.md - 全メール使用シーンと実装状況
📚 全ドキュメントの目次は docs/INDEX.md を参照
Queens Waltz マーダーミステリー店舗管理システム
© 2024 Queens Waltz. All rights reserved.
docs/INDEX.md → docs/development/Guidelines.mdの完全理解npm run devでの動作確認🎮 Queens Waltz マーダーミステリー店舗運営を支援する企業級管理システム
このシステムは単なる管理ツールを超え、マーダーミステリー業界の店舗運営を革新する包括的プラットフォームです。美しいデザイン、堅牢なアーキテクチャ、そしてスタッフ・顧客双方の体験向上を実現します。
| created_at | TIMESTAMPTZ | 作成日時 |
| updated_at | TIMESTAMPTZ | 更新日時 |