body method

  1. @override
String body(
  1. String baseName,
  2. String className
)
override

Defines the actual body code. path is passed relative to lib, baseName is the filename, and className is the filename converted to Pascal case.

実際の本体コードを定義します。pathlibからの相対パス、baseNameにファイル名が渡され、classNameにファイル名をパスカルケースに変換した値が渡されます。

Implementation

@override
String body(String baseName, String className) {
  return """
$excerpt

## 概要

セールス機能は、以下の2つの主要な機能を提供します:

1. **Google Play開発者情報収集**: Google Play Storeから開発者情報を収集
2. **App Store開発者情報収集**: App Storeから開発者情報を収集

これらの機能により、潜在的なビジネスパートナーやクライアントを効率的に特定し、連絡を取ることが可能になります。

## Google Play開発者情報収集

### collect_google_play_developers

Google Play Storeから開発者情報を収集します。3つのモードで動作可能です。

**アクションID**: `collect_google_play_developers`

### 動作モード

#### 1. 開発者ID指定モード

特定の開発者IDを指定して情報を収集します。

**パラメータ**:
```typescript
{
"mode": "developer_ids",
"developerIds": string[],  // 開発者IDの配列
"lang": string,            // 任意: 言語コード(デフォルト: "ja")
"country": string          // 任意: 国コード(デフォルト: "jp")
}
```

**使用例**:
```dart
final action = await ref.app.model(
ActionModel.collection().create({
  "type": "collect_google_play_developers",
  "data": {
    "mode": "developer_ids",
    "developerIds": [
      "5700313618786177705",  // Nintendo
      "6720847872433251783",  // Sony
      "4898307374348440402"   // Square Enix
    ],
    "lang": "ja",
    "country": "jp"
  }
}),
);
```

#### 2. カテゴリランキングモード

特定のカテゴリのトップアプリから開発者情報を収集します。

**パラメータ**:
```typescript
{
"mode": "category_ranking",
"categoryConfig": {
  "category": string,     // カテゴリID(後述のカテゴリ一覧参照)
  "collection": string,   // コレクション種別
  "num": number          // 取得するアプリ数(デフォルト: 100)
},
"maxCount": number        // 最大収集数(任意)
}
```

**カテゴリID一覧**:
```
// ゲームカテゴリ
GAME_ACTION          - アクションゲーム
GAME_ADVENTURE       - アドベンチャー
GAME_ARCADE          - アーケード
GAME_BOARD           - ボード
GAME_CARD            - カード
GAME_CASINO          - カジノ
GAME_CASUAL          - カジュアル
GAME_EDUCATIONAL     - 教育
GAME_MUSIC           - 音楽
GAME_PUZZLE          - パズル
GAME_RACING          - レース
GAME_ROLE_PLAYING    - ロールプレイング
GAME_SIMULATION      - シミュレーション
GAME_SPORTS          - スポーツ
GAME_STRATEGY        - ストラテジー
GAME_TRIVIA          - 雑学
GAME_WORD            - 言葉

// アプリカテゴリ
ART_AND_DESIGN       - アート&デザイン
AUTO_AND_VEHICLES    - 自動車
BEAUTY               - 美容
BOOKS_AND_REFERENCE  - 書籍&参考書
BUSINESS             - ビジネス
COMICS               - コミック
COMMUNICATION        - 通信
DATING               - 出会い
EDUCATION            - 教育
ENTERTAINMENT        - エンタメ
EVENTS               - イベント
FINANCE              - ファイナンス
FOOD_AND_DRINK       - フード&ドリンク
HEALTH_AND_FITNESS   - 健康&フィットネス
HOUSE_AND_HOME       - 住まい&インテリア
LIBRARIES_AND_DEMO   - ライブラリ&デモ
LIFESTYLE            - ライフスタイル
MAPS_AND_NAVIGATION  - 地図&ナビ
MEDICAL              - 医療
MUSIC_AND_AUDIO      - 音楽&オーディオ
NEWS_AND_MAGAZINES   - ニュース&雑誌
PARENTING            - 子育て
PERSONALIZATION      - カスタマイズ
PHOTOGRAPHY          - 写真
PRODUCTIVITY         - 仕事効率化
SHOPPING             - ショッピング
SOCIAL               - ソーシャル
SPORTS               - スポーツ
TOOLS                - ツール
TRAVEL_AND_LOCAL     - 旅行&地域
VIDEO_PLAYERS        - 動画プレーヤー
WEATHER              - 天気
```

**コレクション種別**:
```
TOP_FREE            - 無料トップ
TOP_PAID            - 有料トップ
TOP_GROSSING        - 売上トップ
TRENDING            - 急上昇
NEW_FREE            - 新着無料
NEW_PAID            - 新着有料
```

**使用例**:
```dart
// フィットネスカテゴリの無料トップ100アプリから開発者情報を収集
final action = await ref.app.model(
ActionModel.collection().create({
  "type": "collect_google_play_developers",
  "data": {
    "mode": "category_ranking",
    "categoryConfig": {
      "category": "HEALTH_AND_FITNESS",
      "collection": "TOP_FREE",
      "num": 100
    },
    "maxCount": 200,
    "lang": "ja",
    "country": "jp"
  }
}),
);
```

#### 3. キーワード検索モード

キーワードでアプリを検索し、その開発者情報を収集します。

**パラメータ**:
```typescript
{
"mode": "search_keyword",
"searchConfig": {
  "query": string,       // 検索キーワード
  "num": number         // 検索結果数(デフォルト: 50)
},
"maxCount": number      // 最大収集数(任意)
}
```

**使用例**:
```dart
// "フィットネス"で検索したアプリの開発者情報を収集
final action = await ref.app.model(
ActionModel.collection().create({
  "type": "collect_google_play_developers",
  "data": {
    "mode": "search_keyword",
    "searchConfig": {
      "query": "フィットネス トレーニング",
      "num": 50
    },
    "maxCount": 100,
    "lang": "ja",
    "country": "jp"
  }
}),
);
```

### レスポンス構造

```typescript
{
"results": {
  "googlePlayDevelopers": {
    "stats": {
      "mode": string,           // 使用したモード
      "targetCount": number,    // 対象アプリ数
      "collectedCount": number, // 収集した開発者数
      "withEmailCount": number, // メールアドレス取得数
      "savedCount": number      // 保存された開発者数
    },
    "developers": [
      {
        "developerId": string,        // 開発者ID
        "developerName": string,      // 開発者名
        "companyName": string,        // 会社名(任意)
        "email": string,              // メールアドレス(任意)
        "website": string,            // ウェブサイト(任意)
        "privacyPolicyUrl": string,   // プライバシーポリシー(任意)
        "address": string,            // 住所(任意)
        "apps": [
          {
            "appId": string,         // アプリID(パッケージ名)
            "title": string,         // アプリタイトル
            "score": number,         // 評価スコア
            "price": number,         // 価格
            "free": boolean,         // 無料アプリか
            "genre": string,         // ジャンル
            "installs": string,      // インストール数範囲
            "updated": string        // 最終更新日
          }
        ]
      }
    ]
  }
}
}
```

## App Store開発者情報収集

### collect_app_store_developers

App Storeから開発者情報を収集します。Google Playと同様の3つのモードで動作します。

**アクションID**: `collect_app_store_developers`

### 動作モード

Google Playと同様に以下の3つのモードがあります:

1. **開発者ID指定モード**: 特定の開発者IDを指定
2. **カテゴリランキングモード**: カテゴリのトップアプリから収集
3. **キーワード検索モード**: キーワード検索結果から収集

**App Storeカテゴリ一覧**:
```
// メインカテゴリ
6018  - ブック
6000  - ビジネス
6022  - カタログ
6017  - 教育
6016  - エンターテインメント
6015  - ファイナンス
6023  - フード/ドリンク
6014  - ゲーム
6013  - ヘルスケア/フィットネス
6012  - ライフスタイル
6020  - 医療
6011  - ミュージック
6010  - ナビゲーション
6009  - ニュース
6008  - 写真/ビデオ
6007  - 仕事効率化
6006  - 辞書/辞典/その他
6005  - ソーシャルネットワーキング
6004  - スポーツ
6003  - 旅行
6002  - ユーティリティ
6001  - 天気

// ゲームサブカテゴリ
7001  - アクション
7002  - アドベンチャー
7003  - アーケード
7004  - ボード
7005  - カード
7006  - カジノ
7009  - ファミリー
7011  - ミュージック
7012  - パズル
7013  - レーシング
7014  - ロールプレイング
7015  - シミュレーション
7016  - スポーツ
7017  - ストラテジー
7018  - トリビア
7019  - 単語
```

**レスポンス構造**:
```typescript
{
"results": {
  "appStoreDevelopers": {
    "stats": {
      "mode": string,
      "targetCount": number,
      "collectedCount": number,
      "withEmailCount": number,
      "savedCount": number
    },
    "developers": [
      {
        "developerId": number,         // 開発者ID
        "developerName": string,      // 開発者名
        "email": string,              // サポートメール(任意)
        "website": string,            // ウェブサイト(任意)
        "apps": [
          {
            "appId": number,         // アプリID
            "bundleId": string,      // バンドルID
            "title": string,         // アプリタイトル
            "price": number,         // 価格
            "free": boolean,         // 無料アプリか
            "genre": string,         // ジャンル
            "rating": number,        // 評価
            "ratingCount": number    // 評価数
          }
        ]
      }
    ]
  }
}
}
```

## 実装例

### 包括的な開発者情報収集ワークフロー

```dart
// 1. 特定カテゴリからの開発者収集
final fitnessWorkflow = await ref.app.model(
WorkflowModel.collection().create({
  "name": "フィットネスアプリ開発者収集",
  "actions": [
    // Google Play
    {
      "type": "collect_google_play_developers",
      "data": {
        "mode": "category_ranking",
        "categoryConfig": {
          "category": "HEALTH_AND_FITNESS",
          "collection": "TOP_FREE",
          "num": 200
        }
      }
    },
    // App Store
    {
      "type": "collect_app_store_developers",
      "data": {
        "mode": "category_ranking",
        "categoryConfig": {
          "category": "6013",  // ヘルスケア/フィットネス
          "collection": "TOP_FREE",
          "num": 200
        }
      }
    }
  ]
}),
);

// 2. タスクの実行
final task = await ref.app.model(
TaskModel.collection().create({
  "workflowId": fitnessWorkflow.uid,
  "status": TaskStatus.waiting
}),
);

// 3. 結果の取得と処理
task.watch(
onUpdate: (task) async {
  if (task.value?.status == TaskStatus.completed) {
    final googlePlayDevs = task.value?.response["googlePlayDevelopers"]["developers"];
    final appStoreDevs = task.value?.response["appStoreDevelopers"]["developers"];

    // メールアドレスがある開発者のみフィルタリング
    final contactableDevs = [
      ...googlePlayDevs.where((dev) => dev["email"] != null),
      ...appStoreDevs.where((dev) => dev["email"] != null),
    ];

    print("連絡可能な開発者数: \${contactableDevs.length}");

    // CSVエクスポートなどの処理
    await exportToCSV(contactableDevs);
  }
},
);
```

### 競合分析ワークフロー

```dart
// 競合他社の開発者IDを指定して情報収集
final competitorAnalysis = await ref.app.model(
WorkflowModel.collection().create({
  "name": "競合分析",
  "actions": [
    {
      "type": "collect_google_play_developers",
      "data": {
        "mode": "developer_ids",
        "developerIds": [
          "競合A_開発者ID",
          "競合B_開発者ID",
          "競合C_開発者ID"
        ]
      }
    }
  ]
}),
);

// アプリ情報から競合の戦略を分析
final task = await runWorkflow(competitorAnalysis.uid);
final competitors = task.response["googlePlayDevelopers"]["developers"];

for (final competitor in competitors) {
print("開発者: \${competitor['developerName']}");
print("アプリ数: \${competitor['apps'].length}");
print("主要カテゴリ: \${_analyzeCategories(competitor['apps'])}");
print("平均評価: \${_calculateAverageRating(competitor['apps'])}");
}
```

### キーワードベースの潜在顧客発掘

```dart
// ビジネス向けアプリ開発者を発掘
final b2bLeadGeneration = await ref.app.model(
WorkflowModel.collection().create({
  "name": "B2B向け開発者リード生成",
  "actions": [
    {
      "type": "collect_google_play_developers",
      "data": {
        "mode": "search_keyword",
        "searchConfig": {
          "query": "業務管理 効率化 ビジネス",
          "num": 100
        }
      }
    },
    {
      "type": "collect_app_store_developers",
      "data": {
        "mode": "search_keyword",
        "searchConfig": {
          "query": "business productivity enterprise",
          "num": 100
        }
      }
    }
  ]
}),
);
```

## 活用シナリオ

### 1. ビジネス開発

- **パートナーシップの機会**: 補完的なアプリを開発している企業との提携
- **M&A候補の特定**: 買収対象となる可能性のあるアプリ開発者の発見
- **投資機会の探索**: 成長性の高いアプリ開発者への投資検討

### 2. マーケティング

- **ターゲット広告**: 特定カテゴリの開発者へのダイレクトマーケティング
- **イベント招待**: カンファレンスや展示会への招待リスト作成
- **コンテンツマーケティング**: 開発者向けコンテンツの配信リスト構築

### 3. 競合分析

- **市場動向の把握**: カテゴリ別の開発者分布と活動状況
- **新規参入者の監視**: 新しく市場に参入した開発者の特定
- **価格戦略の分析**: 競合アプリの価格設定とマネタイズ戦略

## ベストプラクティス

### データ収集の最適化

1. **段階的な収集**: 大量データは複数回に分けて収集
2. **キャッシュの活用**: 同じ開発者IDは再収集を避ける
3. **レート制限の考慮**: APIレート制限を超えないよう適切な間隔を設定

```dart
// 段階的収集の例
const batchSize = 50;
const totalDevelopers = 500;

for (int i = 0; i < totalDevelopers; i += batchSize) {
await collectDevelopers(
  start: i,
  limit: batchSize,
);

// レート制限回避のための待機
await Future.delayed(Duration(seconds: 5));
}
```

### データの品質管理

1. **重複の排除**: 同じ開発者の重複エントリを削除
2. **情報の検証**: メールアドレスやウェブサイトの有効性確認
3. **更新頻度**: 定期的にデータを更新して最新性を保つ

```dart
// データクリーニングの例
List<Map<String, dynamic>> cleanDeveloperData(List<Map<String, dynamic>> developers) {
// 重複の排除
final uniqueDevs = <String, Map<String, dynamic>>{};
for (final dev in developers) {
  uniqueDevs[dev['developerId']] = dev;
}

// 有効なメールアドレスのフィルタリング
return uniqueDevs.values.where((dev) {
  final email = dev['email'] as String?;
  return email != null && isValidEmail(email);
}).toList();
}
```

## 注意事項

### 法的・倫理的考慮事項

1. **プライバシー規制の遵守**
 - GDPR、CCPA等の個人情報保護法の遵守
 - 収集したメールアドレスの適切な管理
 - オプトアウト要求への対応

2. **利用規約の遵守**
 - Google PlayおよびApp Storeの利用規約を確認
 - 自動収集に関する制限事項の理解
 - 商用利用の可否確認

3. **スパム防止**
 - 未承諾の大量メール送信を避ける
 - CAN-SPAM法等の規制遵守
 - 適切な配信停止メカニズムの実装

### 技術的制限

1. **レート制限**
 - API呼び出し回数の制限
 - 時間あたりの収集可能数の上限
 - エラーハンドリングとリトライロジック

2. **データの完全性**
 - すべての開発者情報が取得できるとは限らない
 - 一部のフィールドが空の場合がある
 - 定期的な更新が必要

3. **ストレージ容量**
 - 大量データの保存に必要な容量
 - データベースのパフォーマンス最適化
 - バックアップとリカバリー戦略

## エラーハンドリング

```dart
try {
final action = await ref.app.model(
  ActionModel.collection().create({
    "type": "collect_google_play_developers",
    "data": {...}
  }),
);

if (action.status == ActionStatus.error) {
  switch (action.error["code"]) {
    case "RATE_LIMIT_EXCEEDED":
      // レート制限エラー
      await Future.delayed(Duration(minutes: 5));
      // リトライ
      break;
    case "INVALID_CATEGORY":
      // 無効なカテゴリ
      print("指定されたカテゴリが存在しません");
      break;
    case "NETWORK_ERROR":
      // ネットワークエラー
      print("ネットワーク接続を確認してください");
      break;
    default:
      print("予期しないエラー: \${action.error}");
  }
}
} catch (e) {
print("実行エラー: \$e");
}
```

## まとめ

セールス機能は、Google PlayとApp Storeから開発者情報を効率的に収集し、ビジネス開発の機会を創出する強力なツールです。適切な利用により、パートナーシップの構築、マーケティング活動の最適化、競合分析の精度向上が可能になります。

法的・倫理的な考慮事項を遵守しながら、データの品質管理と技術的制限を理解して活用することで、最大限の価値を引き出すことができます。

### 次のステップ
- [メインワークフローに戻る](../workflow.dart)
- [マーケティング分析機能](marketing_analytics.dart) - 収集データの分析
- [基本ワークフロー機能](basic_workflow.dart) - スケジューラーとタスク管理
""";
}