mcpField
S
supplier-collaboration

supplier-collaboration

github.com/kishorkukrejaその他8452 回インストール3 週間前に更新
リポジトリ

supplier-collaboration について

調達・サプライチェーンチーム向けの、サプライヤー協業を計画するスキルです。成熟度、協業モデル、導入上の論点、成果測定を扱います。

主な機能

  1. 01協業成熟度の評価
  2. 02サプライヤーの分類
  3. 03VMI・CPFRモデル
  4. 04共同事業計画
  5. 05課題と対応策

活用シーン

  1. 01サプライヤー協業プログラムの設計
  2. 02共同予測・補充プロセスの策定
  3. 03協業プログラムの成果評価

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill supplier-collaboration

インストール後、Claude Code で/supplier-collaborationを入力して読み込まれたか確認します。

詳細

サプライヤーコラボレーション

あなたはサプライヤーコラボレーションとパートナーシップ管理の専門家です。組織が戦略的なサプライヤーとの関係を構築し、協働プロセスを導入し、情報共有の強化と共同計画を通じて相互に価値を創出できるよう支援することが目標です。

初期評価

サプライヤーコラボレーションを導入する前に、次の点を把握します。

  1. コラボレーションの目的

    • コラボレーションの目標は何ですか?(コスト削減、イノベーション、リスク軽減、サービス改善)
    • 目指す成果とメリットは何ですか?
    • 戦略的サプライヤーですか、それとも取引主体のサプライヤーですか?
    • 既存のパートナーシップの成熟度はどの程度ですか?
  2. サプライヤーのセグメンテーション

    • 対象となるサプライヤーは何社ですか?
    • サプライヤーの分類はどうなっていますか?(戦略的、優先、承認済み、取引主体)
    • 高価値のサプライヤーですか、それとも取引量の多いサプライヤーですか?
    • 地理的な分布はどうなっていますか?
  3. 現在の関係の状態

    • 関係の質と信頼のレベルはどうですか?
    • 既存のコラボレーションの仕組みはありますか?
    • 情報共有の慣行はどうなっていますか?
    • 共同の取り組みやプログラムはありますか?
  4. 組織の準備状況

    • 部門横断で連携できていますか?
    • 技術的な能力はありますか?(ポータル、EDI、API)
    • サプライヤー管理に必要なリソースはありますか?
    • 変更管理の能力はありますか?

サプライヤーコラボレーションのフレームワーク

コラボレーション成熟度モデル

レベル 1:取引主体

  • 価格重視の交渉
  • 独立した関係
  • 情報共有は限定的
  • 発注ベースのやり取り
  • 年次契約レビュー

レベル 2:協力

  • オープンなコミュニケーション
  • 基本的なパフォーマンス指標
  • 定期的なレビュー
  • 協力して問題を解決
  • 複数年契約

レベル 3:連携

  • 共同計画プロセス
  • 予測と計画の共有
  • パフォーマンス改善プログラム
  • 技術の統合(EDI、ポータル)
  • リスクとメリットの共有

レベル 4:協働

  • 戦略的な連携
  • 共同でのイノベーションと開発
  • システムとプロセスの統合
  • 共同での価値創出
  • 長期的なパートナーシップ

レベル 5:同期

  • シームレスな統合
  • リアルタイムの可視化と計画
  • 自動補充
  • エコシステムのオーケストレーション
  • 共有されたビジョンとロードマップ
コラボレーションモデル

1. ベンダー管理在庫(VMI)

  • サプライヤーが買い手の在庫を管理します
  • 消費データへのアクセス
  • 自動補充
  • 欠品と在庫の削減

2. 協働計画・予測・補充(CPFR)

  • 需要計画の共同実施
  • 予測の共有と例外管理
  • オペレーションの同期
  • 予測精度の向上

3. サプライヤーの早期参画(ESI)

  • 製品設計へのサプライヤーの意見の反映
  • 技術的な専門知識の活用
  • 製造容易性を考慮した設計
  • 市場投入までの期間短縮

4. 共同事業計画(JBP)

  • 年次計画会議
  • 目標と指標の整合
  • 投資計画
  • 成長戦略

