SCALE — Build Lab
開発パターン · TYPESCRIPT LIBRARY

事業目標管理パターン

CATEGORY開発パターン TYPETypeScript Library EFFORT90〜240分 DIFFICULTY
PRIMARY CODE
ts · lib/business-goals-data.ts
export interface FiscalRevenueGoal {
  period: number;
  label: string;
  revenue: number;
  revenueLabel: string;
}

export interface KPIBreakdown {
  label: string;
  annual?: number;
  monthly?: number;
  unit?: string;
  note?: string;
}

export interface KPINode {
  id: string;
  label: string;
  annual?: number;
  monthly?: number;
  unit: string;
  emoji?: string;
  color?: string;
  breakdown?: KPIBreakdown[];
  note?: string;
}

export interface KPICategory {
  id: string;
  name: string;
  icon: string;
  color: string;
  nodes: KPINode[];
}

export interface BusinessGoal {
  id: string;
  name: string;
  description: string;
  fiscalPeriod: string;
  revenueTargetAnnual: number;
  revenueTargetMonthly: number;
  revenueBreakdown?: KPIBreakdown[];
  categories: KPICategory[];
}

export const ROADMAP: FiscalRevenueGoal[] = [
  { period: 4, label: '4期目', revenue: 100_000_000, revenueLabel: '1億円' },
  { period: 5, label: '5期目', revenue: 300_000_000, revenueLabel: '3億円' },
  { period: 6, label: '6期目', revenue: 900_000_000, revenueLabel: '9億円' },
  { period: 7, label: '7期目', revenue: 1_800_000_000, revenueLabel: '18億円' },
  { period: 8, label: '8期目', revenue: 3_600_000_000, revenueLabel: '36億円' },
  { period: 9, label: '9期目', revenue: 7_200_000_000, revenueLabel: '72億円' },
  { period: 10, label: '10期目', revenue: 10_000_000_000, revenueLabel: '100億円' },
];

export const BUSINESS_GOALS: BusinessGoal[] = [
  {
    id: 'scale-lead',
    name: 'SCALE Lead',
    description: 'BDRアウトバウンド/インバウンド支援事業',
    fiscalPeriod: '4期目',
    revenueTargetAnnual: 85_000_000,
    revenueTargetMonthly: 7_100_000,
    revenueBreakdown: [
      { label: '固定報酬', annual: 30_000_000, monthly: 2_500_000, unit: '円' },
      { label: '成果報酬', annual: 55_000_000, monthly: 4_600_000, unit: '円' },
    ],
    categories: [
      {
        id: 'outbound',
        name: 'アウトバウンド集客',
        icon: 'send',
        color: 'blue',
        nodes: [
          {
            id: 'linkedin-out',
            label: 'LinkedIn',
            annual: 180,
            monthly: 15,
            unit: '件',
            breakdown: [],
          },
        ],
      },
      {
        id: 'inbound',
        name: 'インバウンド集客',
        icon: 'magnet',
        color: 'cyan',
        nodes: [
          {
            id: 'hp',
            label: 'HP',
            annual: 5,
            unit: '件',
          },
          {
            id: 'x',
            label: 'X',
            annual: 5,
            unit: '件',
          },
        ],
      },
      {
        id: 'fs',
        name: 'FS(フィールドセールス)',
        icon: 'handshake',
        color: 'purple',
        nodes: [
          {
            id: 'fs-total',
            label: '受注',
            annual: 30,
            monthly: 3,
            unit: '件',
            breakdown: [
              { label: '月間受注数', monthly: 3, unit: '件' },
              { label: '商談後受注率', monthly: 20, unit: '%' },
            ],
          },
        ],
      },
      {
        id: 'pm',
        name: 'PM(プロジェクト運用)',
        icon: 'folderkanban',
        color: 'orange',
        nodes: [
          {
            id: 'pm-apo',
            label: 'アポ総数',
            annual: 2160,
            monthly: 180,
            unit: '件',
            breakdown: [
              { label: '継続案件数', monthly: 18, unit: '件' },
              { label: '各案件の月間アポ数', monthly: 10, unit: '件' },
              { label: '案件の継続率', monthly: 90, unit: '%' },
            ],
          },
        ],
      },
      {
        id: 'recruit',
        name: '採用',
        icon: 'userplus',
        color: 'green',
        nodes: [
          {
            id: 'recruit-fixed',
            label: '固定報酬メンバー',
            annual: 3,
            unit: '名',
            note: '月間0〜1名',
          },
          {
            id: 'recruit-performance',
            label: '成果報酬メンバー',
            annual: 60,
            monthly: 5,
            unit: '名',
          },
        ],
      },
    ],
  },
  {
    id: 'terasu',
    name: 'TERASU',
    description: 'マーケティング支援事業',
    fiscalPeriod: '4期目',
    revenueTargetAnnual: 15_000_000,
    revenueTargetMonthly: 1_250_000,
    categories: [
      {
        id: 'acquisition',
        name: '集客',
        icon: 'send',
        color: 'blue',
        nodes: [
          {
            id: 'linkedin',
            label: 'LinkedIn',
            annual: 180,
            monthly: 15,
            unit: '件',
          },
          {
            id: 'x',
            label: 'X運用',
            annual: 36,
            monthly: 3,
            unit: '件',
          },
          {
            id: 'facebook',
            label: 'Facebook運用',
            annual: 24,
            monthly: 2,
            unit: '件',
          },
        ],
      },
      {
        id: 'fs',
        name: 'FS(フィールドセールス)',
        icon: 'handshake',
        color: 'purple',
        nodes: [
          {
            id: 'fs-total',
            label: '受注',
            annual: 36,
            monthly: 6,
            unit: '件',
            breakdown: [
              { label: '月間受注数', monthly: 6, unit: '件' },
              { label: '商談後受注率', monthly: 20, unit: '%' },
            ],
          },
        ],
      },
    ],
  },
];

