kishorkukreja/awesome-supply-chain/procurement-optimization

Claude Code and agent skill by kishorkukreja/awesome-supply-chain

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

When the user wants to optimize procurement decisions, allocate orders across suppliers, or determine optimal order quantities. Also use when the user mentions "order allocation," "supplier portfolio optimization," "lot sizing," "order splitting," "purchase optimization," "EOQ," "sourcing optimization," or "multi-sourcing strategy." For supplier selection, see supplier-selection. For spend analysis, see spend-analysis.

Install

npx vskill@latest install kishorkukreja/awesome-supply-chain/procurement-optimization

SKILL.md

Procurement Optimization

You are an expert in procurement optimization and decision science. Your goal is to help organizations make optimal purchasing decisions that minimize total costs while meeting requirements for service levels, capacity constraints, and risk management.

Initial Assessment

Before optimizing procurement, understand:

  1. Procurement Context
  • What products/materials are being procured?
  • Current procurement process and pain points?
  • Spend volume and frequency?
  • Number of suppliers and current allocation?
  1. Business Objectives
  • Primary goal? (cost, service, risk, sustainability)
  • Cost components? (price, freight, duties, carrying)
  • Service level requirements?
  • Risk tolerance?
  1. Constraints
  • Supplier capacity limits?
  • Minimum order quantities (MOQs)?
  • Lead times and delivery windows?
  • Budget or working capital limits?
  • Quality or certification requirements?
  1. Data Availability
  • Historical demand and order patterns?
  • Supplier pricing (including volume discounts)?
  • Inventory carrying costs?
  • Order processing costs?
  • Transportation and logistics costs?

Procurement Optimization Framework

Key Decision Areas

1. Order Quantity Decisions

  • Economic Order Quantity (EOQ)
  • Lot-sizing with constraints
  • Quantity discount optimization
  • Joint replenishment

2. Supplier Allocation Decisions

  • Single vs. multi-sourcing
  • Order splitting across suppliers
  • Portfolio optimization
  • Supplier diversification

3. Timing Decisions

  • Reorder points
  • Order scheduling
  • Lead time management
  • Safety stock levels

4. Contract Decisions

  • Fixed vs. flexible quantities
  • Price vs. volume commitments
  • Long-term vs. spot buying
  • Options and hedging

Economic Order Quantity (EOQ)

Classic EOQ Model

Assumptions:

  • Constant demand rate
  • Instantaneous replenishment
  • No stockouts
  • Fixed ordering cost and carrying cost

Formula:

EOQ = √(2 × D × S / H)
Where:
D = Annual demand (units)
S = Fixed ordering cost per order
H = Annual holding cost per unit
python
import numpy as np
import matplotlib.pyplot as plt
def economic_order_quantity(annual_demand, order_cost, holding_cost_rate, unit_cost):
"""
Calculate Economic Order Quantity
Parameters:
- annual_demand: units per year
- order_cost: fixed cost per order ($)
- holding_cost_rate: % of unit cost (e.g., 0.25 for 25%)
- unit_cost: cost per unit ($)
Returns:
- EOQ, total annual cost, number of orders
"""
holding_cost_per_unit = unit_cost * holding_cost_rate
# EOQ formula
eoq = np.sqrt((2 * annual_demand * order_cost) / holding_cost_per_unit)
# Number of orders per year
num_orders = annual_demand / eoq
# Total annual cost
ordering_cost = num_orders * order_cost
holding_cost = (eoq / 2) * holding_cost_per_unit
purchase_cost = annual_demand * unit_cost
total_cost = ordering_cost + holding_cost + purchase_cost
return {
'eoq': round(eoq, 0),
'num_orders_per_year': round(num_orders, 1),
'order_frequency_days': round(365 / num_orders, 1),
'total_annual_cost': round(total_cost, 2),
'ordering_cost': round(ordering_cost, 2),
'holding_cost': round(holding_cost, 2),
'purchase_cost': round(purchase_cost, 2)
}
# Example
result = economic_order_quantity(
annual_demand=10000, # 10,000 units/year
order_cost=100, # $100 per order
holding_cost_rate=0.25, # 25% carrying cost
unit_cost=50 # $50/unit
)
print(f"Optimal Order Quantity: {result['eoq']} units")
print(f"Order Frequency: Every {result['order_frequency_days']} days")
print(f"Total Annual Cost: ${result['total_annual_cost']:,.0f}")
EOQ with Quantity Discounts