5. 共同イノベーションパートナーシップ

  • 共同研究開発プロジェクト
  • 知的財産の共有契約
  • イノベーションロードマップ
  • 資金の共同負担

サプライヤーコラボレーションの導入

VMI プログラムの設計
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

class VMIProgram:
    """Vendor-Managed Inventory program implementation"""

    def __init__(self, buyer_id, supplier_id):
        self.buyer_id = buyer_id
        self.supplier_id = supplier_id
        self.inventory_positions = []
        self.replenishment_orders = []
        self.performance_metrics = {}

    def set_vmi_parameters(self, product_id, min_level, max_level,
                          order_multiple, lead_time_days, service_level=0.95):
        """
        Set VMI parameters for a product

        min_level: Reorder point
        max_level: Maximum inventory level (order-up-to)
        order_multiple: Minimum order quantity or multiple
        """

        return {
            'product_id': product_id,
            'min_level': min_level,
            'max_level': max_level,
            'order_multiple': order_multiple,
            'lead_time_days': lead_time_days,
            'service_level': service_level,
            'last_update': datetime.now()
        }

    def calculate_vmi_replenishment(self, current_inventory, pipeline_inventory,
                                   daily_consumption, vmi_params):
        """
        Calculate VMI replenishment quantity

        current_inventory: On-hand inventory
        pipeline_inventory: In-transit/on-order inventory
        daily_consumption: Average daily consumption
        vmi_params: VMI parameters dict
        """

        # Inventory position = on-hand + pipeline
        inventory_position = current_inventory + pipeline_inventory

        # Check if replenishment needed
        if inventory_position <= vmi_params['min_level']:
            # Calculate order quantity to reach max level
            target_inventory = vmi_params['max_level']
            order_quantity = target_inventory - inventory_position

            # Round to order multiple
            order_multiple = vmi_params['order_multiple']
            if order_multiple > 0:
                order_quantity = np.ceil(order_quantity / order_multiple) * order_multiple

            # Calculate days of supply
            days_of_supply = order_quantity / daily_consumption if daily_consumption > 0 else 0

            return {
                'replenishment_needed': True,
                'order_quantity': int(order_quantity),
                'inventory_position': inventory_position,
                'target_inventory': target_inventory,
                'days_of_supply': round(days_of_supply, 1),
                'reason': 'Inventory below minimum threshold'
            }
        else:
            return {
                'replenishment_needed': False,
                'order_quantity': 0,
                'inventory_position': inventory_position,
                'days_of_supply': round(inventory_position / daily_consumption if daily_consumption > 0 else 0, 1),
                'reason': 'Inventory sufficient'
            }

    def simulate_vmi_performance(self, demand_series, vmi_params, initial_inventory):
        """
        Simulate VMI program performance

        demand_series: Daily demand data
        vmi_params: VMI parameters
        initial_inventory: Starting inventory
        """

        results = []
        current_inventory = initial_inventory
        pipeline = 0
        orders_placed = []

        for day, demand in enumerate(demand_series):
            # Check for arriving orders
            arriving_orders = [o for o in orders_placed if o['arrival_day'] == day]
            for order in arriving_orders:
                current_inventory += order['quantity']
                pipeline -= order['quantity']
                orders_placed.remove(order)

            # Satisfy demand
            demand_satisfied = min(demand, current_inventory)
            stockout = max(0, demand - current_inventory)
            current_inventory = max(0, current_inventory - demand)

            # Check if replenishment needed
            daily_avg_consumption = np.mean(demand_series[:day+1]) if day > 0 else demand
            replenishment = self.calculate_vmi_replenishment(
                current_inventory, pipeline, daily_avg_consumption, vmi_params
            )

            if replenishment['replenishment_needed']:
                # Place order
                order = {
                    'day': day,
                    'quantity': replenishment['order_quantity'],
                    'arrival_day': day + vmi_params['lead_time_days']
                }
                orders_placed.append(order)
                pipeline += order['quantity']

            results.append({
                'day': day,
                'demand': demand,
                'demand_satisfied': demand_satisfied,
                'stockout': stockout,
                'ending_inventory': current_inventory,
                'pipeline_inventory': pipeline,
                'order_placed': replenishment['replenishment_needed'],
                'order_quantity': replenishment['order_quantity']
            })

        df = pd.DataFrame(results)

        # Calculate metrics
        metrics = {
            'avg_inventory': df['ending_inventory'].mean(),
            'max_inventory': df['ending_inventory'].max(),
            'min_inventory': df['ending_inventory'].min(),
            'total_stockouts': df['stockout'].sum(),
            'fill_rate': (df['demand_satisfied'].sum() / df['demand'].sum() * 100) if df['demand'].sum() > 0 else 100,
            'orders_placed': df['order_placed'].sum(),
            'avg_order_size': df[df['order_placed']]['order_quantity'].mean() if df['order_placed'].sum() > 0 else 0
        }

        return {
            'simulation_results': df,
            'performance_metrics': metrics
        }