export function formatYen(n: number): string {
  if (n >= 100_000_000) return `${(n / 100_000_000).toFixed(n % 100_000_000 === 0 ? 0 : 1)}億円`;
  if (n >= 10_000) return `${(n / 10_000).toLocaleString('ja-JP')}万円`;
  return `${n.toLocaleString('ja-JP')}円`;
}

前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • OKR管理
  • 個人目標管理
  • KPI追跡

事業目標管理パターン

:LiTarget: 用途

会社・部署・個人のOKR階層を型安全に管理するパターン。

:LiSparkle: 特徴

  • 階層的目標管理
  • 達成率計算
  • 期間別進捗
  • 担当者割当

:LiCode: 実コード(SCALE Base より自動抽出)

:LiInfo: lib/business-goals-data.ts の中身そのもの。コピペ即可。

export interface FiscalRevenueGoal {
  period: number;
  label: string;
  revenue: number;
  revenueLabel: string;
}

export interface KPIBreakdown {
  label: string;
  annual?: number;
  monthly?: number;
  unit?: string;
  note?: string;
}

export interface KPINode {
  id: string;
  label: string;
  annual?: number;
  monthly?: number;
  unit: string;
  emoji?: string;
  color?: string;
  breakdown?: KPIBreakdown[];
  note?: string;
}

export interface KPICategory {
  id: string;
  name: string;
  icon: string;
  color: string;
  nodes: KPINode[];
}

export interface BusinessGoal {
  id: string;
  name: string;
  description: string;
  fiscalPeriod: string;
  revenueTargetAnnual: number;
  revenueTargetMonthly: number;
  revenueBreakdown?: KPIBreakdown[];
  categories: KPICategory[];
}

export const ROADMAP: FiscalRevenueGoal[] = [
  { period: 4, label: '4期目', revenue: 100_000_000, revenueLabel: '1億円' },
  { period: 5, label: '5期目', revenue: 300_000_000, revenueLabel: '3億円' },
  { period: 6, label: '6期目', revenue: 900_000_000, revenueLabel: '9億円' },
  { period: 7, label: '7期目', revenue: 1_800_000_000, revenueLabel: '18億円' },
  { period: 8, label: '8期目', revenue: 3_600_000_000, revenueLabel: '36億円' },
  { period: 9, label: '9期目', revenue: 7_200_000_000, revenueLabel: '72億円' },
  { period: 10, label: '10期目', revenue: 10_000_000_000, revenueLabel: '100億円' },
];

