feat: Add complete set of PO reasoning helper functions

Added missing helper functions for all purchase order reasoning types:
- create_po_reasoning_supplier_contract: Contract-based orders
- create_po_reasoning_safety_stock: Safety stock replenishment
- create_po_reasoning_seasonal_demand: Seasonal preparation
- create_po_reasoning_production_requirement: Production needs
- create_po_reasoning_manual_request: Manual orders

These functions generate structured reasoning_data for i18n translation
and provide consistent reasoning structure across all PO types.

Fixes ImportError in demo-seed-purchase-orders pod.
This commit is contained in:
Claude
2025-11-07 19:46:27 +00:00
parent 0fb519f0c4
commit 0a2982d22f

View File

@@ -206,6 +206,145 @@ def create_po_reasoning_forecast_demand(
} }
def create_po_reasoning_supplier_contract(
supplier_name: str,
product_names: list,
contract_terms: str = "monthly",
contract_quantity: float = 0
) -> Dict[str, Any]:
"""Create reasoning data for supplier contract fulfillment"""
return {
"type": PurchaseOrderReasoningType.SUPPLIER_CONTRACT.value,
"parameters": {
"supplier_name": supplier_name,
"product_names": product_names,
"product_count": len(product_names),
"contract_terms": contract_terms,
"contract_quantity": contract_quantity
},
"consequence": {
"type": "contract_breach",
"severity": ConsequenceSeverity.HIGH.value,
"impact": "contract_penalties"
},
"metadata": {
"trigger_source": "contract_schedule",
"ai_assisted": False
}
}
def create_po_reasoning_safety_stock(
supplier_name: str,
product_names: list,
current_safety_stock: float,
target_safety_stock: float,
reorder_point: float
) -> Dict[str, Any]:
"""Create reasoning data for safety stock replenishment"""
return {
"type": PurchaseOrderReasoningType.SAFETY_STOCK_REPLENISHMENT.value,
"parameters": {
"supplier_name": supplier_name,
"product_names": product_names,
"product_count": len(product_names),
"current_safety_stock": round(current_safety_stock, 1),
"target_safety_stock": round(target_safety_stock, 1),
"reorder_point": round(reorder_point, 1)
},
"consequence": {
"type": "stockout_risk",
"severity": ConsequenceSeverity.MEDIUM.value,
"impact": "reduced_buffer"
},
"metadata": {
"trigger_source": "orchestrator_auto",
"ai_assisted": True
}
}
def create_po_reasoning_seasonal_demand(
supplier_name: str,
product_names: list,
season: str,
expected_demand_increase_pct: float
) -> Dict[str, Any]:
"""Create reasoning data for seasonal demand preparation"""
return {
"type": PurchaseOrderReasoningType.SEASONAL_DEMAND.value,
"parameters": {
"supplier_name": supplier_name,
"product_names": product_names,
"product_count": len(product_names),
"season": season,
"expected_demand_increase_pct": round(expected_demand_increase_pct, 1)
},
"consequence": {
"type": "missed_opportunity",
"severity": ConsequenceSeverity.MEDIUM.value,
"impact": "lost_seasonal_sales"
},
"metadata": {
"trigger_source": "orchestrator_auto",
"ai_assisted": True
}
}
def create_po_reasoning_production_requirement(
supplier_name: str,
product_names: list,
production_batches: int,
required_by_date: str
) -> Dict[str, Any]:
"""Create reasoning data for production requirement"""
return {
"type": PurchaseOrderReasoningType.PRODUCTION_REQUIREMENT.value,
"parameters": {
"supplier_name": supplier_name,
"product_names": product_names,
"product_count": len(product_names),
"production_batches": production_batches,
"required_by_date": required_by_date
},
"consequence": {
"type": "production_delay",
"severity": ConsequenceSeverity.HIGH.value,
"impact": "blocked_production"
},
"metadata": {
"trigger_source": "production_schedule",
"ai_assisted": True
}
}
def create_po_reasoning_manual_request(
supplier_name: str,
product_names: list,
requested_by: str,
reason: str = "manual_order"
) -> Dict[str, Any]:
"""Create reasoning data for manual purchase request"""
return {
"type": PurchaseOrderReasoningType.MANUAL_REQUEST.value,
"parameters": {
"supplier_name": supplier_name,
"product_names": product_names,
"product_count": len(product_names),
"requested_by": requested_by,
"reason": reason
},
"consequence": None,
"metadata": {
"trigger_source": "manual",
"ai_assisted": False
}
}
def create_batch_reasoning_forecast_demand( def create_batch_reasoning_forecast_demand(
product_name: str, product_name: str,
predicted_demand: float, predicted_demand: float,