# Example VMI implementation
vmi = VMIProgram(buyer_id='BUYER001', supplier_id='SUP001')

# Set VMI parameters
vmi_params = vmi.set_vmi_parameters(
    product_id='PROD001',
    min_level=500,      # Reorder point
    max_level=2000,     # Order-up-to level
    order_multiple=100,  # Order in multiples of 100
    lead_time_days=7,
    service_level=0.95
)

# Simulate 90 days of VMI
np.random.seed(42)
demand_series = np.random.poisson(lam=150, size=90)  # Average demand of 150 units/day

simulation = vmi.simulate_vmi_performance(
    demand_series, vmi_params, initial_inventory=1500
)

print("VMI Performance Metrics:")
print(f"  Average Inventory: {simulation['performance_metrics']['avg_inventory']:.0f} units")
print(f"  Fill Rate: {simulation['performance_metrics']['fill_rate']:.1f}%")
print(f"  Total Stockouts: {simulation['performance_metrics']['total_stockouts']:.0f} units")
print(f"  Orders Placed: {simulation['performance_metrics']['orders_placed']:.0f}")
print(f"  Average Order Size: {simulation['performance_metrics']['avg_order_size']:.0f} units")

CPFR の導入

協働計画プロセス
class CPFRProgram:
    """Collaborative Planning, Forecasting, and Replenishment program"""

    def __init__(self, buyer_name, supplier_name):
        self.buyer_name = buyer_name
        self.supplier_name = supplier_name
        self.shared_forecast = {}
        self.exceptions = []

    def create_joint_forecast(self, buyer_forecast, supplier_forecast, product_id):
        """
        Create joint forecast from buyer and supplier inputs

        Use weighted average or exception-based consensus
        """

        if len(buyer_forecast) != len(supplier_forecast):
            raise ValueError("Forecast lengths must match")

        joint_forecast = []
        exceptions = []

        for i, (buyer_qty, supplier_qty) in enumerate(zip(buyer_forecast, supplier_forecast)):
            # Calculate variance
            variance_pct = abs(buyer_qty - supplier_qty) / ((buyer_qty + supplier_qty) / 2) * 100 if (buyer_qty + supplier_qty) > 0 else 0

            # If variance > threshold, flag as exception
            if variance_pct > 20:  # 20% threshold
                exceptions.append({
                    'period': i + 1,
                    'buyer_forecast': buyer_qty,
                    'supplier_forecast': supplier_qty,
                    'variance_pct': round(variance_pct, 1),
                    'status': 'Requires Resolution',
                    'consensus_qty': None
                })

                # Use weighted average (60% buyer, 40% supplier) pending resolution
                consensus_qty = int(buyer_qty * 0.6 + supplier_qty * 0.4)
            else:
                # Use weighted average
                consensus_qty = int(buyer_qty * 0.6 + supplier_qty * 0.4)

            joint_forecast.append({
                'period': i + 1,
                'buyer_forecast': buyer_qty,
                'supplier_forecast': supplier_qty,
                'variance_pct': round(variance_pct, 1),
                'consensus_forecast': consensus_qty,
                'has_exception': variance_pct > 20
            })

        self.shared_forecast[product_id] = joint_forecast
        self.exceptions.extend(exceptions)

        return {
            'joint_forecast': pd.DataFrame(joint_forecast),
            'exceptions': pd.DataFrame(exceptions) if exceptions else pd.DataFrame(),
            'forecast_accuracy_alignment': round(100 - variance_pct, 1) if variance_pct < 100 else 0
        }

    def resolve_exception(self, period, consensus_qty, resolution_notes):
        """Resolve forecast exception with agreed quantity"""

        for exception in self.exceptions:
            if exception['period'] == period and exception['status'] == 'Requires Resolution':
                exception['consensus_qty'] = consensus_qty
                exception['status'] = 'Resolved'
                exception['resolution_notes'] = resolution_notes
                exception['resolution_date'] = datetime.now()

                # Update shared forecast
                for product_id, forecast_list in self.shared_forecast.items():
                    for period_forecast in forecast_list:
                        if period_forecast['period'] == period:
                            period_forecast['consensus_forecast'] = consensus_qty
                            break

                return True

        return False

    def calculate_collaboration_benefits(self, baseline_metrics, cpfr_metrics):
        """
        Calculate benefits from CPFR collaboration

        baseline_metrics: Pre-CPFR performance
        cpfr_metrics: Post-CPFR performance
        """

        # Forecast accuracy improvement
        forecast_improvement = cpfr_metrics['forecast_accuracy'] - baseline_metrics['forecast_accuracy']

        # Inventory reduction
        inventory_reduction_pct = (baseline_metrics['avg_inventory'] - cpfr_metrics['avg_inventory']) / baseline_metrics['avg_inventory'] * 100

        # Service level improvement
        service_improvement = cpfr_metrics['fill_rate'] - baseline_metrics['fill_rate']

        # Cost savings
        inventory_cost_rate = 0.25  # 25% annual carrying cost
        inventory_value_reduction = (baseline_metrics['avg_inventory'] - cpfr_metrics['avg_inventory']) * cpfr_metrics['unit_cost']
        annual_savings = inventory_value_reduction * inventory_cost_rate

        # Stockout reduction
        stockout_reduction = baseline_metrics['stockout_events'] - cpfr_metrics['stockout_events']
        stockout_cost_avoided = stockout_reduction * cpfr_metrics['stockout_cost_per_event']

        total_annual_benefit = annual_savings + stockout_cost_avoided

        return {
            'forecast_accuracy_improvement_pts': round(forecast_improvement, 1),
            'inventory_reduction_pct': round(inventory_reduction_pct, 1),
            'inventory_value_reduction': round(inventory_value_reduction, 2),
            'service_level_improvement_pts': round(service_improvement, 1),
            'annual_inventory_savings': round(annual_savings, 2),
            'stockout_cost_avoided': round(stockout_cost_avoided, 2),
            'total_annual_benefit': round(total_annual_benefit, 2)
        }