export const BUSINESS_GOALS: BusinessGoal[] = [
  {
    id: 'scale-lead',
    name: 'SCALE Lead',
    description: 'BDRアウトバウンド/インバウンド支援事業',
    fiscalPeriod: '4期目',
    revenueTargetAnnual: 85_000_000,
    revenueTargetMonthly: 7_100_000,
    revenueBreakdown: [
      { label: '固定報酬', annual: 30_000_000, monthly: 2_500_000, unit: '円' },
      { label: '成果報酬', annual: 55_000_000, monthly: 4_600_000, unit: '円' },
    ],
    categories: [
      {
        id: 'outbound',
        name: 'アウトバウンド集客',
        icon: 'send',
        color: 'blue',
        nodes: [
          {
            id: 'linkedin-out',
            label: 'LinkedIn',
            annual: 180,
            monthly: 15,
            unit: '件',
            breakdown: [],
          },
        ],
      },
      {
        id: 'inbound',
        name: 'インバウンド集客',
        icon: 'magnet',
        color: 'cyan',
        nodes: [
          {
            id: 'hp',
            label: 'HP',
            annual: 5,
            unit: '件',
          },
          {
            id: 'x',
            label: 'X',
            annual: 5,
            unit: '件',
          },
        ],
      },
      {
        id: 'fs',
        name: 'FS(フィールドセールス)',
        icon: 'handshake',
        color: 'purple',
        nodes: [
          {
            id: 'fs-total',
            label: '受注',
            annual: 30,
            monthly: 3,
            unit: '件',
            breakdown: [
              { label: '月間受注数', monthly: 3, unit: '件' },
              { label: '商談後受注率', monthly: 20, unit: '%' },
            ],
          },
        ],
      },
      {
        id: 'pm',
        name: 'PM(プロジェクト運用)',
        icon: 'folderkanban',
        color: 'orange',
        nodes: [
          {
            id: 'pm-apo',
            label: 'アポ総数',
            annual: 2160,
            monthly: 180,
            unit: '件',
            breakdown: [
              { label: '継続案件数', monthly: 18, unit: '件' },
              { label: '各案件の月間アポ数', monthly: 10, unit: '件' },
              { label: '案件の継続率', monthly: 90, unit: '%' },
            ],
          },
        ],
      },
      {
        id: 'recruit',
        name: '採用',
        icon: 'userplus',
        color: 'green',
        nodes: [
          {
            id: 'recruit-fixed',
            label: '固定報酬メンバー',
            annual: 3,
            unit: '名',
            note: '月間0〜1名',
          },
          {
            id: 'recruit-performance',
            label: '成果報酬メンバー',
            annual: 60,
            monthly: 5,
            unit: '名',
          },
        ],
      },
    ],
  },
  {
    id: 'terasu',
    name: 'TERASU',
    description: 'マーケティング支援事業',
    fiscalPeriod: '4期目',
    revenueTargetAnnual: 15_000_000,
    revenueTargetMonthly: 1_250_000,
    categories: [
      {
        id: 'acquisition',
        name: '集客',
        icon: 'send',
        color: 'blue',
        nodes: [
          {
            id: 'linkedin',
            label: 'LinkedIn',
            annual: 180,
            monthly: 15,
            unit: '件',
          },
          {
            id: 'x',
            label: 'X運用',
            annual: 36,
            monthly: 3,
            unit: '件',
          },
          {
            id: 'facebook',
            label: 'Facebook運用',
            annual: 24,
            monthly: 2,
            unit: '件',
          },
        ],
      },
      {
        id: 'fs',
        name: 'FS(フィールドセールス)',
        icon: 'handshake',
        color: 'purple',
        nodes: [
          {
            id: 'fs-total',
            label: '受注',
            annual: 36,
            monthly: 6,
            unit: '件',
            breakdown: [
              { label: '月間受注数', monthly: 6, unit: '件' },
              { label: '商談後受注率', monthly: 20, unit: '%' },
            ],
          },
        ],
      },
    ],
  },
];

export function formatYen(n: number): string {
  if (n >= 100_000_000) return `${(n / 100_000_000).toFixed(n % 100_000_000 === 0 ? 0 : 1)}億円`;
  if (n >= 10_000) return `${(n / 10_000).toLocaleString('ja-JP')}万円`;
  return `${n.toLocaleString('ja-JP')}円`;
}

:LiFolder: ソースファイルのパス

/Users/oogushiyuuki/Library/CloudStorage/GoogleDrive-y-ogushi@scale-group.co.jp/マイドライブ/AI/scale-base/lib/business-goals-data.ts

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加