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;