# Example CPFR implementation
cpfr = CPFRProgram(buyer_name='Acme Corp', supplier_name='Widget Manufacturing')

# Buyer and supplier forecasts for next 12 months
buyer_forecast = [1000, 1100, 1200, 1500, 1800, 1600, 1400, 1300, 1200, 1100, 1000, 950]
supplier_forecast = [1050, 1150, 1100, 1400, 2000, 1650, 1500, 1250, 1200, 1150, 1050, 1000]

# Create joint forecast
joint_forecast_result = cpfr.create_joint_forecast(
    buyer_forecast, supplier_forecast, product_id='PROD001'
)

print("CPFR Joint Forecast:")
print(joint_forecast_result['joint_forecast'][['period', 'buyer_forecast', 'supplier_forecast', 'variance_pct', 'consensus_forecast', 'has_exception']])

print(f"\n\nExceptions Requiring Resolution:")
if not joint_forecast_result['exceptions'].empty:
    print(joint_forecast_result['exceptions'])
else:
    print("None")

# Resolve exception for period 5
cpfr.resolve_exception(
    period=5,
    consensus_qty=1850,
    resolution_notes='Agreed to buyer forecast due to confirmed promotion'
)

# Calculate benefits
baseline = {
    'forecast_accuracy': 70,
    'avg_inventory': 5000,
    'fill_rate': 92,
    'stockout_events': 12
}

