BEGIN; INSERT INTO mv_loss_intelligence.deployment_config ( tenant, site, scope_code, scope_name, mode, planned_go_live_date, actual_go_live_at, timezone, review_owner_primary, review_owner_secondary, review_cadence, daily_review_limit, notes ) VALUES ( 'ucepsa', 'ucepsa_onpremise', 'CUTTERS', 'Cortadoras UCEPSA', 'SHADOW', DATE '2026-10-01', NULL, 'Europe/Madrid', 'Jefe de producción', 'Gerencia / dirección', 'DAILY', 5, 'Infraestructura preparada entre julio y septiembre. El Ledger oficial se activará en kickoff; octubre es una previsión, no una activación automática.' ) ON CONFLICT (tenant, site, scope_code) DO UPDATE SET scope_name = EXCLUDED.scope_name, mode = 'SHADOW', planned_go_live_date = EXCLUDED.planned_go_live_date, timezone = EXCLUDED.timezone, review_owner_primary = EXCLUDED.review_owner_primary, review_owner_secondary = EXCLUDED.review_owner_secondary, review_cadence = EXCLUDED.review_cadence, daily_review_limit = EXCLUDED.daily_review_limit, notes = EXCLUDED.notes, updated_at = now(); INSERT INTO mv_loss_intelligence.loss_policies ( tenant, site, policy_code, source_type, noise_below_s, aggregate_below_s, operator_individual_from_s, aggregation_window_min, require_valid_order, require_closed_event, exclude_planned_by_default, is_active, notes ) VALUES ( 'ucepsa', 'ucepsa_onpremise', 'CUTTER_STOPS_V1', 'MACHINE_STOP', 5, 300, 300, 15, true, true, true, true, 'Política inicial de modo sombra. <5 s se conserva solo en raw; 5 s–5 min se agrupa; >=5 min se trata individualmente. Validar con producción antes del kickoff.' ) ON CONFLICT (tenant, site, policy_code) DO UPDATE SET noise_below_s = EXCLUDED.noise_below_s, aggregate_below_s = EXCLUDED.aggregate_below_s, operator_individual_from_s = EXCLUDED.operator_individual_from_s, aggregation_window_min = EXCLUDED.aggregation_window_min, require_valid_order = EXCLUDED.require_valid_order, require_closed_event = EXCLUDED.require_closed_event, exclude_planned_by_default = EXCLUDED.exclude_planned_by_default, is_active = true, notes = EXCLUDED.notes, updated_at = now(); INSERT INTO mv_loss_intelligence.economic_parameters ( tenant, site, scope_code, machine_id, product_id, parameter_code, parameter_value, unit, confidence, includes_energy, valid_from, is_active, source_ref, approved_by, notes ) SELECT 'ucepsa', 'ucepsa_onpremise', 'CUTTERS', NULL, NULL, 'CAPACITY_HOUR_EUR', 36.000000, 'EUR/h', 'LOW', NULL, TIMESTAMPTZ '2026-06-18 00:00:00+02', true, 'Valor demostrativo usado en Edge-OEE', NULL, 'Pendiente de validación por gerencia. No se ha confirmado si incorpora energía.' WHERE NOT EXISTS ( SELECT 1 FROM mv_loss_intelligence.economic_parameters WHERE tenant = 'ucepsa' AND site = 'ucepsa_onpremise' AND parameter_code = 'CAPACITY_HOUR_EUR' AND is_active = true ); INSERT INTO mv_loss_intelligence.economic_parameters ( tenant, site, scope_code, machine_id, product_id, parameter_code, parameter_value, unit, confidence, includes_energy, valid_from, is_active, source_ref, approved_by, notes ) SELECT 'ucepsa', 'ucepsa_onpremise', 'CUTTERS', NULL, NULL, 'ENERGY_VARIABLE_EUR_KWH', 0.128249, 'EUR/kWh', 'MEDIUM', false, TIMESTAMPTZ '2026-06-10 00:00:00+02', true, 'Factura UCEPSA 6.1TD 10/06/2026–30/06/2026', NULL, 'Media ponderada de energía, red variable e impuesto eléctrico. No incluye reparto automático del término fijo de potencia.' WHERE NOT EXISTS ( SELECT 1 FROM mv_loss_intelligence.economic_parameters WHERE tenant = 'ucepsa' AND site = 'ucepsa_onpremise' AND parameter_code = 'ENERGY_VARIABLE_EUR_KWH' AND is_active = true ); INSERT INTO mv_edge_oee_ucepsa_prod.margin_cost_parameters ( tenant, site, scope_level, machine_id, product_default_code, energy_cost_eur_per_kwh, material_cost_eur_per_kg, machine_run_cost_eur_per_h, labor_cost_eur_per_h, overhead_cost_eur_per_h, valid_from, valid_to, is_active, notes, created_at ) SELECT 'ucepsa', 'ucepsa_onpremise', 'GLOBAL', NULL, NULL, 0.128249, NULL, 36.0000, NULL, NULL, TIMESTAMPTZ '2026-06-10 00:00:00+02', NULL, true, 'Parámetros provisionales para Cost Readiness: 36 €/h y 0,128249 €/kWh. Mantener costes separados hasta confirmar si el coste/hora incluye energía.', now() WHERE NOT EXISTS ( SELECT 1 FROM mv_edge_oee_ucepsa_prod.margin_cost_parameters WHERE tenant = 'ucepsa' AND site = 'ucepsa_onpremise' AND scope_level = 'GLOBAL' AND is_active = true ); INSERT INTO mv_loss_intelligence.action_catalog ( action_id, catalog_code, catalog_version, tenant, site, loss_type, source_cause_code, action_type, action_candidate, applies_when, does_not_apply_when, suggested_owner, test_window, metric_before, metric_after, success_criteria, risk_level, cost_to_test, source_ref, notes ) VALUES ( 'CUTTER-BOBBIN-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'cambio_bobina', 'METHOD', 'Preparar la siguiente bobina y sus elementos auxiliares antes de que termine la bobina en curso.', '["Paros repetidos por cambio de bobina", "Orden y referencia conocidas"]'::jsonb, '["Cambio imprevisto por defecto de material", "Falta de espacio seguro para staging"]'::jsonb, 'Producción', '10 cambios de bobina comparables', 'Minutos de cambio de bobina por evento', 'Minutos de cambio de bobina por evento', 'Reducción >= 20% sin aumentar defectos ni incidencias de seguridad', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', 'La acción final debe adaptarse al espacio y método real de UCEPSA.' ), ( 'CUTTER-SPLICE-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'fallo_empalme', 'METHOD', 'Separar el fallo de empalme por tipo de defecto y probar un estándar único de preparación durante 10 órdenes.', '["Fallo de empalme repetido", "La causa puede observarse y clasificarse"]'::jsonb, '["Avería mecánica ajena al empalme"]'::jsonb, 'Producción / métodos', '10 órdenes o 20 empalmes', 'Eventos y minutos perdidos por empalme', 'Eventos y minutos perdidos por empalme', 'Reducción >= 25% de minutos perdidos', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-SEAL-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'ajuste_sellado', 'METHOD', 'Crear y probar una ficha de parámetros de sellado por familia de referencia antes del arranque.', '["Ajustes repetidos de mordazas, temperatura, presión o teflón", "Referencias repetitivas"]'::jsonb, '["Avería mecánica", "Materia prima fuera de especificación no confirmada"]'::jsonb, 'Producción / calidad', '10 órdenes de la misma familia', 'Minutos de ajuste de sellado por orden', 'Minutos de ajuste de sellado por orden', 'Reducción >= 25% manteniendo calidad', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-MATERIAL-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'falta_material', 'ORGANIZATIONAL', 'No iniciar la orden hasta que bobina y material auxiliar estén físicamente preparados junto a la cortadora.', '["Espera de material con orden cargada", "Material identificable antes del arranque"]'::jsonb, '["Rotura o rechazo de material durante producción"]'::jsonb, 'Producción / logística', '10 órdenes comparables', 'Minutos de espera de material por orden', 'Minutos de espera de material por orden', 'Reducción >= 50% de la espera de material', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-PHOTO-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'limpieza_fotocelula', 'TECHNICAL', 'Aplicar una comprobación y limpieza breve de fotocélula antes del turno en las referencias con recurrencia.', '["Limpieza de fotocélula repetida", "Patrón concentrado en máquina o producto"]'::jsonb, '["Fallo eléctrico o sustitución necesaria del sensor"]'::jsonb, 'Producción / mantenimiento', '2 semanas', 'Eventos y minutos por limpieza de fotocélula', 'Eventos y minutos por limpieza de fotocélula', 'Reducción >= 30% de eventos sin aumentar tiempo de arranque', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-FORMAT-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'cambio_formato', 'METHOD', 'Separar preparación externa e interna del cambio de formato y preparar fuera de máquina todo lo posible.', '["Cambios de formato repetidos", "Se pueden comparar referencias o familias similares"]'::jsonb, '["Cambio excepcional no repetible"]'::jsonb, 'Producción / métodos', '10 cambios comparables', 'Minutos de cambio de formato', 'Minutos de cambio de formato', 'Reducción >= 20% del tiempo mediano', 'LOW', 'MEDIUM', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-MECH-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'averia_mecanica', 'TECHNICAL', 'Seleccionar la avería mecánica repetida con mayor coste, intervenir sobre el componente y comprobar recurrencia.', '["Misma avería o síntoma repetido", "Existe responsable de mantenimiento"]'::jsonb, '["Evento único sin diagnóstico", "Paro no confirmado como avería"]'::jsonb, 'Mantenimiento', '30 días o siguiente ciclo de recurrencia', 'Eventos, minutos y coste de la avería seleccionada', 'Eventos, minutos y coste tras la intervención', 'Cero recurrencias o reducción >= 50% del tiempo perdido', 'MEDIUM', 'MEDIUM', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-INSTR-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'espera_instrucciones', 'ORGANIZATIONAL', 'Definir antes del turno qué órdenes, referencias y decisiones requieren autorización para evitar esperas con máquina ocupada.', '["Espera de instrucciones repetida", "Decisión previsible antes del arranque"]'::jsonb, '["Incidencia de seguridad o calidad que exige autorización específica"]'::jsonb, 'Jefe de producción', '2 semanas', 'Minutos de espera de instrucciones por orden', 'Minutos de espera de instrucciones por orden', 'Reducción >= 50% de la espera', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', NULL ), ( 'CUTTER-OTHER-001', 'LI-CUTTER-STOPS', '0.1', 'ucepsa', 'ucepsa_onpremise', 'MACHINE_STOP', 'otro', 'DATA_QUALITY', 'Revisar semanalmente los paros clasificados como Otro y crear una causa nueva si un patrón se repite.', '["Uso de Otro superior al 10% de minutos o eventos"]'::jsonb, '["Evento aislado sin patrón"]'::jsonb, 'Producción / MESAVAULT', '4 semanas', 'Porcentaje de eventos y minutos en Otro', 'Porcentaje de eventos y minutos en Otro', 'Otro < 10% de eventos y minutos', 'LOW', 'LOW', 'MESAVAULT Action Catalog Cutter v0.1', 'Es una acción de calidad de dato, no una mejora de proceso por sí misma.' ) ON CONFLICT (action_id) DO UPDATE SET catalog_code = EXCLUDED.catalog_code, catalog_version = EXCLUDED.catalog_version, loss_type = EXCLUDED.loss_type, source_cause_code = EXCLUDED.source_cause_code, action_type = EXCLUDED.action_type, action_candidate = EXCLUDED.action_candidate, applies_when = EXCLUDED.applies_when, does_not_apply_when = EXCLUDED.does_not_apply_when, suggested_owner = EXCLUDED.suggested_owner, test_window = EXCLUDED.test_window, metric_before = EXCLUDED.metric_before, metric_after = EXCLUDED.metric_after, success_criteria = EXCLUDED.success_criteria, risk_level = EXCLUDED.risk_level, cost_to_test = EXCLUDED.cost_to_test, source_ref = EXCLUDED.source_ref, notes = EXCLUDED.notes, is_active = true, updated_at = now(); COMMIT;