Fix template variable interpolation issues in dashboard
This commit fixes the template interpolation issues where variables like
{{supplier_name}}, {{product_names_joined}}, {{current_stock}}, etc. were
showing as literal strings instead of being replaced with actual values.
Changes made:
1. **Dashboard Service (Orchestrator):**
- Added missing `current_stock` parameter to default reasoning_data for
production batches
- This ensures all required template variables are present when batches
don't have proper reasoning_data from the database
2. **Production Service:**
- Updated batch creation to properly populate `product_name` field
- Improved product name resolution to check forecast data and stock_info
before falling back to placeholder
- Added missing `product_id` field to batch_data
- Added required `planned_duration_minutes` field to batch_data
- Ensures reasoning_data has all required parameters (product_name,
predicted_demand, current_stock, confidence_score)
The root cause was that the default reasoning_data used by the dashboard
service when database records lacked proper reasoning_data was missing
required parameters. This resulted in i18n template variables being
displayed as literal {{variable}} strings instead of interpolated values.
Fixes dashboard display issues for:
- Purchase order cards showing {{supplier_name}}, {{product_names_joined}},
{{days_until_stockout}}
- Production plan items showing {{product_name}}, {{predicted_demand}},
{{current_stock}}, {{confidence_score}}
This commit is contained in:
@@ -1839,8 +1839,15 @@ class ProductionService:
|
||||
# Generate reasoning data for JTBD dashboard
|
||||
from shared.schemas.reasoning_types import create_batch_reasoning_forecast_demand
|
||||
|
||||
# Try to get product name from forecast, stock_info, or use placeholder
|
||||
product_name = (
|
||||
forecast.get('product_name') or
|
||||
(stock_info.get('product_name') if stock_info else None) or
|
||||
f"Product {product_id}"
|
||||
)
|
||||
|
||||
reasoning_data = create_batch_reasoning_forecast_demand(
|
||||
product_name=f"Product {product_id}", # TODO: Get actual product name from inventory
|
||||
product_name=product_name,
|
||||
predicted_demand=predicted_demand,
|
||||
current_stock=current_stock,
|
||||
production_needed=production_needed,
|
||||
@@ -1849,16 +1856,23 @@ class ProductionService:
|
||||
)
|
||||
|
||||
# Create production batch
|
||||
planned_start = datetime.combine(target_date, datetime.min.time())
|
||||
planned_end = datetime.combine(target_date, datetime.max.time())
|
||||
duration_minutes = int((planned_end - planned_start).total_seconds() / 60)
|
||||
|
||||
batch_data = {
|
||||
'tenant_id': tenant_id,
|
||||
'schedule_id': schedule.id,
|
||||
'product_id': product_id, # Product ID from forecast
|
||||
'product_name': product_name, # Product name resolved above
|
||||
'recipe_id': product_id, # Assuming recipe_id matches product_id
|
||||
'batch_number': await self._generate_batch_number(session, tenant_id, target_date, batches_created + 1),
|
||||
'status': 'scheduled',
|
||||
'priority': 'normal',
|
||||
'planned_start_time': datetime.combine(target_date, datetime.min.time()),
|
||||
'planned_end_time': datetime.combine(target_date, datetime.max.time()),
|
||||
'planned_start_time': planned_start,
|
||||
'planned_end_time': planned_end,
|
||||
'planned_quantity': production_needed,
|
||||
'planned_duration_minutes': duration_minutes,
|
||||
'reasoning_data': reasoning_data, # NEW: Structured reasoning for i18n
|
||||
'created_at': datetime.now(timezone.utc),
|
||||
'updated_at': datetime.now(timezone.utc),
|
||||
|
||||
Reference in New Issue
Block a user