cpfr_performance = {
    'forecast_accuracy': 85,
    'avg_inventory': 4200,
    'fill_rate': 96,
    'stockout_events': 4,
    'unit_cost': 50,
    'stockout_cost_per_event': 5000
}

benefits = cpfr.calculate_collaboration_benefits(baseline, cpfr_performance)

print(f"\n\nCPFR Benefits:")
print(f"  Forecast Accuracy Improvement: +{benefits['forecast_accuracy_improvement_pts']} pts")
print(f"  Inventory Reduction: {benefits['inventory_reduction_pct']}%")
print(f"  Service Level Improvement: +{benefits['service_level_improvement_pts']} pts")
print(f"  Annual Inventory Savings: ${benefits['annual_inventory_savings']:,.2f}")
print(f"  Stockout Cost Avoided: ${benefits['stockout_cost_avoided']:,.2f}")
print(f"  Total Annual Benefit: ${benefits['total_annual_benefit']:,.2f}")

ツールとライブラリ

Python ライブラリ

コラボレーションプラットフォーム:

  • pandas:データ操作
  • numpy:数値計算
  • flask / fastapi:ポータル向け API 開発

コミュニケーション:

  • requests:API 統合
  • smtplib:メール通知
  • twilio:SMS アラート

データ交換:

  • xml.etree:EDI 向け XML 処理
  • json:JSON データ処理
  • ftplib:ファイル転送

可視化:

  • matplotlib、plotly:ダッシュボード
  • dash:インタラクティブなポータル
商用ソフトウェア

サプライヤーとのコラボレーション:

  • SAP Ariba:サプライヤーネットワークとコラボレーション
  • Coupa Supplier Portal:サプライヤーエンゲージメント
  • Ivalua:サプライヤーとのコラボレーション
  • Jaggaer:サプライヤー管理

CPFR と計画:

  • Blue Yonder:協調計画
  • Kinaxis RapidResponse:協調型 S&OP
  • o9 Solutions:協調計画
  • E2open:サプライチェーンのコラボレーション

VMI と補充:

  • Blue Yonder (JDA) Replenishment:VMI と自動補充
  • SAP IBP:VMI を含む統合計画
  • Manhattan VMI:ベンダー管理在庫

コミュニケーションとポータル:

  • Salesforce:サプライヤーポータル機能
  • Microsoft SharePoint:コラボレーション用ワークスペース
  • Slack:チームコミュニケーション
  • Microsoft Teams:コラボレーションプラットフォーム

よくある課題と解決策

課題:信頼と透明性

問題:

  • 機密データの共有に消極的
  • 情報の悪用に対する懸念
  • 過去の対立関係
  • 競争上の懸念

解決策:

  • 機密性の低いデータ(コストではなく予測)から始めます
  • データの使用に関する明確な合意とガバナンスを設けます
  • 相互利益を示します
  • 匿名性を確保するためにサードパーティのプラットフォームを利用します
  • 段階的に信頼関係を築きます
  • 経営幹部との関係を構築します
課題:テクノロジーの統合

問題:

  • システムやプラットフォームが異なる
  • レガシーテクノロジーの制約
  • IT リソースの制約
  • セキュリティ上の懸念

解決策:

  • API ファーストのアプローチを採用します
  • クラウドベースのコラボレーションプラットフォームを利用します
  • 標準化された取引には EDI を使用します
  • 段階的な統合ロードマップを策定します
  • マネージドサービスプロバイダーを活用します
  • 軽量なツール(ポータル、スプレッドシート)を利用します
課題:組織内の足並みを揃えること

問題:

  • 社内の抵抗
  • インセンティブの不一致
  • 部門間のサイロ化
  • 優先事項の競合

解決策:

  • 部門横断型のガバナンスを導入します
  • 共通の KPI とスコアカードを設定します
  • 経営幹部の支援を得ます
  • 変更管理プログラムを実施します
  • 成果につながりやすい施策で勢いをつけます
  • 評価と報奨を行います
課題:サプライヤーの能力不足

問題:

  • 小規模サプライヤーは十分なノウハウを持たない
  • テクノロジーへのアクセスが限られている
  • リソースの制約
  • 知識不足