All-Units Discount:

  • Price break at certain volume levels
  • All units purchased at discounted price
python
def eoq_quantity_discounts(annual_demand, order_cost, holding_cost_rate, price_breaks):
"""
EOQ with all-units quantity discounts
price_breaks: list of (quantity, unit_price) tuples
Example: [(0, 50), (500, 48), (1000, 46)]
"""
price_breaks = sorted(price_breaks, key=lambda x: x[0])
best_option = None
best_cost = float('inf')
for i, (min_qty, unit_price) in enumerate(price_breaks):
holding_cost = unit_price * holding_cost_rate
# Calculate EOQ for this price
eoq = np.sqrt((2 * annual_demand * order_cost) / holding_cost)
# Determine feasible order quantity
if i < len(price_breaks) - 1:
max_qty = price_breaks[i + 1][0] - 1
else:
max_qty = float('inf')
if eoq < min_qty:
order_qty = min_qty # Use minimum quantity for this price tier
elif eoq > max_qty:
continue # EOQ not feasible in this tier
else:
order_qty = eoq
# Calculate total cost
num_orders = annual_demand / order_qty
ordering_cost = num_orders * order_cost
holding_cost_annual = (order_qty / 2) * holding_cost
purchase_cost = annual_demand * unit_price
total_cost = ordering_cost + holding_cost_annual + purchase_cost
if total_cost < best_cost:
best_cost = total_cost
best_option = {
'order_quantity': round(order_qty, 0),
'unit_price': unit_price,
'num_orders': round(num_orders, 1),
'total_cost': round(total_cost, 2),
'ordering_cost': round(ordering_cost, 2),
'holding_cost': round(holding_cost_annual, 2),
'purchase_cost': round(purchase_cost, 2)
}
return best_option
# Example with quantity discounts
price_breaks = [
(0, 50), # $50/unit for 0-499
(500, 48), # $48/unit for 500-999
(1000, 46), # $46/unit for 1000+
(2000, 44) # $44/unit for 2000+
]
result = eoq_quantity_discounts(
annual_demand=10000,
order_cost=100,
holding_cost_rate=0.25,
price_breaks=price_breaks
)
print(f"Optimal Order Quantity: {result['order_quantity']} units")
print(f"Unit Price: ${result['unit_price']}")
print(f"Total Annual Cost: ${result['total_cost']:,.0f}")
print(f" Purchase: ${result['purchase_cost']:,.0f}")
print(f" Ordering: ${result['ordering_cost']:,.0f}")
print(f" Holding: ${result['holding_cost']:,.0f}")

Supplier Allocation Optimization

Multi-Sourcing Problem

Objective: Allocate orders across multiple suppliers to minimize total cost while meeting capacity, quality, and risk constraints.

Mathematical Formulation:

Decision Variables:
x_i = quantity ordered from supplier i
Objective:
Minimize: Σ (p_i × x_i + f_i × y_i + t_i × x_i)
Where:
p_i = unit price from supplier i
f_i = fixed ordering cost from supplier i
t_i = transportation cost per unit from supplier i
y_i = binary (1 if order from supplier i, 0 otherwise)
Constraints:
Σ x_i >= D (meet demand)
x_i <= C_i × y_i (supplier capacity)
x_i >= MOQ_i × y_i (minimum order quantity)
Σ (q_i × x_i) / Σ x_i >= Q (average quality requirement)
x_i / Σ x_i <= R_max (diversification - max % per supplier)
python
from pulp import *
import pandas as pd
def optimize_supplier_allocation(suppliers, demand, constraints=None):
"""
Optimize order allocation across multiple suppliers
suppliers: DataFrame with columns:
- supplier_id, unit_price, fixed_cost, capacity, moq,
transport_cost, quality_score, lead_time
demand: total quantity needed
constraints: dict with optional keys:
- min_quality: minimum average quality score
- max_supplier_share: max % of demand from one supplier
- max_suppliers: maximum number of suppliers to use
"""
if constraints is None:
constraints = {}
# Create problem
prob = LpProblem("Supplier_Allocation", LpMinimize)
# Decision variables
# x[i] = quantity from supplier i
x = LpVariable.dicts("Quantity",
suppliers.index,
lowBound=0,
cat='Continuous')
# y[i] = 1 if order from supplier i, 0 otherwise
y = LpVariable.dicts("Use",
suppliers.index,
cat='Binary')
# Objective function: minimize total cost
prob += (
# Variable costs (unit price + transport)
lpSum([(suppliers.loc[i, 'unit_price'] +
suppliers.loc[i, 'transport_cost']) * x[i]
for i in suppliers.index]) +
# Fixed ordering costs
lpSum([suppliers.loc[i, 'fixed_cost'] * y[i]
for i in suppliers.index])
)
# Constraint 1: Meet total demand
prob += lpSum([x[i] for i in suppliers.index]) >= demand, "Meet_Demand"
# Constraint 2: Capacity limits
for i in suppliers.index:
prob += x[i] <= suppliers.loc[i, 'capacity'] * y[i], f"Capacity_{i}"
# Constraint 3: Minimum order quantities
for i in suppliers.index:
prob += x[i] >= suppliers.loc[i, 'moq'] * y[i], f"MOQ_{i}"
# Constraint 4: Quality requirement
if 'min_quality' in constraints:
prob += (
lpSum([suppliers.loc[i, 'quality_score'] * x[i]
for i in suppliers.index]) >=
constraints['min_quality'] * demand,
"Min_Quality"
)
# Constraint 5: Diversification (max share per supplier)
if 'max_supplier_share' in constraints:
for i in suppliers.index:
prob += (
x[i] <= constraints['max_supplier_share'] * demand,
f"Max_Share_{i}"
)
# Constraint 6: Limit number of suppliers
if 'max_suppliers' in constraints:
prob += (
lpSum([y[i] for i in suppliers.index]) <=
constraints['max_suppliers'],
"Max_Suppliers"
)
# Solve
prob.solve(PULP_CBC_CMD(msg=0))
# Extract results
if LpStatus[prob.status] != 'Optimal':
return {'status': LpStatus[prob.status], 'solution': None}
results = []
for i in suppliers.index:
if x[i].varValue > 0.01:
qty = x[i].varValue
unit_cost = (suppliers.loc[i, 'unit_price'] +
suppliers.loc[i, 'transport_cost'])
variable_cost = qty * unit_cost
fixed_cost = suppliers.loc[i, 'fixed_cost']
total_cost = variable_cost + fixed_cost
results.append({
'Supplier': suppliers.loc[i, 'supplier_id'],
'Quantity': round(qty, 0),
'Share_%': round(qty / demand * 100, 1),
'Unit_Cost': unit_cost,
'Variable_Cost': round(variable_cost, 2),
'Fixed_Cost': fixed_cost,
'Total_Cost': round(total_cost, 2),
'Quality_Score': suppliers.loc[i, 'quality_score'],
'Lead_Time': suppliers.loc[i, 'lead_time']
})
results_df = pd.DataFrame(results)
results_df = results_df.sort_values('Total_Cost')
return {
'status': 'Optimal',
'total_cost': round(value(prob.objective), 2),
'allocation': results_df,
'avg_quality': round(
(results_df['Quantity'] * results_df['Quality_Score']).sum() /
results_df['Quantity'].sum(), 2
),
'num_suppliers': len(results_df)
}

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
13
Repository forks
5
7-day trend score
13

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 25 Apr 2026, 6 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/kishorkukreja/awesome-supply-chain/procurement-optimization/badge)](https://verified-skill.com/skills/kishorkukreja/awesome-supply-chain/procurement-optimization)

Something wrong with this skill or its page? Tell us.