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.
Demo seed script was failing with ImportError because the
create_batch_reasoning_regular_schedule function was referenced
but not implemented in reasoning_types.py.
Added the missing helper function to support REGULAR_SCHEDULE
batch reasoning type for regular scheduled production batches.
Fixes container restart loop in demo-seed-production-batches pod.
Implemented proper reasoning data generation for purchase orders and
production batches to enable multilingual dashboard support.
Backend Strategy:
- Generate structured JSON with type codes and parameters
- Store only reasoning_data (JSONB), not hardcoded text
- Frontend will translate using i18n libraries
Changes:
1. Created shared/schemas/reasoning_types.py
- Defined reasoning types for POs and batches
- Created helper functions for common reasoning patterns
- Supports multiple reasoning types (low_stock, forecast_demand, etc.)
2. Production Service (services/production/app/services/production_service.py)
- Generate reasoning_data when creating batches from forecast
- Include parameters: product_name, predicted_demand, current_stock, etc.
- Structure supports frontend i18n interpolation
3. Procurement Service (services/procurement/app/services/procurement_service.py)
- Implemented actual PO creation (was placeholder before!)
- Groups requirements by supplier
- Generates reasoning_data based on context (low_stock vs forecast)
- Creates PO items automatically
Example reasoning_data:
{
"type": "low_stock_detection",
"parameters": {
"supplier_name": "Harinas del Norte",
"product_names": ["Flour Type 55", "Flour Type 45"],
"days_until_stockout": 3,
"current_stock": 45.5,
"required_stock": 200
},
"consequence": {
"type": "stockout_risk",
"severity": "high",
"impact_days": 3
}
}
Frontend will translate:
- EN: "Low stock detected for Harinas del Norte. Stock runs out in 3 days."
- ES: "Stock bajo detectado para Harinas del Norte. Se agota en 3 días."
- CA: "Estoc baix detectat per Harinas del Norte. S'esgota en 3 dies."
Next steps:
- Remove TEXT fields (reasoning, consequence) from models
- Update dashboard service to use reasoning_data
- Create frontend i18n translation keys
- Update dashboard components to translate dynamically