New alert system and panel de control page

This commit is contained in:
Urtzi Alfaro
2025-11-27 15:52:40 +01:00
parent 1a2f4602f3
commit e902419b6e
178 changed files with 20982 additions and 6944 deletions

View File

@@ -46,6 +46,7 @@
"last_run": "Última ejecución",
"what_ai_did": "Lo que hizo la IA por ti"
},
"no_reasoning_available": "No hay razonamiento disponible",
"metrics": {
"hours": "{count, plural, =1 {# hora} other {# horas}}",
"minutes": "{count, plural, =1 {# minuto} other {# minutos}}",
@@ -140,7 +141,7 @@
"affected_systems": "Sistemas Afectados",
"reversible": "Esta acción se puede deshacer",
"not_reversible": "Esta acción no se puede deshacer",
"confidence": "Confianza de IA: {{confidence}}%",
"confidence": "Confianza de IA: {confidence}%",
"cancel": "Cancelar",
"confirm": "Confirmar Acción"
},
@@ -161,137 +162,137 @@
},
"alerts": {
"critical_stock_shortage": {
"title": "🚨 Stock Crítico: {{ingredient_name}}",
"message_with_po_pending": "Solo {{current_stock}}kg de {{ingredient_name}} (necesitas {{required_stock}}kg). Ya creé {{po_id}} para entrega el {{delivery_day_name}}. Por favor aprueba €{{po_amount}}.",
"message_with_po_created": "Solo {{current_stock}}kg de {{ingredient_name}} (necesitas {{required_stock}}kg). Ya creé {{po_id}}. Revisa y aprueba €{{po_amount}}.",
"message_with_hours": "Solo {{current_stock}}kg de {{ingredient_name}} disponibles (necesitas {{required_stock}}kg en {{hours_until}} horas).",
"message_with_date": "Solo {{current_stock}}kg de {{ingredient_name}} disponibles (necesitas {{required_stock}}kg para producción del {{production_day_name}}).",
"message_generic": "Solo {{current_stock}}kg de {{ingredient_name}} disponibles (necesitas {{required_stock}}kg)."
"title": "🚨 Stock Crítico: {ingredient_name}",
"message_with_po_pending": "Solo {current_stock}kg de {ingredient_name} (necesitas {required_stock}kg). Ya creé {po_id} para entrega el {delivery_day_name}. Por favor aprueba €{po_amount}.",
"message_with_po_created": "Solo {current_stock}kg de {ingredient_name} (necesitas {required_stock}kg). Ya creé {po_id}. Revisa y aprueba €{po_amount}.",
"message_with_hours": "Solo {current_stock}kg de {ingredient_name} disponibles (necesitas {required_stock}kg en {hours_until} horas).",
"message_with_date": "Solo {current_stock}kg de {ingredient_name} disponibles (necesitas {required_stock}kg para producción del {production_day_name}).",
"message_generic": "Solo {current_stock}kg de {ingredient_name} disponibles (necesitas {required_stock}kg)."
},
"low_stock": {
"title": "⚠️ Stock Bajo: {{ingredient_name}}",
"message_with_po": "Stock de {{ingredient_name}}: {{current_stock}}kg (mínimo: {{minimum_stock}}kg). Ya programé PO para reposición.",
"message_generic": "Stock de {{ingredient_name}}: {{current_stock}}kg (mínimo: {{minimum_stock}}kg). Considera hacer un pedido."
"title": "⚠️ Stock Bajo: {ingredient_name}",
"message_with_po": "Stock de {ingredient_name}: {current_stock}kg (mínimo: {minimum_stock}kg). Ya programé PO para reposición.",
"message_generic": "Stock de {ingredient_name}: {current_stock}kg (mínimo: {minimum_stock}kg). Considera hacer un pedido."
},
"stock_depleted": {
"title": "📦 Stock Agotado por Pedido",
"message_with_supplier": "Pedido #{{order_id}} requiere {{ingredient_name}} pero está agotado. Contacta a {{supplier_name}} ({{supplier_phone}}).",
"message_generic": "Pedido #{{order_id}} requiere {{ingredient_name}} pero está agotado. Acción inmediata requerida."
"message_with_supplier": "Pedido #{order_id} requiere {ingredient_name} pero está agotado. Contacta a {supplier_name} ({supplier_phone}).",
"message_generic": "Pedido #{order_id} requiere {ingredient_name} pero está agotado. Acción inmediata requerida."
},
"ingredient_shortage": {
"title": "⚠️ Falta de Ingrediente en Producción",
"message_with_customers": "{{ingredient_name}} insuficiente para lotes en curso. {{affected_orders}} pedidos afectados ({{customer_names}}). Stock actual: {{current_stock}}kg, necesario: {{required_stock}}kg.",
"message_generic": "{{ingredient_name}} insuficiente para lotes en curso. Stock actual: {{current_stock}}kg, necesario: {{required_stock}}kg."
"message_with_customers": "{ingredient_name} insuficiente para lotes en curso. {affected_orders} pedidos afectados ({customer_names}). Stock actual: {current_stock}kg, necesario: {required_stock}kg.",
"message_generic": "{ingredient_name} insuficiente para lotes en curso. Stock actual: {current_stock}kg, necesario: {required_stock}kg."
},
"expired_products": {
"title": "🚫 Productos Caducados o por Caducar",
"message_with_names": "{{count}} productos caducando: {{product_names}}. Valor total: €{{total_value}}.",
"message_generic": "{{count}} productos caducando. Valor total: €{{total_value}}."
"message_with_names": "{count} productos caducando: {product_names}. Valor total: €{total_value}.",
"message_generic": "{count} productos caducando. Valor total: €{total_value}."
},
"production_delay": {
"title": "⏰ Retraso en Producción: {{batch_name}}",
"message_with_customers": "Lote {{batch_name}} retrasado {{delay_minutes}} minutos. Clientes afectados: {{customer_names}}. Hora entrega original: {{scheduled_time}}.",
"message_with_orders": "Lote {{batch_name}} retrasado {{delay_minutes}} minutos. {{affected_orders}} pedidos afectados. Hora entrega original: {{scheduled_time}}.",
"message_generic": "Lote {{batch_name}} retrasado {{delay_minutes}} minutos. Hora entrega original: {{scheduled_time}}."
"title": "⏰ Retraso en Producción: {batch_name}",
"message_with_customers": "Lote {batch_name} retrasado {delay_minutes} minutos. Clientes afectados: {customer_names}. Hora entrega original: {scheduled_time}.",
"message_with_orders": "Lote {batch_name} retrasado {delay_minutes} minutos. {affected_orders} pedidos afectados. Hora entrega original: {scheduled_time}.",
"message_generic": "Lote {batch_name} retrasado {delay_minutes} minutos. Hora entrega original: {scheduled_time}."
},
"equipment_failure": {
"title": "🔧 Fallo de Equipo: {{equipment_name}}",
"message_with_batches": "{{equipment_name}} falló. {{affected_batches}} lotes en producción afectados ({{batch_names}}).",
"message_generic": "{{equipment_name}} falló. Requiere reparación inmediata."
"title": "🔧 Fallo de Equipo: {equipment_name}",
"message_with_batches": "{equipment_name} falló. {affected_batches} lotes en producción afectados ({batch_names}).",
"message_generic": "{equipment_name} falló. Requiere reparación inmediata."
},
"maintenance_required": {
"title": "🔧 Mantenimiento Requerido: {{equipment_name}}",
"message_with_hours": "{{equipment_name}} requiere mantenimiento en {{hours_until}} horas. Programa ahora para evitar interrupciones.",
"message_with_days": "{{equipment_name}} requiere mantenimiento en {{days_until}} días. Programa antes del {{maintenance_date}}."
"title": "🔧 Mantenimiento Requerido: {equipment_name}",
"message_with_hours": "{equipment_name} requiere mantenimiento en {hours_until} horas. Programa ahora para evitar interrupciones.",
"message_with_days": "{equipment_name} requiere mantenimiento en {days_until} días. Programa antes del {maintenance_date}."
},
"low_equipment_efficiency": {
"title": "📉 Baja Eficiencia: {{equipment_name}}",
"message": "{{equipment_name}} operando a {{efficiency_percent}}% eficiencia (esperado: >{{threshold_percent}}%). Considera mantenimiento."
"title": "📉 Baja Eficiencia: {equipment_name}",
"message": "{equipment_name} operando a {efficiency_percent}% eficiencia (esperado: >{threshold_percent}%). Considera mantenimiento."
},
"order_overload": {
"title": "📊 Sobrecarga de Pedidos",
"message_with_orders": "Capacidad sobrecargada en {{overload_percent}}%. {{total_orders}} pedidos programados, capacidad: {{capacity_orders}}. Considera ajustar el calendario.",
"message_generic": "Capacidad sobrecargada en {{overload_percent}}%. Considera ajustar el calendario de producción."
"message_with_orders": "Capacidad sobrecargada en {overload_percent}%. {total_orders} pedidos programados, capacidad: {capacity_orders}. Considera ajustar el calendario.",
"message_generic": "Capacidad sobrecargada en {overload_percent}%. Considera ajustar el calendario de producción."
},
"supplier_delay": {
"title": "🚚 Retraso de Proveedor: {{supplier_name}}",
"message": "{{supplier_name}} retrasó entrega de {{ingredient_name}} (PO: {{po_id}}). Nueva fecha: {{new_delivery_date}}. Original: {{original_delivery_date}}."
"title": "🚚 Retraso de Proveedor: {supplier_name}",
"message": "{supplier_name} retrasó entrega de {ingredient_name} (PO: {po_id}). Nueva fecha: {new_delivery_date}. Original: {original_delivery_date}."
},
"temperature_breach": {
"title": "🌡️ Violación de Temperatura",
"message": "Temperatura {{location}}: {{current_temp}}°C (rango: {{min_temp}}°C-{{max_temp}}°C). Duración: {{duration_minutes}} minutos."
"message": "Temperatura {location}: {current_temp}°C (rango: {min_temp}°C-{max_temp}°C). Duración: {duration_minutes} minutos."
},
"demand_surge_weekend": {
"title": "📈 Aumento de Demanda: Fin de Semana",
"message": "Demanda esperada {{surge_percent}}% mayor para {{weekend_date}}. Productos afectados: {{products}}. Considera aumentar producción."
"message": "Demanda esperada {surge_percent}% mayor para {weekend_date}. Productos afectados: {products}. Considera aumentar producción."
},
"weather_impact_alert": {
"title": "🌦️ Impacto Climático Esperado",
"message": "{{weather_condition}} esperado {{date}}. Impacto en demanda: {{impact_percent}}%. Productos afectados: {{products}}."
"message": "{weather_condition} esperado {date}. Impacto en demanda: {impact_percent}%. Productos afectados: {products}."
},
"holiday_preparation": {
"title": "🎉 Preparación para Festivo: {{holiday_name}}",
"message": "{{holiday_name}} en {{days_until}} días ({{holiday_date}}). Demanda esperada {{expected_increase}}% mayor. Productos clave: {{products}}."
"title": "🎉 Preparación para Festivo: {holiday_name}",
"message": "{holiday_name} en {days_until} días ({holiday_date}). Demanda esperada {expected_increase}% mayor. Productos clave: {products}."
},
"severe_weather_impact": {
"title": "⛈️ Impacto Climático Severo",
"message": "{{weather_condition}} severo esperado {{date}}. Impacto en demanda: {{impact_percent}}%. Considera ajustar horarios de entrega."
"message": "{weather_condition} severo esperado {date}. Impacto en demanda: {impact_percent}%. Considera ajustar horarios de entrega."
},
"unexpected_demand_spike": {
"title": "📊 Pico de Demanda Inesperado",
"message": "Demanda aumentó {{spike_percent}}% para {{products}}. Stock actual podría agotarse en {{hours_until_stockout}} horas."
"message": "Demanda aumentó {spike_percent}% para {products}. Stock actual podría agotarse en {hours_until_stockout} horas."
},
"demand_pattern_optimization": {
"title": "💡 Optimización de Patrón de Demanda",
"message": "Patrón detectado: {{pattern_description}}. Recomienda ajustar producción de {{products}} para optimizar eficiencia."
"message": "Patrón detectado: {pattern_description}. Recomienda ajustar producción de {products} para optimizar eficiencia."
},
"inventory_optimization": {
"title": "📦 Optimización de Inventario",
"message": "{{ingredient_name}} consistentemente sobre-stock por {{excess_percent}}%. Recomienda reducir pedido a {{recommended_amount}}kg."
"message": "{ingredient_name} consistentemente sobre-stock por {excess_percent}%. Recomienda reducir pedido a {recommended_amount}kg."
},
"production_efficiency": {
"title": "⚡ Oportunidad de Eficiencia en Producción",
"message": "{{product_name}} más eficiente a las {{suggested_time}}. Tiempo de producción {{time_saved}} minutos menor ({{savings_percent}}% ahorro)."
"message": "{product_name} más eficiente a las {suggested_time}. Tiempo de producción {time_saved} minutos menor ({savings_percent}% ahorro)."
},
"sales_opportunity": {
"title": "💰 Oportunidad de Ventas",
"message": "Alta demanda de {{products}} detectada. Considera producción adicional. Ingresos potenciales: €{{potential_revenue}}."
"message": "Alta demanda de {products} detectada. Considera producción adicional. Ingresos potenciales: €{potential_revenue}."
},
"seasonal_adjustment": {
"title": "🍂 Ajuste Estacional Recomendado",
"message": "Temporada {{season}} acercándose. Ajusta producción de {{products}} basado en tendencias históricas ({{adjustment_percent}}% {{adjustment_direction}})."
"message": "Temporada {season} acercándose. Ajusta producción de {products} basado en tendencias históricas ({adjustment_percent}% {adjustment_direction})."
},
"cost_reduction": {
"title": "💵 Oportunidad de Reducción de Costos",
"message": "Cambiando a {{alternative_ingredient}} puede ahorrar €{{savings_amount}}/mes. Calidad similar, menor costo."
"message": "Cambiando a {alternative_ingredient} puede ahorrar €{savings_amount}/mes. Calidad similar, menor costo."
},
"waste_reduction": {
"title": "♻️ Oportunidad de Reducción de Desperdicio",
"message": "{{product_name}} desperdicio alto ({{waste_percent}}%). Recomienda reducir lote a {{recommended_quantity}} unidades."
"message": "{product_name} desperdicio alto ({waste_percent}%). Recomienda reducir lote a {recommended_quantity} unidades."
},
"quality_improvement": {
"title": "⭐ Mejora de Calidad Recomendada",
"message": "{{issue_description}} detectado en {{product_name}}. Acción recomendada: {{recommended_action}}."
"message": "{issue_description} detectado en {product_name}. Acción recomendada: {recommended_action}."
},
"customer_satisfaction": {
"title": "😊 Oportunidad de Satisfacción del Cliente",
"message": "Cliente {{customer_name}} consistentemente ordena {{product_name}}. Considera oferta especial o programa de lealtad."
"message": "Cliente {customer_name} consistentemente ordena {product_name}. Considera oferta especial o programa de lealtad."
},
"energy_optimization": {
"title": "⚡ Optimización de Energía",
"message": "Uso de energía para {{equipment_name}} pico a las {{peak_time}}. Cambiando a {{off_peak_start}}-{{off_peak_end}} puede ahorrar €{{savings_amount}}/mes."
"message": "Uso de energía para {equipment_name} pico a las {peak_time}. Cambiando a {off_peak_start}-{off_peak_end} puede ahorrar €{savings_amount}/mes."
},
"staff_optimization": {
"title": "👥 Optimización de Personal",
"message": "{{shift_name}} sobrestimado por {{excess_percent}}%. Considera ajustar niveles de personal para reducir costos laborales."
"message": "{shift_name} sobrestimado por {excess_percent}%. Considera ajustar niveles de personal para reducir costos laborales."
},
"po_approval_needed": {
"title": "Orden de Compra #{{po_number}} requiere aprobación",
"message": "Orden de compra para {{supplier_name}} por un total de {{currency}} {{total_amount}} pendiente de aprobación. Entrega requerida para {{required_delivery_date}}."
"title": "Orden de Compra #{po_number} requiere aprobación",
"message": "Orden de compra para {supplier_name} por un total de {currency} {total_amount} pendiente de aprobación. Entrega requerida para {required_delivery_date}."
},
"production_batch_start": {
"title": "Lote de Producción Listo: {{product_name}}",
"message": "Lote #{{batch_number}} ({{quantity_planned}} {{unit}} de {{product_name}}) está listo para comenzar. Prioridad: {{priority}}."
"title": "Lote de Producción Listo: {product_name}",
"message": "Lote #{batch_number} ({quantity_planned} {unit} de {product_name}) está listo para comenzar. Prioridad: {priority}."
}
}
}