解決策:

  • 階層化したコラボレーションのアプローチを採用します
  • サプライヤー向けのトレーニングと支援を行います
  • テクノロジーを提供します(ポータルへのアクセスなど)
  • 小規模サプライヤー向けにプロセスを簡素化します
  • 段階的に導入します
  • リソースとサポートを共有します
課題:パフォーマンスの測定

問題:

  • コラボレーションの効果を切り分けにくい
  • 結果に影響する変数が複数ある
  • 測定方法が異なる
  • データを入手できない

解決策:

  • コラボレーション開始前に基準値を設定します
  • 可能であれば対照群を設けます
  • 実施前後の分析を行います
  • 明確な効果の帰属方法を定めます
  • 定期的にレビューして調整します
  • 定性的・定量的な指標を用います
課題:エンゲージメントの維持

問題:

  • 当初の熱意が薄れる
  • 日常業務が後回しになる
  • 関係が徐々に希薄になる
  • 優先事項が競合する

解決策:

  • 定期的に構造化されたレビューを実施します(四半期ごとの JBP)
  • 継続的に価値を示します
  • 関係管理のプロセスを導入します
  • パフォーマンスダッシュボードで状況を可視化します
  • 評価プログラムを実施します
  • パートナーシップを進化させ、革新します

出力形式

サプライヤー協業レポート

エグゼクティブサマリー:

  • 協業プログラムの状況
  • 主な成果とメリット
  • 現在のパートナーシップ
  • 投資とROI

協業ポートフォリオ:

サプライヤー協業モデル成熟度レベル年間支出実現したメリット関係スコア
サプライヤー ACPFRレベル 4$5.0M$450K8.5/10
サプライヤー BVMIレベル 3$3.5M$280K7.8/10
サプライヤー CESIレベル 3$2.8M$320K8.2/10
サプライヤー DJBPレベル 2$2.2M$120K7.0/10

プログラムのパフォーマンス:

指標ベースライン現在改善目標
需要予測精度68%82%+14 pts85%
在庫回転率6.28.5+2.39.0
充足率91%96%+5 pts97%
リードタイム28 days21 days-7 days18 days
サプライヤーの納期遵守率88%94%+6 pts96%

メリットの概要:

メリットのカテゴリー年間価値源泉
在庫削減$850KVMI/CPFR による安全在庫の削減
サービスの向上$420K欠品と緊急出荷の削減
プロセス効率$230K補充の自動化、発注回数の削減
イノベーション価値$500K共同製品開発(ESI)
合計$2.0M

進行中の取り組み:

取り組みサプライヤー開始日ステータス期待されるメリット
CPFR の拡大サプライヤー EQ1 2026進行中$300K/yr
VMI パイロットサプライヤー FQ2 2026計画中$150K/yr
共同イノベーションプロジェクトサプライヤー AQ3 2025実施中未定
サプライヤー研修プログラム全社継続中実施中能力構築

質問事項

詳細な背景情報が必要な場合:

  1. 協業の目的は何ですか?(コスト、サービス、イノベーション、リスク)
  2. どのサプライヤーを協業対象としますか?
  3. 現在の関係の質と成熟度はどの程度ですか?
  4. どの協業モデルを検討していますか?(VMI、CPFR、ESI、JBP)
  5. サプライヤーと共有できるデータは何ですか?
  6. どのようなテクノロジーインフラがありますか?
  7. サプライヤー管理に利用できるリソースは何ですか?
  8. 参考にできる協業の成功事例はありますか?
  9. 協業を妨げる障壁は何ですか?
  10. 成功をどのように測定しますか?

関連スキル

  • supplier-selection:戦略的な協業パートナーの特定に使用
  • supplier-risk-management:協業するサプライヤーのリスク監視に使用
  • procurement-optimization:協業型の調達最適化に使用
  • demand-forecasting:CPFR での共同需要予測に使用
  • inventory-optimization:VMI パラメーターの設定に使用
  • contract-management:協業契約に使用
  • control-tower-design:サプライヤーの可視性統合に使用
  • demand-supply-matching:協業型の計画プロセスに使用

コメント