1. プロジェクト概要
1.1 背景
パチンコホールの店長は「数値管理」「シフト作成」「報告書作成」等の膨大な事務作業に追われ、本来注力すべき接客サービス向上や戦略立案に時間を割けていない。本プロジェクトでは、キクヤ向けに開発した「SETTING OPTIMIZER」をベースに、パチンコホール業界向けSaaSとして横展開する。
1.2 目的
- 店長の事務作業を最大77%カットするAI業務支援SaaS
- 月額サブスクリプション型の継続収益モデルの確立
- 複数ホールへのスケーラブルな提供基盤の構築
1.3 MVPスコープ
MVP(Basicプラン相当)として以下の4機能を実装する。
| # | 機能 | 概要 | 優先度 |
|---|---|---|---|
| F-01 | 計数管理 | 売上分析、台設定最適化(SETTING OPTIMIZER移植) | 必須 |
| F-02 | 労務管理 | アルバイトのシフト自動作成・調整 | 必須 |
| F-03 | 報告書作成 | 店舗フォーマットに合わせた日次/週次報告書の自動生成 | 必須 |
| F-04 | 効果測定 | イベント・ライター来店企画のROI自動算出 | 推奨 |
1.4 MVPに含めないもの(Phase 2以降)
- 島図面ヒートマップ(Proプラン)
- 複数店舗比較分析(Proプラン)
- AI営業戦略提案(Business Ownerプラン)
- 財務諸表分析(Business Ownerプラン)
2. システムアーキテクチャ
2.1 全体構成
┌─────────────┐ ┌──────────────────────┐ ┌──────────────┐
│ Frontend │────▶│ Backend API │────▶│ Database │
│ React/TS │◀────│ FastAPI (Python) │◀────│ PostgreSQL │
│ TailwindCSS│ │ │ │ │
└─────────────┘ │ ┌────────────────┐ │ └──────────────┘
│ │ Claude API │ │
│ │ (AI Analyzer) │ │
│ └────────────────┘ │
└──────────────────────┘
2.2 既存資産の再利用方針(キクヤ SETTING OPTIMIZER)
Backend(Python / FastAPI)
| モジュール | 役割 | 方針 |
|---|---|---|
core/scoring.py | 台ごとの5指標スコアリング | そのまま移植 |
core/profit_adjuster.py | 粗利目標ベースの設定最適化 | そのまま移植 |
core/application/smart_optimizer.py | 複数候補生成 | そのまま移植 |
core/application/optimization.py | 実行結果オブジェクト | そのまま移植 |
core/ai_analyzer.py | Claude API AI分析・Q&A | そのまま移植 |
core/csv_loader.py | ホルコンCSV読み込み | そのまま移植 |
core/config_loader.py | 設定ファイル読み込み | テナント別に拡張 |
core/models.py | データモデル | テナント対応に拡張 |
core/auth.py | JWT認証 | マルチテナント対応 |
core/database.py | DB接続 | マルチテナント対応 |
app/routers/* | APIエンドポイント | テナント分離追加 |
Frontend(React 19 / TypeScript / Vite / TailwindCSS 4)
| モジュール | 役割 | 方針 |
|---|---|---|
components/optimizer/* | 最適化UI | F-01として移植 |
components/layout/* | ナビ・認証ガード | SaaS用に拡張 |
pages/OptimizerPage.tsx | 設定最適化ページ | 移植 |
pages/LoginPage.tsx | ログイン | テナント選択追加 |
store/* | Zustand状態管理 | 移植 |
api/* | APIクライアント | 移植 |
2.3 技術スタック
| レイヤー | 技術 | バージョン |
|---|---|---|
| Frontend | React + TypeScript + Vite + TailwindCSS | 19.x / 5.9 / 8.x / 4.x |
| Frontend | Zustand + TanStack Table | 5.x / 8.x |
| Backend | Python + FastAPI | 3.14 / 0.135.x |
| Backend | SQLAlchemy + Alembic | 2.0.x / 1.18.x |
| AI | Claude Sonnet 4 | claude-sonnet-4-* |
| DB | PostgreSQL | 16.x |
3. 機能要件
3.1 F-01: 計数管理(SETTING OPTIMIZER移植)
キクヤ向けに開発済みの台設定最適化システムをそのまま移植。ホールコンピュータからエクスポートしたCSVと粗利目標を入力し、AIが翌日の台別推奨設定を提案する。
入力
| データ | 形式 | 説明 |
|---|---|---|
| 日次実績CSV | CSV | ホルコンから出力。1行=1台x1日(過去30日分) |
| 粗利目標 | 数値(円) | 店舗全体の翌日粗利目標 |
CSVカラム: date, machine_no, model_name, in_medals, out_medals, diff_medals, sales, bonus_count, utilization
処理フロー
- データ整形: CSVの列マッピング・正規化(csv_loader.py)
- スコアリング: 台ごとに5指標(平均稼働率30%・トレンド25%・機種人気度15%・台個別偏差15%・ボーナス率15%)を算出
- 粗利最適化: 全台設定1→低稼働台から設定引上げ→粗利目標に収束
- スマート最適化: 複数候補(バランス/見せ場/テコ入れ/安定運用)から最適案選定
- AI分析: Claude APIで自然言語解説・対話Q&A
出力
| 項目 | 説明 |
|---|---|
| 台別推奨設定一覧 | 台番号、機種名、推奨設定(1-6)、信頼度(A/B/C)、想定粗利、稼働率、トレンド |
| KPIサマリー | 総台数、想定粗利合計、平均設定、設定配分グラフ |
| 機種別サマリー | 機種ごとの平均設定・想定粗利 |
| AI分析レポート | トレンド分析、設定根拠解説、対話型Q&A |
| CSV出力 | 設定一覧CSVダウンロード |
画面構成
┌─────────────────────────────────────────────────┐
│ ヘッダー: [テナント名] 設定オプティマイザ [日付] │
├─────────────────────────────────────────────────┤
│ コントロール行: [CSV▼] 粗利目標:[¥___] [算出] │
├─────────────────────────────────────────────────┤
│ KPIストリップ: 総台数 | 想定粗利 | 平均設定 | 配分 │
├─────────────────────────────────────────────────┤
│ 台別設定テーブル(画面の60%以上) │
│ 台番号 | 機種名 | 設定[バッジ] | 粗利 | 稼働率 │
├─────────────────────────────────────────────────┤
│ ▶ 機種別サマリー(折りたたみ) │
│ ▶ AI分析レポート(折りたたみ) │
├─────────────────────────────────────────────────┤
│ [CSV出力] │
└─────────────────────────────────────────────────┘
APIエンドポイント(既存)
| Method | Path | 説明 |
|---|---|---|
| POST | /api/optimization/run | 最適化実行 |
| POST | /api/optimization/analyze | AI分析実行 |
| POST | /api/data-import/upload | CSVアップロード |
| GET | /api/decisions | 決定履歴一覧 |
| POST | /api/decisions | 決定保存 |
3.2 F-02: 労務管理(シフト作成)
アルバイトスタッフのシフトを自動作成・調整。希望シフト・スキル・法定労働時間を考慮してAIが最適なシフト表を提案する。
入力
| データ | 形式 | 説明 |
|---|---|---|
| スタッフマスタ | DB登録 | 名前、雇用形態、時給、スキル、契約時間上限 |
| 希望シフト | Web入力 | スタッフ本人が希望日時を登録 |
| 営業カレンダー | DB登録 | 営業日、イベント日、必要人数パターン |
制約条件
- 法定労働時間(週40時間/日8時間)の遵守
- 連続勤務日数の制限(6日以内)
- スキル要件の充足(設定変更可能者が必ず1名以上等)
- 人件費の最適化
出力
| 項目 | 説明 |
|---|---|
| シフト表 | 日別xスタッフのマトリクス表示 |
| 人件費サマリー | 日別/週別の人件費合計・予算比較 |
| 未充足アラート | 人数不足の時間帯を警告 |
| PDF/Excel出力 | 印刷用シフト表 |
APIエンドポイント(新規)
| Method | Path | 説明 |
|---|---|---|
| GET | /api/shifts/{year}/{month} | 月次シフト取得 |
| POST | /api/shifts/generate | シフト自動生成 |
| PUT | /api/shifts/{shift_id} | シフト手動修正 |
| GET/POST | /api/staff | スタッフ一覧/登録 |
| POST | /api/staff/{id}/availability | 希望シフト登録 |
| GET | /api/shifts/{year}/{month}/export | PDF/Excel出力 |
DBテーブル(新規)
-- スタッフマスタ
CREATE TABLE staff (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL REFERENCES tenants(id),
name VARCHAR(100) NOT NULL,
employment_type VARCHAR(20) NOT NULL,
hourly_rate INTEGER,
max_weekly_hours INTEGER DEFAULT 40,
skills JSONB DEFAULT '[]',
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 希望シフト
CREATE TABLE staff_availability (
id UUID PRIMARY KEY,
staff_id UUID NOT NULL REFERENCES staff(id),
date DATE NOT NULL,
available_from TIME,
available_to TIME,
preference VARCHAR(20) DEFAULT 'available',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- シフト
CREATE TABLE shifts (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL REFERENCES tenants(id),
staff_id UUID NOT NULL REFERENCES staff(id),
date DATE NOT NULL,
shift_type VARCHAR(20) NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
break_minutes INTEGER DEFAULT 60,
status VARCHAR(20) DEFAULT 'draft',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 営業カレンダー
CREATE TABLE business_calendar (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL REFERENCES tenants(id),
date DATE NOT NULL,
day_type VARCHAR(20) NOT NULL,
required_staff JSONB,
note TEXT
);
3.3 F-03: 報告書作成
日次・週次の営業報告書を、計数データ(F-01)とシフト実績(F-02)から自動生成。テンプレート対応。
処理ロジック
- テンプレートに定義された項目を各データソースから自動収集
- Claude APIで自然言語のサマリー文を生成
- テンプレートに流し込んで報告書を生成
APIエンドポイント(新規)
| Method | Path | 説明 |
|---|---|---|
| POST | /api/reports/generate | 報告書自動生成 |
| GET | /api/reports/{id} | 報告書詳細 |
| GET | /api/reports/{id}/export | PDF/Excel出力 |
| GET/POST | /api/report-templates | テンプレート管理 |
3.4 F-04: 効果測定(ROI自動算出)
イベント・ライター来店企画等の施策のROIを自動算出。施策前後の売上比較で投資効果を可視化。
処理ロジック
- 施策実施日の売上を取得
- 比較基準(直近4週間の同曜日平均)を算出
- 増分売上 = 施策日売上 - 比較基準
- ROI = (増分売上 - 施策費用) / 施策費用 x 100
- Claude APIで施策の評価コメントを生成
APIエンドポイント(新規)
| Method | Path | 説明 |
|---|---|---|
| GET/POST | /api/campaigns | 施策一覧/登録 |
| GET | /api/campaigns/{id}/roi | ROI算出結果 |
4. マルチテナント要件
論理分離(共有DB + tenant_id)を採用。MVPフェーズでは店舗数が限定的(〜10店舗)のため、インフラコスト最小化を優先。
CREATE TABLE tenants (
id UUID PRIMARY KEY,
name VARCHAR(200) NOT NULL,
slug VARCHAR(50) UNIQUE NOT NULL,
plan VARCHAR(20) DEFAULT 'basic',
config JSONB DEFAULT '{}',
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE users (
id UUID PRIMARY KEY,
tenant_id UUID NOT NULL REFERENCES tenants(id),
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
name VARCHAR(100) NOT NULL,
role VARCHAR(20) DEFAULT 'user',
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW()
);
認証・認可: JWT認証(既存拡張)、トークンにtenant_id含有、全APIでtenant_id分離強制。ロール: admin / manager / user
5. 非機能要件
5.1 性能要件
| 項目 | 要件 |
|---|---|
| 最適化実行 | 500台のデータに対し10秒以内 |
| AI分析応答 | 30秒以内 |
| シフト生成 | 30名・1ヶ月分を30秒以内 |
| 報告書生成 | 10秒以内 |
| 同時接続 | 50ユーザー |
5.2 可用性・セキュリティ
| 項目 | 要件 |
|---|---|
| 稼働率 | 99.5% |
| バックアップ | 日次自動 |
| 通信 | HTTPS必須 |
| 認証 | JWT + bcrypt |
| データ分離 | tenant_idフィルタ強制 |
| APIキー管理 | サーバーサイドのみ |
5.3 インフラ構成(推奨)
| 構成要素 | 推奨 | 月額目安 |
|---|---|---|
| アプリサーバー | AWS Lightsail or Railway | 3,000〜10,000円 |
| データベース | Supabase or Railway PostgreSQL | 0〜3,000円 |
| ファイルストレージ | S3 or R2 | 〜500円 |
| Claude API | Sonnet 4 | 約1,000円/店舗/月 |
| ドメイン/SSL | Cloudflare | 無料 |
| 合計(5店舗) | 約20,000円/月 |
6. API原価試算
~10回
APIコール/日/店舗
250回
APIコール/月/店舗
$8.25
API費/月/店舗
約1,240円
JPY換算(@150円)
| 操作 | 回数/日 | APIコール/日 |
|---|---|---|
| 設定算出(F-01) | 1-2回 | 1回 |
| AI分析・Q&A(F-01) | 3-5回 | 5-8回 |
| 報告書AI生成(F-03) | 1回 | 1-2回 |
| 効果測定AI評価(F-04) | 0-1回 | 0-1回 |
7. 画面一覧
| # | 画面名 | 機能 | 認可 |
|---|---|---|---|
| S-01 | ログイン | テナント選択+ログイン | 全ユーザー |
| S-02 | ダッシュボード | 本日のKPIサマリー | manager以上 |
| S-03 | 計数管理 | F-01(設定オプティマイザ) | manager以上 |
| S-04 | シフト管理 | F-02 | manager以上 |
| S-05 | シフト希望入力 | F-02(スタッフ用) | 全ユーザー |
| S-06 | 報告書管理 | F-03 | manager以上 |
| S-07 | 効果測定 | F-04 | manager以上 |
| S-08 | スタッフ管理 | マスタCRUD | admin |
| S-09 | テナント設定 | CSV列マッピング等 | admin |
8. データモデル概要
tenants ──┬── users
├── daily_data (日次実績CSV)
├── optimization_runs (最適化実行履歴)
├── decisions (設定決定履歴)
├── staff ──── staff_availability (希望シフト)
├── shifts (確定シフト)
├── business_calendar (営業カレンダー)
├── reports (報告書)
├── report_templates (報告書テンプレート)
├── campaigns (施策)
└── campaign_results (ROI結果)
9. 開発フェーズ
Phase 1(MVP): 2ヶ月
W1-2
マルチテナント基盤構築(DB設計、認証拡張、テナント管理)
W3-4
F-01移植(SETTING OPTIMIZER → SaaS化)
W5-6
F-02実装(シフト管理)
W7
F-03実装(報告書作成)
W8
F-04実装(効果測定)+ 結合テスト + デプロイ
Phase 2(Proプラン): 1ヶ月
- 島図面ヒートマップ
- 複数店舗比較分析
- ダッシュボード強化
Phase 3(Business Ownerプラン): 1ヶ月
- AI営業戦略提案
- 財務諸表連携
- 人的アドバイス連携フロー
10. 受入基準
10.1 機能テスト
| # | テスト項目 | 合格基準 |
|---|---|---|
| T-01 | CSV取込→最適化→結果表示 | 500台30日分のCSVで正常に設定一覧を出力 |
| T-02 | AI分析・Q&A | Claude APIにリクエストし自然言語で回答が返る |
| T-03 | シフト自動生成 | 30名1ヶ月分が法定制約を満たして生成 |
| T-04 | 報告書生成 | テンプレートに沿った報告書がPDF出力 |
| T-05 | ROI算出 | 施策登録→ROIが正しく計算 |
| T-06 | テナント分離 | テナントAのデータがテナントBから参照不可 |
| T-07 | 認証・認可 | role別アクセス制御が機能 |
10.2 非機能テスト
| # | テスト項目 | 合格基準 |
|---|---|---|
| T-08 | 負荷テスト | 50同時ユーザーで応答時間が要件内 |
| T-09 | セキュリティ | SQLi, XSS, CSRF対策の確認 |
11. 納品物
| # | 成果物 | 形式 |
|---|---|---|
| D-01 | ソースコード一式 | GitHubリポジトリ |
| D-02 | DB設計書(ER図) | Draw.io or Mermaid |
| D-03 | API仕様書 | OpenAPI (Swagger) |
| D-04 | デプロイ手順書 | Markdown |
| D-05 | 運用マニュアル | Markdown |
| D-06 | テスト結果報告書 | Markdown |
12. 前提条件・制約
| # | 項目 | 内容 |
|---|---|---|
| C-01 | 既存コード | キクヤのSETTING OPTIMIZERのコードベースを提供 |
| C-02 | Claude API | APIキーは当社提供。コスト負担は当社 |
| C-03 | ドメイン | サブドメイン(例: app.tencho-agent.jp)を当社が手配 |
| C-04 | デザイン | キクヤ版のUIデザイン仕様に準拠。新規デザイン不要 |
| C-05 | テストデータ | キクヤの匿名化サンプルデータを提供 |
付録A: 用語集
| 用語 | 説明 |
|---|---|
| ホルコン | ホールコンピュータ。パチンコ店の台データを集約管理するシステム |
| 計数 | パチンコ業界用語。売上・稼働率・設定等の数値管理全般 |
| 設定 | パチスロ台の出玉率を決める1〜6の段階。6が最も出やすい |
| 機械割 | 設定ごとの理論上の出玉率(%) |
| 島 | パチンコ台が並ぶ列の呼称 |
| IN枚数/OUT枚数 | 投入メダル数/払出メダル数 |
| 差枚数 | IN - OUT。ホール側の利益に相当 |