557 lines
18 KiB
Python
557 lines
18 KiB
Python
|
|
"""
|
||
|
|
Alert type definitions with i18n key mappings.
|
||
|
|
|
||
|
|
Each alert type maps to:
|
||
|
|
- title_key: i18n key for title (e.g., "alerts.critical_stock_shortage.title")
|
||
|
|
- title_params: parameter mappings from metadata to i18n params
|
||
|
|
- message_variants: different message keys based on context
|
||
|
|
- message_params: parameter mappings for message
|
||
|
|
|
||
|
|
When adding new alert types:
|
||
|
|
1. Add entry to ALERT_TEMPLATES
|
||
|
|
2. Ensure corresponding translations exist in frontend/src/locales/*/alerts.json
|
||
|
|
3. Document required metadata fields
|
||
|
|
"""
|
||
|
|
|
||
|
|
# Alert type templates
|
||
|
|
ALERT_TEMPLATES = {
|
||
|
|
# ==================== INVENTORY ALERTS ====================
|
||
|
|
|
||
|
|
"critical_stock_shortage": {
|
||
|
|
"title_key": "alerts.critical_stock_shortage.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_po_pending": "alerts.critical_stock_shortage.message_with_po_pending",
|
||
|
|
"with_po_created": "alerts.critical_stock_shortage.message_with_po_created",
|
||
|
|
"with_hours": "alerts.critical_stock_shortage.message_with_hours",
|
||
|
|
"with_date": "alerts.critical_stock_shortage.message_with_date",
|
||
|
|
"generic": "alerts.critical_stock_shortage.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"current_stock_kg": "current_stock",
|
||
|
|
"required_stock_kg": "required_stock",
|
||
|
|
"hours_until": "hours_until",
|
||
|
|
"production_day_name": "production_date",
|
||
|
|
"po_id": "po_id",
|
||
|
|
"po_amount": "po_amount",
|
||
|
|
"delivery_day_name": "delivery_date"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"low_stock_warning": {
|
||
|
|
"title_key": "alerts.low_stock.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_po": "alerts.low_stock.message_with_po",
|
||
|
|
"generic": "alerts.low_stock.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"current_stock_kg": "current_stock",
|
||
|
|
"minimum_stock_kg": "minimum_stock"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"overstock_warning": {
|
||
|
|
"title_key": "alerts.overstock_warning.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.overstock_warning.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"current_stock_kg": "current_stock",
|
||
|
|
"maximum_stock_kg": "maximum_stock",
|
||
|
|
"excess_amount_kg": "excess_amount"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"expired_products": {
|
||
|
|
"title_key": "alerts.expired_products.title",
|
||
|
|
"title_params": {
|
||
|
|
"count": "expired_count"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_names": "alerts.expired_products.message_with_names",
|
||
|
|
"generic": "alerts.expired_products.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"expired_count": "expired_count",
|
||
|
|
"product_names": "product_names",
|
||
|
|
"total_value_eur": "total_value"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"urgent_expiry": {
|
||
|
|
"title_key": "alerts.urgent_expiry.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.urgent_expiry.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"days_until_expiry": "days_until_expiry",
|
||
|
|
"quantity_kg": "quantity"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"temperature_breach": {
|
||
|
|
"title_key": "alerts.temperature_breach.title",
|
||
|
|
"title_params": {
|
||
|
|
"location": "location"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.temperature_breach.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"location": "location",
|
||
|
|
"temperature": "temperature",
|
||
|
|
"max_threshold": "max_threshold",
|
||
|
|
"duration_minutes": "duration_minutes"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"stock_depleted_by_order": {
|
||
|
|
"title_key": "alerts.stock_depleted_by_order.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_supplier": "alerts.stock_depleted_by_order.message_with_supplier",
|
||
|
|
"generic": "alerts.stock_depleted_by_order.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"shortage_kg": "shortage_amount",
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"supplier_contact": "supplier_contact"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== PRODUCTION ALERTS ====================
|
||
|
|
|
||
|
|
"production_delay": {
|
||
|
|
"title_key": "alerts.production_delay.title",
|
||
|
|
"title_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"batch_number": "batch_number"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_customers": "alerts.production_delay.message_with_customers",
|
||
|
|
"with_orders": "alerts.production_delay.message_with_orders",
|
||
|
|
"generic": "alerts.production_delay.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"batch_number": "batch_number",
|
||
|
|
"delay_minutes": "delay_minutes",
|
||
|
|
"affected_orders": "affected_orders",
|
||
|
|
"customer_names": "customer_names"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"equipment_failure": {
|
||
|
|
"title_key": "alerts.equipment_failure.title",
|
||
|
|
"title_params": {
|
||
|
|
"equipment_name": "equipment_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_batches": "alerts.equipment_failure.message_with_batches",
|
||
|
|
"generic": "alerts.equipment_failure.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"equipment_name": "equipment_name",
|
||
|
|
"equipment_type": "equipment_type",
|
||
|
|
"affected_batches": "affected_batches"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"maintenance_required": {
|
||
|
|
"title_key": "alerts.maintenance_required.title",
|
||
|
|
"title_params": {
|
||
|
|
"equipment_name": "equipment_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"with_hours": "alerts.maintenance_required.message_with_hours",
|
||
|
|
"with_days": "alerts.maintenance_required.message_with_days",
|
||
|
|
"generic": "alerts.maintenance_required.message_generic"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"equipment_name": "equipment_name",
|
||
|
|
"hours_overdue": "hours_overdue",
|
||
|
|
"days_overdue": "days_overdue"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"low_equipment_efficiency": {
|
||
|
|
"title_key": "alerts.low_equipment_efficiency.title",
|
||
|
|
"title_params": {
|
||
|
|
"equipment_name": "equipment_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.low_equipment_efficiency.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"equipment_name": "equipment_name",
|
||
|
|
"efficiency_percentage": "efficiency_percentage",
|
||
|
|
"target_efficiency": "target_efficiency"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"capacity_overload": {
|
||
|
|
"title_key": "alerts.capacity_overload.title",
|
||
|
|
"title_params": {
|
||
|
|
"date": "planned_date"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.capacity_overload.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"planned_date": "planned_date",
|
||
|
|
"capacity_percentage": "capacity_percentage",
|
||
|
|
"equipment_count": "equipment_count"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"quality_control_failure": {
|
||
|
|
"title_key": "alerts.quality_control_failure.title",
|
||
|
|
"title_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"batch_number": "batch_number"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.quality_control_failure.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"batch_number": "batch_number",
|
||
|
|
"check_type": "check_type",
|
||
|
|
"quality_score": "quality_score",
|
||
|
|
"defect_count": "defect_count"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== PROCUREMENT ALERTS ====================
|
||
|
|
|
||
|
|
"po_approval_needed": {
|
||
|
|
"title_key": "alerts.po_approval_needed.title",
|
||
|
|
"title_params": {
|
||
|
|
"po_number": "po_number"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.po_approval_needed.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"total_amount": "total_amount",
|
||
|
|
"currency": "currency",
|
||
|
|
"required_delivery_date": "required_delivery_date",
|
||
|
|
"items_count": "items_count"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"po_approval_escalation": {
|
||
|
|
"title_key": "alerts.po_approval_escalation.title",
|
||
|
|
"title_params": {
|
||
|
|
"po_number": "po_number"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.po_approval_escalation.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"po_number": "po_number",
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"hours_pending": "hours_pending",
|
||
|
|
"total_amount": "total_amount"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"delivery_overdue": {
|
||
|
|
"title_key": "alerts.delivery_overdue.title",
|
||
|
|
"title_params": {
|
||
|
|
"po_number": "po_number"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.delivery_overdue.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"po_number": "po_number",
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"days_overdue": "days_overdue",
|
||
|
|
"expected_date": "expected_date"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== SUPPLY CHAIN ALERTS ====================
|
||
|
|
|
||
|
|
"supplier_delay": {
|
||
|
|
"title_key": "alerts.supplier_delay.title",
|
||
|
|
"title_params": {
|
||
|
|
"supplier_name": "supplier_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.supplier_delay.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"po_count": "po_count",
|
||
|
|
"avg_delay_days": "avg_delay_days"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== DEMAND ALERTS ====================
|
||
|
|
|
||
|
|
"demand_surge_weekend": {
|
||
|
|
"title_key": "alerts.demand_surge_weekend.title",
|
||
|
|
"title_params": {},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.demand_surge_weekend.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"predicted_demand": "predicted_demand",
|
||
|
|
"current_stock": "current_stock"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"weather_impact_alert": {
|
||
|
|
"title_key": "alerts.weather_impact_alert.title",
|
||
|
|
"title_params": {},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.weather_impact_alert.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"weather_condition": "weather_condition",
|
||
|
|
"impact_percentage": "impact_percentage",
|
||
|
|
"date": "date"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== PRODUCTION BATCH ALERTS ====================
|
||
|
|
|
||
|
|
"production_batch_start": {
|
||
|
|
"title_key": "alerts.production_batch_start.title",
|
||
|
|
"title_params": {
|
||
|
|
"product_name": "product_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.production_batch_start.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"batch_number": "batch_number",
|
||
|
|
"quantity_planned": "quantity_planned",
|
||
|
|
"unit": "unit",
|
||
|
|
"priority": "priority"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== GENERIC FALLBACK ====================
|
||
|
|
|
||
|
|
"generic": {
|
||
|
|
"title_key": "alerts.generic.title",
|
||
|
|
"title_params": {},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "alerts.generic.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"event_type": "event_type"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
# Notification templates (informational events)
|
||
|
|
NOTIFICATION_TEMPLATES = {
|
||
|
|
"po_approved": {
|
||
|
|
"title_key": "notifications.po_approved.title",
|
||
|
|
"title_params": {
|
||
|
|
"po_number": "po_number"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "notifications.po_approved.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"total_amount": "total_amount"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"batch_state_changed": {
|
||
|
|
"title_key": "notifications.batch_state_changed.title",
|
||
|
|
"title_params": {
|
||
|
|
"product_name": "product_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "notifications.batch_state_changed.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"batch_number": "batch_number",
|
||
|
|
"new_status": "new_status",
|
||
|
|
"quantity": "quantity",
|
||
|
|
"unit": "unit"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"stock_received": {
|
||
|
|
"title_key": "notifications.stock_received.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "notifications.stock_received.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"quantity_received": "quantity_received",
|
||
|
|
"unit": "unit",
|
||
|
|
"supplier_name": "supplier_name"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
# Recommendation templates (optimization suggestions)
|
||
|
|
RECOMMENDATION_TEMPLATES = {
|
||
|
|
"inventory_optimization": {
|
||
|
|
"title_key": "recommendations.inventory_optimization.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.inventory_optimization.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"current_max_kg": "current_max",
|
||
|
|
"suggested_max_kg": "suggested_max",
|
||
|
|
"recommendation_type": "recommendation_type"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"production_efficiency": {
|
||
|
|
"title_key": "recommendations.production_efficiency.title",
|
||
|
|
"title_params": {
|
||
|
|
"product_name": "product_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.production_efficiency.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"potential_time_saved_minutes": "time_saved",
|
||
|
|
"suggestion": "suggestion"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
# ==================== AI INSIGHTS RECOMMENDATIONS ====================
|
||
|
|
|
||
|
|
"ai_yield_prediction": {
|
||
|
|
"title_key": "recommendations.ai_yield_prediction.title",
|
||
|
|
"title_params": {
|
||
|
|
"recipe_name": "recipe_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.ai_yield_prediction.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"recipe_name": "recipe_name",
|
||
|
|
"predicted_yield_percent": "predicted_yield",
|
||
|
|
"confidence_percent": "confidence",
|
||
|
|
"recommendation": "recommendation"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"ai_safety_stock_optimization": {
|
||
|
|
"title_key": "recommendations.ai_safety_stock_optimization.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.ai_safety_stock_optimization.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"suggested_safety_stock_kg": "suggested_safety_stock",
|
||
|
|
"current_safety_stock_kg": "current_safety_stock",
|
||
|
|
"estimated_savings_eur": "estimated_savings",
|
||
|
|
"confidence_percent": "confidence"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"ai_supplier_recommendation": {
|
||
|
|
"title_key": "recommendations.ai_supplier_recommendation.title",
|
||
|
|
"title_params": {
|
||
|
|
"supplier_name": "supplier_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.ai_supplier_recommendation.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"supplier_name": "supplier_name",
|
||
|
|
"reliability_score": "reliability_score",
|
||
|
|
"recommendation": "recommendation",
|
||
|
|
"confidence_percent": "confidence"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"ai_price_forecast": {
|
||
|
|
"title_key": "recommendations.ai_price_forecast.title",
|
||
|
|
"title_params": {
|
||
|
|
"ingredient_name": "ingredient_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.ai_price_forecast.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"ingredient_name": "ingredient_name",
|
||
|
|
"predicted_price_eur": "predicted_price",
|
||
|
|
"current_price_eur": "current_price",
|
||
|
|
"price_trend": "price_trend",
|
||
|
|
"recommendation": "recommendation",
|
||
|
|
"confidence_percent": "confidence"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"ai_demand_forecast": {
|
||
|
|
"title_key": "recommendations.ai_demand_forecast.title",
|
||
|
|
"title_params": {
|
||
|
|
"product_name": "product_name"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.ai_demand_forecast.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"product_name": "product_name",
|
||
|
|
"predicted_demand": "predicted_demand",
|
||
|
|
"forecast_period": "forecast_period",
|
||
|
|
"confidence_percent": "confidence",
|
||
|
|
"recommendation": "recommendation"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
|
||
|
|
"ai_business_rule": {
|
||
|
|
"title_key": "recommendations.ai_business_rule.title",
|
||
|
|
"title_params": {
|
||
|
|
"rule_category": "rule_category"
|
||
|
|
},
|
||
|
|
"message_variants": {
|
||
|
|
"generic": "recommendations.ai_business_rule.message"
|
||
|
|
},
|
||
|
|
"message_params": {
|
||
|
|
"rule_category": "rule_category",
|
||
|
|
"rule_description": "rule_description",
|
||
|
|
"confidence_percent": "confidence",
|
||
|
|
"recommendation": "recommendation"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|