# FARO-SQL-003 · Seeds Empresa Demo

**Código:** FARO-SQL-003
**Nombre:** Seeds Empresa Demo FARO Connect
**Versión:** v1.0
**Estado:** Seed técnico MVP
**Prioridad:** P1 · Necesario para demo ejecutable
**Motor recomendado:** PostgreSQL 15+
**Formato:** SQL seed versionado
**Uso:** CTO · backend · data engineer · QA · demo técnico-comercial
**Depende de:**

* FARO-SQL-001 · Migraciones Base MVP
* FARO-SQL-002 · Multiempresa, Roles y RLS

**Conecta con:**

* FARO-DEMO-001 · Dataset Demo Integral
* FARO-CFG-001 · Reglas MVP YAML
* FARO-TEST-001 · Tests KPIs MVP
* FARO-TEST-002 · Tests Reglas MVP
* FARO-TPL-002 · Reporte Semanal Ejecutivo
* FARO-UI-001 · Bandeja de Tensiones

---

# 1. Objetivo

El objetivo de FARO-SQL-003 es poblar la base FARO Connect con una **empresa demo ficticia**, suficientemente realista para probar y mostrar el flujo MVP completo:

```text id="0d7sf3"
Empresa demo
→ sucursales
→ áreas
→ usuarios
→ roles
→ fuentes
→ productos
→ clientes
→ vendedores
→ ventas
→ stock
→ cobranza
→ KPIs
→ señales
→ reglas
→ tensiones
→ acciones
→ evidencia
→ FARO Score
→ reporte ejecutivo
```

Este seed no reemplaza el dataset demo integral de 6 meses. Ese será FARO-DEMO-001.
Este seed sirve para que un técnico pueda levantar la base y ver datos coherentes de inmediato.

---

# 2. Empresa demo

## 2.1 Nombre ficticio

**Empresa:** Empresa Demo Cuyo S.A.
**Rubro:** Comercialización de insumos para la construcción
**País:** Argentina
**Provincia:** Mendoza / San Juan
**Modelo:** venta mayorista/minorista con sucursales, depósito, vendedores, stock, cobranza y descuentos.

## 2.2 Caso narrativo

La empresa demo muestra una situación típica:

```text id="5duyfk"
Ventas suben
+ margen baja
+ descuentos suben
+ cobranza se estira
+ stock crítico en productos clave
+ acciones vencidas
= tensión ejecutiva: crecimiento no rentable
```

Este caso permite probar:

* ventas;
* margen;
* descuentos;
* stock crítico;
* stock inmovilizado;
* cobranza vencida;
* vendedor que erosiona margen;
* cliente con riesgo;
* acciones vencidas;
* FARO Score inicial.

---

# 3. Resultado esperado del seed

Después de correr FARO-SQL-003, la base debería tener:

| Componente           | Cantidad aproximada |
| -------------------- | ------------------: |
| Empresas demo        |                   1 |
| Sucursales           |                   3 |
| Áreas                |                   8 |
| Usuarios             |                   8 |
| Roles asignados      |                  8+ |
| Fuentes de datos     |                   6 |
| Productos            |                  10 |
| Clientes             |                   8 |
| Proveedores          |                   5 |
| Empleados/vendedores |                   6 |
| Ventas fact cargadas |                 20+ |
| Stock snapshots      |                 10+ |
| Cobranzas            |                 10+ |
| KPIs snapshots       |                  8+ |
| Señales              |                  8+ |
| Reglas demo          |                   5 |
| Tensiones            |                   5 |
| Acciones             |                   7 |
| Evidencias           |                   3 |
| Score snapshots      |                   2 |
| Reporte semanal      |                   1 |

---

# 4. Archivo recomendado

```text id="ergqxp"
migrations/
  V024__seed_demo_company.sql
```

O, si se separa fuera de migraciones productivas:

```text id="1yw0h9"
seeds/
  demo/
    001_seed_demo_company.sql
```

Recomendación conservadora: en producción real, mantener seeds demo fuera de migraciones productivas. En demo/local, sí pueden correr como migración.

---

# 5. Advertencias técnicas

1. Este seed usa UUIDs fijos para facilitar pruebas.
2. No debe ejecutarse en una base productiva real sin control.
3. Usa `ON CONFLICT DO NOTHING` cuando corresponde.
4. Asume que ya existen las tablas de FARO-SQL-001.
5. Asume que ya existen roles base de FARO-SQL-002.
6. Si no existen roles base, el script incluye fallback parcial.
7. Los datos son ficticios.
8. No usar nombres de empresas reales.
9. No usar datos reales de clientes sin autorización.
10. Este seed busca mostrar el flujo, no simular contabilidad perfecta.

---

# 6. IDs fijos principales

| Entidad                 | UUID                                   |
| ----------------------- | -------------------------------------- |
| Empresa Demo            | `10000000-0000-0000-0000-000000000001` |
| Sucursal Mendoza        | `11000000-0000-0000-0000-000000000001` |
| Sucursal San Juan       | `11000000-0000-0000-0000-000000000002` |
| Depósito Central        | `11000000-0000-0000-0000-000000000003` |
| Usuario Director        | `12000000-0000-0000-0000-000000000001` |
| Usuario Gerente General | `12000000-0000-0000-0000-000000000002` |
| Usuario Comercial       | `12000000-0000-0000-0000-000000000003` |
| Usuario Finanzas        | `12000000-0000-0000-0000-000000000004` |
| Usuario Stock           | `12000000-0000-0000-0000-000000000005` |

---

# 7. SQL completo · V024 Seed Empresa Demo

```sql id="faro_sql_003_seed"
-- ============================================================
-- FARO-SQL-003 · V024__seed_demo_company.sql
-- Seeds Empresa Demo FARO Connect
-- Version: v1.0
-- Engine: PostgreSQL 15+
-- ============================================================

BEGIN;

-- ============================================================
-- 0. CONTEXTO DEMO
-- ============================================================

SELECT set_config('app.company_id', '10000000-0000-0000-0000-000000000001', true);
SELECT set_config('app.user_id', '12000000-0000-0000-0000-000000000001', true);
SELECT set_config('app.role_codes', 'faro_owner,company_admin,director', true);

-- ============================================================
-- 1. EMPRESA DEMO
-- ============================================================

INSERT INTO faro.companies (
  company_id,
  company_code,
  legal_name,
  display_name,
  country_code,
  industry_code,
  subindustry_code,
  tax_id,
  status,
  timezone,
  currency_code,
  settings
)
VALUES (
  '10000000-0000-0000-0000-000000000001',
  'EMP_DEMO_CUYO',
  'Empresa Demo Cuyo S.A.',
  'Empresa Demo Cuyo',
  'AR',
  'commerce',
  'construction_supplies',
  '30-00000000-1',
  'pilot',
  'America/Argentina/Mendoza',
  'ARS',
  '{
    "demo": true,
    "mvp_scope": ["sales", "margin", "discounts", "stock", "receivables", "actions", "score"],
    "description": "Empresa ficticia para demo FARO Connect MVP"
  }'::jsonb
)
ON CONFLICT (company_id) DO UPDATE SET
  display_name = EXCLUDED.display_name,
  settings = EXCLUDED.settings,
  updated_at = now();

-- ============================================================
-- 2. SUCURSALES
-- ============================================================

INSERT INTO faro.branches (
  branch_id,
  company_id,
  branch_code,
  name,
  branch_type,
  country_code,
  province,
  city,
  address,
  status,
  metadata
)
VALUES
  (
    '11000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    'MZA-CENTRAL',
    'Sucursal Mendoza Central',
    'commercial',
    'AR',
    'Mendoza',
    'Godoy Cruz',
    'Dirección demo 100',
    'active',
    '{"demo": true}'::jsonb
  ),
  (
    '11000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    'SJ-COMERCIAL',
    'Sucursal San Juan',
    'commercial',
    'AR',
    'San Juan',
    'San Juan',
    'Dirección demo 200',
    'active',
    '{"demo": true, "opening_stage": "ramp_up"}'::jsonb
  ),
  (
    '11000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    'DEP-CUYO',
    'Depósito Central Cuyo',
    'warehouse',
    'AR',
    'Mendoza',
    'Luján de Cuyo',
    'Dirección demo 300',
    'active',
    '{"demo": true}'::jsonb
  )
ON CONFLICT (company_id, branch_code) DO NOTHING;

-- ============================================================
-- 3. ÁREAS
-- ============================================================

INSERT INTO faro.areas (
  area_id,
  company_id,
  area_code,
  name,
  area_type,
  status
)
VALUES
  ('13000000-0000-0000-0000-000000000001', '10000000-0000-0000-0000-000000000001', 'DIR', 'Dirección', 'direction', 'active'),
  ('13000000-0000-0000-0000-000000000002', '10000000-0000-0000-0000-000000000001', 'COM', 'Comercial', 'commercial', 'active'),
  ('13000000-0000-0000-0000-000000000003', '10000000-0000-0000-0000-000000000001', 'FIN', 'Finanzas y Cobranza', 'finance', 'active'),
  ('13000000-0000-0000-0000-000000000004', '10000000-0000-0000-0000-000000000001', 'STK', 'Stock y Depósito', 'stock', 'active'),
  ('13000000-0000-0000-0000-000000000005', '10000000-0000-0000-0000-000000000001', 'COMPRAS', 'Compras', 'purchasing', 'active'),
  ('13000000-0000-0000-0000-000000000006', '10000000-0000-0000-0000-000000000001', 'OPS', 'Operaciones', 'operations', 'active'),
  ('13000000-0000-0000-0000-000000000007', '10000000-0000-0000-0000-000000000001', 'RRHH', 'Recursos Humanos', 'hr', 'active'),
  ('13000000-0000-0000-0000-000000000008', '10000000-0000-0000-0000-000000000001', 'ADM', 'Administración', 'admin', 'active')
ON CONFLICT (company_id, area_code) DO NOTHING;

-- ============================================================
-- 4. USUARIOS DEMO
-- ============================================================

INSERT INTO faro.users (
  user_id,
  company_id,
  email,
  full_name,
  phone,
  status,
  default_branch_id,
  default_area_id,
  metadata
)
VALUES
  (
    '12000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    'director@empresademo.local',
    'Director General Demo',
    '+54 261 0000001',
    'active',
    '11000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000001',
    '{"demo": true, "role_hint": "director"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    'gerencia@empresademo.local',
    'Gerente General Demo',
    '+54 261 0000002',
    'active',
    '11000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000001',
    '{"demo": true, "role_hint": "general_manager"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    'comercial@empresademo.local',
    'Responsable Comercial Demo',
    '+54 261 0000003',
    'active',
    '11000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000002',
    '{"demo": true, "role_hint": "commercial_user"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000004',
    '10000000-0000-0000-0000-000000000001',
    'finanzas@empresademo.local',
    'Responsable Finanzas Demo',
    '+54 261 0000004',
    'active',
    '11000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000003',
    '{"demo": true, "role_hint": "finance_user"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000005',
    '10000000-0000-0000-0000-000000000001',
    'stock@empresademo.local',
    'Responsable Stock Demo',
    '+54 261 0000005',
    'active',
    '11000000-0000-0000-0000-000000000003',
    '13000000-0000-0000-0000-000000000004',
    '{"demo": true, "role_hint": "stock_user"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000006',
    '10000000-0000-0000-0000-000000000001',
    'compras@empresademo.local',
    'Responsable Compras Demo',
    '+54 261 0000006',
    'active',
    '11000000-0000-0000-0000-000000000003',
    '13000000-0000-0000-0000-000000000005',
    '{"demo": true, "role_hint": "area_manager"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000007',
    '10000000-0000-0000-0000-000000000001',
    'vendedor1@empresademo.local',
    'Vendedor Alto Descuento Demo',
    '+54 261 0000007',
    'active',
    '11000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000002',
    '{"demo": true, "role_hint": "salesperson"}'::jsonb
  ),
  (
    '12000000-0000-0000-0000-000000000008',
    '10000000-0000-0000-0000-000000000001',
    'vendedor2@empresademo.local',
    'Vendedora Rentable Demo',
    '+54 261 0000008',
    'active',
    '11000000-0000-0000-0000-000000000002',
    '13000000-0000-0000-0000-000000000002',
    '{"demo": true, "role_hint": "salesperson"}'::jsonb
  )
ON CONFLICT (company_id, email) DO NOTHING;

-- ============================================================
-- 5. ROLES BASE FALLBACK
-- Si FARO-SQL-002 ya los creó, no duplica.
-- ============================================================

INSERT INTO faro.roles (
  company_id,
  role_code,
  name,
  scope,
  description,
  is_system_role
)
VALUES
  (NULL, 'faro_owner', 'Owner FARO', 'system', 'Internal FARO owner role', true),
  (NULL, 'company_admin', 'Administrador Empresa', 'company', 'Company administrator', true),
  (NULL, 'director', 'Director', 'company', 'Executive director', true),
  (NULL, 'general_manager', 'Gerente General', 'company', 'General manager', true),
  (NULL, 'area_manager', 'Responsable de Área', 'area', 'Area manager', true),
  (NULL, 'commercial_user', 'Usuario Comercial', 'area', 'Commercial user', true),
  (NULL, 'finance_user', 'Usuario Finanzas', 'area', 'Finance user', true),
  (NULL, 'stock_user', 'Usuario Stock', 'area', 'Stock user', true),
  (NULL, 'integration_service', 'Integration Service', 'service', 'Technical integration role', true),
  (NULL, 'viewer', 'Lector', 'company', 'Read-only limited user', true)
ON CONFLICT DO NOTHING;

-- ============================================================
-- 6. ASIGNACIÓN DE ROLES
-- ============================================================

INSERT INTO faro.user_roles (
  company_id,
  user_id,
  role_id,
  branch_id,
  area_id,
  assigned_by,
  status
)
SELECT
  '10000000-0000-0000-0000-000000000001',
  '12000000-0000-0000-0000-000000000001',
  r.role_id,
  NULL,
  NULL,
  '12000000-0000-0000-0000-000000000001',
  'active'
FROM faro.roles r
WHERE r.role_code = 'director'
LIMIT 1
ON CONFLICT DO NOTHING;

INSERT INTO faro.user_roles (
  company_id,
  user_id,
  role_id,
  branch_id,
  area_id,
  assigned_by,
  status
)
SELECT
  '10000000-0000-0000-0000-000000000001',
  '12000000-0000-0000-0000-000000000002',
  r.role_id,
  NULL,
  NULL,
  '12000000-0000-0000-0000-000000000001',
  'active'
FROM faro.roles r
WHERE r.role_code = 'general_manager'
LIMIT 1
ON CONFLICT DO NOTHING;

INSERT INTO faro.user_roles (
  company_id,
  user_id,
  role_id,
  branch_id,
  area_id,
  assigned_by,
  status
)
SELECT
  '10000000-0000-0000-0000-000000000001',
  '12000000-0000-0000-0000-000000000003',
  r.role_id,
  NULL,
  '13000000-0000-0000-0000-000000000002',
  '12000000-0000-0000-0000-000000000001',
  'active'
FROM faro.roles r
WHERE r.role_code = 'commercial_user'
LIMIT 1
ON CONFLICT DO NOTHING;

INSERT INTO faro.user_roles (
  company_id,
  user_id,
  role_id,
  branch_id,
  area_id,
  assigned_by,
  status
)
SELECT
  '10000000-0000-0000-0000-000000000001',
  '12000000-0000-0000-0000-000000000004',
  r.role_id,
  NULL,
  '13000000-0000-0000-0000-000000000003',
  '12000000-0000-0000-0000-000000000001',
  'active'
FROM faro.roles r
WHERE r.role_code = 'finance_user'
LIMIT 1
ON CONFLICT DO NOTHING;

INSERT INTO faro.user_roles (
  company_id,
  user_id,
  role_id,
  branch_id,
  area_id,
  assigned_by,
  status
)
SELECT
  '10000000-0000-0000-0000-000000000001',
  '12000000-0000-0000-0000-000000000005',
  r.role_id,
  '11000000-0000-0000-0000-000000000003',
  '13000000-0000-0000-0000-000000000004',
  '12000000-0000-0000-0000-000000000001',
  'active'
FROM faro.roles r
WHERE r.role_code = 'stock_user'
LIMIT 1
ON CONFLICT DO NOTHING;

-- ============================================================
-- 7. FUENTES DE DATOS DEMO
-- ============================================================

INSERT INTO faro.data_sources (
  source_id,
  company_id,
  source_code,
  name,
  source_type,
  system_name,
  owner_area_id,
  owner_user_id,
  format_type,
  update_frequency,
  access_method,
  sensitivity_level,
  quality_score,
  status,
  notes,
  metadata
)
VALUES
  (
    '14000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    'SRC-SALES-CSV',
    'Ventas CSV Demo',
    'csv',
    'Export ERP Demo',
    '13000000-0000-0000-0000-000000000002',
    '12000000-0000-0000-0000-000000000003',
    'csv',
    'weekly',
    'manual_upload',
    'high',
    86,
    'active',
    'Fuente demo de ventas',
    '{"demo": true, "mvp": true}'::jsonb
  ),
  (
    '14000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    'SRC-STOCK-XLSX',
    'Stock XLSX Demo',
    'excel',
    'Planilla Stock Demo',
    '13000000-0000-0000-0000-000000000004',
    '12000000-0000-0000-0000-000000000005',
    'xlsx',
    'weekly',
    'manual_upload',
    'medium',
    74,
    'active',
    'Fuente demo de stock',
    '{"demo": true, "mvp": true}'::jsonb
  ),
  (
    '14000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    'SRC-AR-CSV',
    'Cuentas por Cobrar CSV Demo',
    'csv',
    'Export Cobranzas Demo',
    '13000000-0000-0000-0000-000000000003',
    '12000000-0000-0000-0000-000000000004',
    'csv',
    'weekly',
    'manual_upload',
    'critical',
    82,
    'active',
    'Fuente demo de cobranza',
    '{"demo": true, "mvp": true}'::jsonb
  ),
  (
    '14000000-0000-0000-0000-000000000004',
    '10000000-0000-0000-0000-000000000001',
    'SRC-PRODUCTS-CSV',
    'Productos CSV Demo',
    'csv',
    'Maestro Productos Demo',
    '13000000-0000-0000-0000-000000000004',
    '12000000-0000-0000-0000-000000000005',
    'csv',
    'monthly',
    'manual_upload',
    'medium',
    88,
    'active',
    'Fuente demo de productos',
    '{"demo": true, "mvp": true}'::jsonb
  ),
  (
    '14000000-0000-0000-0000-000000000005',
    '10000000-0000-0000-0000-000000000001',
    'SRC-CUSTOMERS-CSV',
    'Clientes CSV Demo',
    'csv',
    'Maestro Clientes Demo',
    '13000000-0000-0000-0000-000000000002',
    '12000000-0000-0000-0000-000000000003',
    'csv',
    'monthly',
    'manual_upload',
    'high',
    80,
    'active',
    'Fuente demo de clientes',
    '{"demo": true, "mvp": true}'::jsonb
  ),
  (
    '14000000-0000-0000-0000-000000000006',
    '10000000-0000-0000-0000-000000000001',
    'SRC-ACTIONS-MANUAL',
    'Acciones Manuales Demo',
    'manual',
    'FARO Manual',
    '13000000-0000-0000-0000-000000000001',
    '12000000-0000-0000-0000-000000000002',
    'manual',
    'weekly',
    'manual_upload',
    'medium',
    90,
    'active',
    'Fuente demo de acciones',
    '{"demo": true, "mvp": true}'::jsonb
  )
ON CONFLICT (company_id, source_code) DO NOTHING;

-- ============================================================
-- 8. LOTES DE INGESTA DEMO
-- ============================================================

INSERT INTO faro.ingestion_batches (
  ingestion_id,
  company_id,
  source_id,
  batch_code,
  file_name,
  file_type,
  file_hash,
  period_start,
  period_end,
  records_count,
  raw_records_count,
  staging_records_count,
  rejected_records_count,
  status,
  metadata
)
VALUES
  (
    '15000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '14000000-0000-0000-0000-000000000001',
    'BATCH-SALES-2026-05',
    'EMP_DEMO_ventas_2026-05.csv',
    'csv',
    'demo_hash_sales_202605',
    '2026-05-01',
    '2026-05-31',
    24,
    24,
    24,
    0,
    'processed_staging',
    '{"demo": true}'::jsonb
  ),
  (
    '15000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '14000000-0000-0000-0000-000000000002',
    'BATCH-STOCK-2026-05',
    'EMP_DEMO_stock_2026-05.xlsx',
    'xlsx',
    'demo_hash_stock_202605',
    '2026-05-01',
    '2026-05-31',
    10,
    10,
    10,
    0,
    'processed_staging',
    '{"demo": true}'::jsonb
  ),
  (
    '15000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    '14000000-0000-0000-0000-000000000003',
    'BATCH-AR-2026-05',
    'EMP_DEMO_cobranza_2026-05.csv',
    'csv',
    'demo_hash_ar_202605',
    '2026-05-01',
    '2026-05-31',
    10,
    10,
    10,
    0,
    'processed_staging',
    '{"demo": true}'::jsonb
  )
ON CONFLICT (company_id, batch_code) DO NOTHING;

-- ============================================================
-- 9. PRODUCTOS
-- ============================================================

INSERT INTO faro.products (
  product_id,
  company_id,
  product_code,
  sku,
  name,
  category,
  subcategory,
  brand,
  unit_of_measure,
  cost_current,
  price_current,
  margin_target,
  is_stockable,
  is_active,
  source_id,
  metadata
)
VALUES
  ('16000000-0000-0000-0000-000000000001', '10000000-0000-0000-0000-000000000001', 'PROD-CEM-50', 'CEM-50', 'Cemento Portland 50kg', 'Materiales gruesos', 'Cemento', 'DemoCem', 'bolsa', 6200, 8500, 0.27, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true, "critical": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000002', '10000000-0000-0000-0000-000000000001', 'PROD-HIER-8', 'HIER-8', 'Hierro nervado 8mm', 'Hierros', 'Acero', 'DemoSteel', 'barra', 3900, 5400, 0.25, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true, "critical": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000003', '10000000-0000-0000-0000-000000000001', 'PROD-HIER-12', 'HIER-12', 'Hierro nervado 12mm', 'Hierros', 'Acero', 'DemoSteel', 'barra', 7600, 10500, 0.25, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true, "critical": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000004', '10000000-0000-0000-0000-000000000001', 'PROD-PORC-60', 'PORC-60', 'Porcelanato 60x60', 'Pisos y revestimientos', 'Porcelanato', 'DemoTile', 'm2', 9800, 14500, 0.30, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000005', '10000000-0000-0000-0000-000000000001', 'PROD-GRIF-MONO', 'GRIF-MONO', 'Grifería monocomando lavatorio', 'Grifería', 'Baño', 'DemoGrif', 'unidad', 28000, 43000, 0.32, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000006', '10000000-0000-0000-0000-000000000001', 'PROD-TF-20', 'TF-20', 'Caño termofusión 20mm', 'Instalaciones', 'Agua', 'DemoFusion', 'metro', 900, 1450, 0.34, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true, "critical": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000007', '10000000-0000-0000-0000-000000000001', 'PROD-TF-25', 'TF-25', 'Caño termofusión 25mm', 'Instalaciones', 'Agua', 'DemoFusion', 'metro', 1250, 1950, 0.33, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000008', '10000000-0000-0000-0000-000000000001', 'PROD-ADH-PORC', 'ADH-PORC', 'Adhesivo porcelanato 30kg', 'Pegamentos', 'Adhesivos', 'DemoFix', 'bolsa', 4500, 6800, 0.28, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000009', '10000000-0000-0000-0000-000000000001', 'PROD-LOZA-INOD', 'LOZA-INOD', 'Inodoro largo blanco', 'Loza sanitaria', 'Baño', 'DemoBath', 'unidad', 52000, 78000, 0.31, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true}'::jsonb),
  ('16000000-0000-0000-0000-000000000010', '10000000-0000-0000-0000-000000000001', 'PROD-MEMB-10', 'MEMB-10', 'Membrana asfáltica 10m', 'Impermeabilización', 'Membranas', 'DemoRoof', 'rollo', 18500, 27000, 0.29, true, true, '14000000-0000-0000-0000-000000000004', '{"demo": true}'::jsonb)
ON CONFLICT (company_id, product_code) DO NOTHING;

-- ============================================================
-- 10. CLIENTES
-- ============================================================

INSERT INTO faro.customers (
  customer_id,
  company_id,
  customer_code,
  legal_name,
  display_name,
  tax_id,
  customer_type,
  segment,
  city,
  province,
  country_code,
  credit_limit,
  payment_terms_days,
  risk_level,
  status,
  source_id,
  metadata
)
VALUES
  ('17000000-0000-0000-0000-000000000001', '10000000-0000-0000-0000-000000000001', 'CLI-ANDES-001', 'Constructora Andes S.R.L.', 'Constructora Andes', '30-11111111-1', 'company', 'constructoras', 'Mendoza', 'Mendoza', 'AR', 12000000, 30, 'medium', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb),
  ('17000000-0000-0000-0000-000000000002', '10000000-0000-0000-0000-000000000001', 'CLI-CUYO-002', 'Obras Cuyo S.A.', 'Obras Cuyo', '30-22222222-2', 'company', 'constructoras', 'Godoy Cruz', 'Mendoza', 'AR', 18000000, 45, 'high', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true, "risk_reason": "mora creciente"}'::jsonb),
  ('17000000-0000-0000-0000-000000000003', '10000000-0000-0000-0000-000000000001', 'CLI-SJ-003', 'Desarrollos San Juan S.A.', 'Desarrollos San Juan', '30-33333333-3', 'company', 'desarrolladores', 'San Juan', 'San Juan', 'AR', 15000000, 30, 'medium', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb),
  ('17000000-0000-0000-0000-000000000004', '10000000-0000-0000-0000-000000000001', 'CLI-MAESTRO-004', 'Maestro Mayorista Demo', 'Maestro Mayorista', '20-44444444-4', 'person', 'maestros', 'Mendoza', 'Mendoza', 'AR', 2500000, 15, 'low', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb),
  ('17000000-0000-0000-0000-000000000005', '10000000-0000-0000-0000-000000000001', 'CLI-ARQ-005', 'Estudio Arquitectura Norte', 'Arq. Norte', '30-55555555-5', 'company', 'arquitectos', 'San Juan', 'San Juan', 'AR', 3500000, 30, 'low', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb),
  ('17000000-0000-0000-0000-000000000006', '10000000-0000-0000-0000-000000000001', 'CLI-MIN-006', 'Servicios Mineros del Oeste S.A.', 'Mineros Oeste', '30-66666666-6', 'company', 'industria', 'San Juan', 'San Juan', 'AR', 22000000, 45, 'medium', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb),
  ('17000000-0000-0000-0000-000000000007', '10000000-0000-0000-0000-000000000001', 'CLI-RET-007', 'Cliente Mostrador Demo', 'Mostrador Demo', NULL, 'person', 'retail', 'Mendoza', 'Mendoza', 'AR', 0, 0, 'low', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb),
  ('17000000-0000-0000-0000-000000000008', '10000000-0000-0000-0000-000000000001', 'CLI-SUR-008', 'Constructora Sur S.A.', 'Constructora Sur', '30-88888888-8', 'company', 'constructoras', 'Mendoza', 'Mendoza', 'AR', 9000000, 30, 'medium', 'active', '14000000-0000-0000-0000-000000000005', '{"demo": true}'::jsonb)
ON CONFLICT (company_id, customer_code) DO NOTHING;

-- ============================================================
-- 11. PROVEEDORES
-- ============================================================

INSERT INTO faro.suppliers (
  supplier_id,
  company_id,
  supplier_code,
  legal_name,
  display_name,
  tax_id,
  category,
  payment_terms_days,
  risk_level,
  status,
  metadata
)
VALUES
  ('18000000-0000-0000-0000-000000000001', '10000000-0000-0000-0000-000000000001', 'PROV-CEM', 'Proveedor Cemento Demo S.A.', 'Proveedor Cemento', '30-90000001-1', 'cemento', 30, 'medium', 'active', '{"demo": true}'::jsonb),
  ('18000000-0000-0000-0000-000000000002', '10000000-0000-0000-0000-000000000001', 'PROV-HIERRO', 'Proveedor Hierro Demo S.A.', 'Proveedor Hierro', '30-90000002-2', 'hierro', 30, 'medium', 'active', '{"demo": true}'::jsonb),
  ('18000000-0000-0000-0000-000000000003', '10000000-0000-0000-0000-000000000001', 'PROV-PISOS', 'Proveedor Pisos Demo S.A.', 'Proveedor Pisos', '30-90000003-3', 'pisos', 45, 'low', 'active', '{"demo": true}'::jsonb),
  ('18000000-0000-0000-0000-000000000004', '10000000-0000-0000-0000-000000000001', 'PROV-INST', 'Proveedor Instalaciones Demo S.A.', 'Proveedor Instalaciones', '30-90000004-4', 'instalaciones', 30, 'low', 'active', '{"demo": true}'::jsonb),
  ('18000000-0000-0000-0000-000000000005', '10000000-0000-0000-0000-000000000001', 'PROV-GRIF', 'Proveedor Grifería Demo S.A.', 'Proveedor Grifería', '30-90000005-5', 'griferia', 45, 'medium', 'active', '{"demo": true}'::jsonb)
ON CONFLICT (company_id, supplier_code) DO NOTHING;

-- ============================================================
-- 12. EMPLEADOS / VENDEDORES
-- ============================================================

INSERT INTO faro.employees (
  employee_id,
  company_id,
  employee_code,
  user_id,
  full_name,
  branch_id,
  area_id,
  job_title,
  employee_type,
  hire_date,
  status,
  metadata
)
VALUES
  ('19000000-0000-0000-0000-000000000001', '10000000-0000-0000-0000-000000000001', 'EMP-DIR', '12000000-0000-0000-0000-000000000001', 'Director General Demo', '11000000-0000-0000-0000-000000000001', '13000000-0000-0000-0000-000000000001', 'Director', 'director', '2020-01-01', 'active', '{"demo": true}'::jsonb),
  ('19000000-0000-0000-0000-000000000002', '10000000-0000-0000-0000-000000000001', 'EMP-GG', '12000000-0000-0000-0000-000000000002', 'Gerente General Demo', '11000000-0000-0000-0000-000000000001', '13000000-0000-0000-0000-000000000001', 'Gerente General', 'manager', '2021-01-01', 'active', '{"demo": true}'::jsonb),
  ('19000000-0000-0000-0000-000000000003', '10000000-0000-0000-0000-000000000001', 'VEN-001', '12000000-0000-0000-0000-000000000007', 'Vendedor Alto Descuento Demo', '11000000-0000-0000-0000-000000000001', '13000000-0000-0000-0000-000000000002', 'Vendedor', 'salesperson', '2022-03-01', 'active', '{"demo": true, "risk_hint": "alto descuento"}'::jsonb),
  ('19000000-0000-0000-0000-000000000004', '10000000-0000-0000-0000-000000000001', 'VEN-002', '12000000-0000-0000-0000-000000000008', 'Vendedora Rentable Demo', '11000000-0000-0000-0000-000000000002', '13000000-0000-0000-0000-000000000002', 'Vendedora', 'salesperson', '2022-05-01', 'active', '{"demo": true}'::jsonb),
  ('19000000-0000-0000-0000-000000000005', '10000000-0000-0000-0000-000000000001', 'EMP-FIN', '12000000-0000-0000-0000-000000000004', 'Responsable Finanzas Demo', '11000000-0000-0000-0000-000000000001', '13000000-0000-0000-0000-000000000003', 'Responsable Finanzas', 'manager', '2021-06-01', 'active', '{"demo": true}'::jsonb),
  ('19000000-0000-0000-0000-000000000006', '10000000-0000-0000-0000-000000000001', 'EMP-STK', '12000000-0000-0000-0000-000000000005', 'Responsable Stock Demo', '11000000-0000-0000-0000-000000000003', '13000000-0000-0000-0000-000000000004', 'Responsable Stock', 'manager', '2021-06-01', 'active', '{"demo": true}'::jsonb)
ON CONFLICT (company_id, employee_code) DO NOTHING;

-- ============================================================
-- 13. FACT VENTAS DEMO
-- Periodo actual: mayo 2026
-- Incluye ventas altas, margen erosionado y descuentos elevados.
-- ============================================================

INSERT INTO faro.fact_sales (
  company_id,
  branch_id,
  customer_id,
  product_id,
  employee_id,
  source_id,
  ingestion_id,
  sale_date,
  document_type,
  document_number,
  line_number,
  quantity,
  gross_amount,
  discount_amount,
  net_amount,
  cost_amount,
  margin_amount,
  margin_pct,
  discount_pct,
  currency_code,
  confidence_score
)
VALUES
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000001', '16000000-0000-0000-0000-000000000001', '19000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-03', 'FA', 'A-0001-000100', 1, 600, 5100000, 714000, 4386000, 3720000, 666000, 0.1518, 0.1400, 'ARS', 90),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000002', '16000000-0000-0000-0000-000000000002', '19000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-04', 'FA', 'A-0001-000101', 1, 800, 4320000, 648000, 3672000, 3120000, 552000, 0.1503, 0.1500, 'ARS', 88),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000002', '17000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000003', '19000000-0000-0000-0000-000000000004', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-05', 'FA', 'A-0002-000040', 1, 300, 3150000, 252000, 2898000, 2280000, 618000, 0.2133, 0.0800, 'ARS', 92),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000002', '17000000-0000-0000-0000-000000000006', '16000000-0000-0000-0000-000000000006', '19000000-0000-0000-0000-000000000004', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-07', 'FA', 'A-0002-000041', 1, 3500, 5075000, 355250, 4719750, 3150000, 1569750, 0.3326, 0.0700, 'ARS', 94),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000002', '16000000-0000-0000-0000-000000000004', '19000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-09', 'FA', 'A-0001-000102', 1, 220, 3190000, 510400, 2679600, 2156000, 523600, 0.1954, 0.1600, 'ARS', 87),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000008', '16000000-0000-0000-0000-000000000005', '19000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-12', 'FA', 'A-0001-000103', 1, 55, 2365000, 425700, 1939300, 1540000, 399300, 0.2059, 0.1800, 'ARS', 86),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000002', '17000000-0000-0000-0000-000000000005', '16000000-0000-0000-0000-000000000008', '19000000-0000-0000-0000-000000000004', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-14', 'FA', 'A-0002-000042', 1, 700, 4760000, 333200, 4426800, 3150000, 1276800, 0.2884, 0.0700, 'ARS', 93),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000002', '16000000-0000-0000-0000-000000000001', '19000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-18', 'FA', 'A-0001-000104', 1, 900, 7650000, 1224000, 6426000, 5580000, 846000, 0.1317, 0.1600, 'ARS', 85),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000002', '17000000-0000-0000-0000-000000000006', '16000000-0000-0000-0000-000000000010', '19000000-0000-0000-0000-000000000004', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-22', 'FA', 'A-0002-000043', 1, 120, 3240000, 259200, 2980800, 2220000, 760800, 0.2552, 0.0800, 'ARS', 92),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000001', '16000000-0000-0000-0000-000000000007', '19000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000001', '15000000-0000-0000-0000-000000000001', '2026-05-25', 'FA', 'A-0001-000105', 1, 1800, 3510000, 526500, 2983500, 2250000, 733500, 0.2458, 0.1500, 'ARS', 88)
ON CONFLICT (company_id, source_id, document_number, line_number) DO NOTHING;

-- ============================================================
-- 14. STOCK SNAPSHOTS DEMO
-- Incluye stock crítico e inmovilizado.
-- ============================================================

INSERT INTO faro.fact_stock_snapshots (
  company_id,
  branch_id,
  product_id,
  source_id,
  ingestion_id,
  snapshot_date,
  quantity_on_hand,
  quantity_reserved,
  quantity_available,
  unit_cost,
  inventory_value,
  last_movement_date,
  confidence_score
)
VALUES
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000001', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 120, 80, 40, 6200, 744000, '2026-05-29', 78),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000002', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 95, 70, 25, 3900, 370500, '2026-05-28', 77),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000003', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 60, 42, 18, 7600, 456000, '2026-05-27', 80),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000004', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 850, 30, 820, 9800, 8330000, '2026-02-15', 72),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000005', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 140, 12, 128, 28000, 3920000, '2026-03-10', 75),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000006', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 300, 260, 40, 900, 270000, '2026-05-30', 82),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000008', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 1500, 60, 1440, 4500, 6750000, '2026-04-20', 84),
  ('10000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000003', '16000000-0000-0000-0000-000000000010', '14000000-0000-0000-0000-000000000002', '15000000-0000-0000-0000-000000000002', '2026-05-31', 22, 15, 7, 18500, 407000, '2026-05-22', 80)
ON CONFLICT (company_id, branch_id, product_id, snapshot_date) DO NOTHING;

-- ============================================================
-- 15. CUENTAS POR COBRAR DEMO
-- Incluye mora creciente y cliente de riesgo.
-- ============================================================

INSERT INTO faro.fact_receivables (
  company_id,
  customer_id,
  branch_id,
  source_id,
  ingestion_id,
  document_type,
  document_number,
  issue_date,
  due_date,
  payment_date,
  original_amount,
  open_amount,
  paid_amount,
  days_overdue,
  status,
  currency_code,
  confidence_score
)
VALUES
  ('10000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000002', '11000000-0000-0000-0000-000000000001', '14000000-0000-0000-0000-000000000003', '15000000-0000-0000-0000-000000000003', 'FA', 'A-0001-000090', '2026-03-15', '2026-04-14', NULL, 3800000, 3800000, 0, 47, 'open', 'ARS', 86),
  ('10000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000002', '11000000-0000-0000-0000-000000000001', '14000000-0000-0000-0000-000000000003', '15000000-0000-0000-0000-000000000003', 'FA', 'A-0001-000101', '2026-05-04', '2026-06-03', NULL, 3672000, 3672000, 0, 0, 'open', 'ARS', 88),
  ('10000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000001', '11000000-0000-0000-0000-000000000001', '14000000-0000-0000-0000-000000000003', '15000000-0000-0000-0000-000000000003', 'FA', 'A-0001-000100', '2026-05-03', '2026-06-02', NULL, 4386000, 2100000, 2286000, 0, 'partial', 'ARS', 90),
  ('10000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000003', '11000000-0000-0000-0000-000000000002', '14000000-0000-0000-0000-000000000003', '15000000-0000-0000-0000-000000000003', 'FA', 'A-0002-000040', '2026-05-05', '2026-06-04', NULL, 2898000, 2898000, 0, 0, 'open', 'ARS', 92),
  ('10000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000006', '11000000-0000-0000-0000-000000000002', '14000000-0000-0000-0000-000000000003', '15000000-0000-0000-0000-000000000003', 'FA', 'A-0002-000041', '2026-05-07', '2026-06-21', NULL, 4719750, 4719750, 0, 0, 'open', 'ARS', 94),
  ('10000000-0000-0000-0000-000000000001', '17000000-0000-0000-0000-000000000008', '11000000-0000-0000-0000-000000000001', '14000000-0000-0000-0000-000000000003', '15000000-0000-0000-0000-000000000003', 'FA', 'A-0001-000103', '2026-05-12', '2026-06-11', NULL, 1939300, 1939300, 0, 0, 'open', 'ARS', 86)
ON CONFLICT (company_id, source_id, document_number) DO NOTHING;

-- ============================================================
-- 16. KPI DEFINITIONS COMPLEMENTARIAS
-- Por si no fueron cargadas en FARO-SQL-001.
-- ============================================================

INSERT INTO faro.kpi_definitions (
  kpi_code,
  name,
  area_code,
  module_code,
  description,
  formula_text,
  unit,
  frequency,
  direction,
  is_mvp,
  status
)
VALUES
  ('KPI-SAL-001', 'Ventas netas', 'commercial', 'sales', 'Total ventas netas del período', 'SUM(net_amount)', 'currency', 'weekly', 'higher_is_better', true, 'active'),
  ('KPI-SAL-002', 'Margen bruto', 'commercial', 'sales', 'Margen bruto porcentual', 'SUM(margin_amount)/SUM(net_amount)', 'percentage', 'weekly', 'higher_is_better', true, 'active'),
  ('KPI-SAL-003', 'Descuento promedio', 'commercial', 'sales', 'Descuento promedio sobre venta bruta', 'SUM(discount_amount)/SUM(gross_amount)', 'percentage', 'weekly', 'lower_is_better', true, 'active'),
  ('KPI-FIN-001', 'Días de cobranza', 'finance', 'receivables', 'Días promedio de atraso/cobranza', 'AVG(days_overdue)', 'days', 'weekly', 'lower_is_better', true, 'active'),
  ('KPI-FIN-002', 'Mora vencida', 'finance', 'receivables', 'Total deuda vencida abierta', 'SUM(open_amount overdue)', 'currency', 'weekly', 'lower_is_better', true, 'active'),
  ('KPI-STK-001', 'Stock crítico', 'stock', 'stock', 'Productos con cobertura crítica', 'COUNT(stock critical)', 'count', 'weekly', 'lower_is_better', true, 'active'),
  ('KPI-STK-002', 'Stock inmovilizado', 'stock', 'stock', 'Valor de stock sin rotación', 'SUM(inventory_value inactive)', 'currency', 'weekly', 'lower_is_better', true, 'active'),
  ('KPI-ACT-001', 'Acciones vencidas', 'direction', 'actions', 'Acciones vencidas sin cierre', 'COUNT(overdue actions)', 'count', 'weekly', 'lower_is_better', true, 'active')
ON CONFLICT (kpi_code) DO NOTHING;

-- ============================================================
-- 17. KPI SNAPSHOTS
-- Abril referencia vs mayo actual.
-- ============================================================

INSERT INTO faro.kpi_snapshots (
  company_id,
  kpi_code,
  period_start,
  period_end,
  dimension_type,
  dimension_id,
  value,
  reference_value,
  delta_value,
  delta_pct,
  status,
  confidence_score,
  source_snapshot
)
VALUES
  ('10000000-0000-0000-0000-000000000001', 'KPI-SAL-001', '2026-05-01', '2026-05-31', 'company', NULL, 36102650, 30600000, 5502650, 0.1798, 'ok', 89, '{"source": "fact_sales"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-SAL-002', '2026-05-01', '2026-05-31', 'company', NULL, 0.2130, 0.2800, -0.0670, -0.2392, 'critical', 87, '{"source": "fact_sales"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-SAL-003', '2026-05-01', '2026-05-31', 'company', NULL, 0.1230, 0.0620, 0.0610, 0.9838, 'critical', 86, '{"source": "fact_sales"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-FIN-001', '2026-05-01', '2026-05-31', 'company', NULL, 43, 32, 11, 0.3437, 'warning', 82, '{"source": "fact_receivables"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-FIN-002', '2026-05-01', '2026-05-31', 'company', NULL, 3800000, 1800000, 2000000, 1.1111, 'critical', 82, '{"source": "fact_receivables"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-STK-001', '2026-05-01', '2026-05-31', 'company', NULL, 4, 2, 2, 1.0000, 'warning', 78, '{"source": "fact_stock_snapshots"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-STK-002', '2026-05-01', '2026-05-31', 'company', NULL, 12250000, 8500000, 3750000, 0.4411, 'warning', 75, '{"source": "fact_stock_snapshots"}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', 'KPI-ACT-001', '2026-05-01', '2026-05-31', 'company', NULL, 3, 1, 2, 2.0000, 'critical', 90, '{"source": "actions"}'::jsonb)
ON CONFLICT (
  company_id,
  kpi_code,
  period_start,
  period_end,
  dimension_type,
  dimension_id
) DO UPDATE SET
  value = EXCLUDED.value,
  reference_value = EXCLUDED.reference_value,
  delta_value = EXCLUDED.delta_value,
  delta_pct = EXCLUDED.delta_pct,
  status = EXCLUDED.status,
  confidence_score = EXCLUDED.confidence_score,
  calculated_at = now();

-- ============================================================
-- 18. SEÑALES
-- ============================================================

INSERT INTO faro.signal_log (
  signal_id,
  company_id,
  kpi_snapshot_id,
  signal_code,
  title,
  description,
  signal_type,
  severity,
  value,
  threshold,
  confidence_score,
  payload,
  status
)
SELECT
  gen_random_uuid(),
  ks.company_id,
  ks.kpi_snapshot_id,
  CASE ks.kpi_code
    WHEN 'KPI-SAL-001' THEN 'SIG-SALES-UP'
    WHEN 'KPI-SAL-002' THEN 'SIG-MARGIN-DOWN'
    WHEN 'KPI-SAL-003' THEN 'SIG-DISCOUNT-UP'
    WHEN 'KPI-FIN-001' THEN 'SIG-COLLECTION-DAYS-UP'
    WHEN 'KPI-FIN-002' THEN 'SIG-OVERDUE-UP'
    WHEN 'KPI-STK-001' THEN 'SIG-STOCK-CRITICAL'
    WHEN 'KPI-STK-002' THEN 'SIG-STOCK-IMMOBILIZED'
    WHEN 'KPI-ACT-001' THEN 'SIG-ACTIONS-OVERDUE'
    ELSE 'SIG-UNKNOWN'
  END,
  CASE ks.kpi_code
    WHEN 'KPI-SAL-001' THEN 'Ventas en crecimiento'
    WHEN 'KPI-SAL-002' THEN 'Margen bruto en caída'
    WHEN 'KPI-SAL-003' THEN 'Descuentos en aumento'
    WHEN 'KPI-FIN-001' THEN 'Días de cobranza en aumento'
    WHEN 'KPI-FIN-002' THEN 'Mora vencida en aumento'
    WHEN 'KPI-STK-001' THEN 'Stock crítico detectado'
    WHEN 'KPI-STK-002' THEN 'Stock inmovilizado elevado'
    WHEN 'KPI-ACT-001' THEN 'Acciones vencidas'
    ELSE 'Señal no clasificada'
  END,
  'Señal generada desde KPI demo FARO',
  'threshold',
  CASE
    WHEN ks.status = 'critical' THEN 'critical'
    WHEN ks.status = 'warning' THEN 'high'
    ELSE 'medium'
  END,
  ks.value,
  ks.reference_value,
  ks.confidence_score,
  jsonb_build_object(
    'kpi_code', ks.kpi_code,
    'delta_pct', ks.delta_pct,
    'demo', true
  ),
  'new'
FROM faro.kpi_snapshots ks
WHERE ks.company_id = '10000000-0000-0000-0000-000000000001'
  AND ks.period_start = '2026-05-01'
  AND NOT EXISTS (
    SELECT 1
    FROM faro.signal_log sl
    WHERE sl.company_id = ks.company_id
      AND sl.kpi_snapshot_id = ks.kpi_snapshot_id
  );

-- ============================================================
-- 19. RULE DEFINITIONS DEMO
-- ============================================================

INSERT INTO faro.rule_definitions (
  rule_id,
  company_id,
  rule_code,
  name,
  description,
  rule_type,
  rule_format,
  rule_body,
  severity_default,
  is_mvp,
  status,
  version
)
VALUES
  (
    '20000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    'RULE-TNS-001',
    'Crecimiento no rentable',
    'Ventas crecen mientras margen cae y descuentos aumentan',
    'tension',
    'json',
    '{
      "all": [
        {"signal": "SIG-SALES-UP"},
        {"signal": "SIG-MARGIN-DOWN"},
        {"signal": "SIG-DISCOUNT-UP"}
      ],
      "expected_tension": "TNS-001"
    }'::jsonb,
    'critical',
    true,
    'active',
    1
  ),
  (
    '20000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    'RULE-TNS-002',
    'Venta sin caja',
    'Ventas relevantes con cobranza deteriorada y mora creciente',
    'tension',
    'json',
    '{
      "all": [
        {"signal": "SIG-SALES-UP"},
        {"signal": "SIG-COLLECTION-DAYS-UP"},
        {"signal": "SIG-OVERDUE-UP"}
      ],
      "expected_tension": "TNS-002"
    }'::jsonb,
    'high',
    true,
    'active',
    1
  ),
  (
    '20000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    'RULE-TNS-003',
    'Stock crítico comercial',
    'Productos de alta rotación con cobertura crítica',
    'tension',
    'json',
    '{
      "all": [
        {"signal": "SIG-STOCK-CRITICAL"}
      ],
      "expected_tension": "TNS-003"
    }'::jsonb,
    'high',
    true,
    'active',
    1
  ),
  (
    '20000000-0000-0000-0000-000000000004',
    '10000000-0000-0000-0000-000000000001',
    'RULE-TNS-004',
    'Stock inmovilizado',
    'Capital atrapado en productos sin rotación suficiente',
    'tension',
    'json',
    '{
      "all": [
        {"signal": "SIG-STOCK-IMMOBILIZED"}
      ],
      "expected_tension": "TNS-004"
    }'::jsonb,
    'medium',
    true,
    'active',
    1
  ),
  (
    '20000000-0000-0000-0000-000000000005',
    '10000000-0000-0000-0000-000000000001',
    'RULE-TNS-005',
    'Acciones sin cierre',
    'Acciones vencidas o sin evidencia de cierre',
    'tension',
    'json',
    '{
      "all": [
        {"signal": "SIG-ACTIONS-OVERDUE"}
      ],
      "expected_tension": "TNS-005"
    }'::jsonb,
    'high',
    true,
    'active',
    1
  )
ON CONFLICT (company_id, rule_code, version) DO NOTHING;

-- ============================================================
-- 20. RULE EVALUATIONS
-- ============================================================

INSERT INTO faro.rule_evaluations (
  rule_evaluation_id,
  company_id,
  rule_id,
  period_start,
  period_end,
  result,
  severity,
  confidence_score,
  input_payload,
  output_payload,
  status
)
VALUES
  (
    '21000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '20000000-0000-0000-0000-000000000001',
    '2026-05-01',
    '2026-05-31',
    true,
    'critical',
    86,
    '{"signals": ["SIG-SALES-UP", "SIG-MARGIN-DOWN", "SIG-DISCOUNT-UP"]}'::jsonb,
    '{"tension_code": "TNS-001"}'::jsonb,
    'completed'
  ),
  (
    '21000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '20000000-0000-0000-0000-000000000002',
    '2026-05-01',
    '2026-05-31',
    true,
    'high',
    82,
    '{"signals": ["SIG-SALES-UP", "SIG-COLLECTION-DAYS-UP", "SIG-OVERDUE-UP"]}'::jsonb,
    '{"tension_code": "TNS-002"}'::jsonb,
    'completed'
  ),
  (
    '21000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    '20000000-0000-0000-0000-000000000003',
    '2026-05-01',
    '2026-05-31',
    true,
    'high',
    78,
    '{"signals": ["SIG-STOCK-CRITICAL"]}'::jsonb,
    '{"tension_code": "TNS-003"}'::jsonb,
    'completed'
  ),
  (
    '21000000-0000-0000-0000-000000000004',
    '10000000-0000-0000-0000-000000000001',
    '20000000-0000-0000-0000-000000000004',
    '2026-05-01',
    '2026-05-31',
    true,
    'medium',
    75,
    '{"signals": ["SIG-STOCK-IMMOBILIZED"]}'::jsonb,
    '{"tension_code": "TNS-004"}'::jsonb,
    'completed'
  ),
  (
    '21000000-0000-0000-0000-000000000005',
    '10000000-0000-0000-0000-000000000001',
    '20000000-0000-0000-0000-000000000005',
    '2026-05-01',
    '2026-05-31',
    true,
    'high',
    90,
    '{"signals": ["SIG-ACTIONS-OVERDUE"]}'::jsonb,
    '{"tension_code": "TNS-005"}'::jsonb,
    'completed'
  )
ON CONFLICT DO NOTHING;

-- ============================================================
-- 21. TENSIONES DEMO
-- ============================================================

INSERT INTO faro.tensions (
  tension_id,
  company_id,
  rule_evaluation_id,
  tension_code,
  title,
  description,
  area_id,
  branch_id,
  responsible_user_id,
  severity,
  priority_score,
  confidence_score,
  status,
  detected_at,
  due_at,
  score_impact,
  payload
)
VALUES
  (
    '22000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '21000000-0000-0000-0000-000000000001',
    'TNS-001',
    'Crecimiento no rentable',
    'Las ventas crecieron 18%, pero el margen cayó de 28% a 21% y el descuento promedio subió de 6% a 12%.',
    '13000000-0000-0000-0000-000000000002',
    NULL,
    '12000000-0000-0000-0000-000000000003',
    'critical',
    92,
    86,
    'in_analysis',
    '2026-05-30 09:00:00-03',
    '2026-06-06 18:00:00-03',
    -8.5,
    '{"demo": true, "main_kpis": ["KPI-SAL-001", "KPI-SAL-002", "KPI-SAL-003"]}'::jsonb
  ),
  (
    '22000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '21000000-0000-0000-0000-000000000002',
    'TNS-002',
    'Venta sin conversión a caja',
    'La cobranza se estiró de 32 a 43 días y la mora vencida creció 111%.',
    '13000000-0000-0000-0000-000000000003',
    NULL,
    '12000000-0000-0000-0000-000000000004',
    'high',
    84,
    82,
    'in_execution',
    '2026-05-30 09:10:00-03',
    '2026-06-04 18:00:00-03',
    -6.0,
    '{"demo": true, "main_kpis": ["KPI-FIN-001", "KPI-FIN-002"]}'::jsonb
  ),
  (
    '22000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    '21000000-0000-0000-0000-000000000003',
    'TNS-003',
    'Stock crítico en productos de alta rotación',
    'Cemento, hierro y termofusión muestran cobertura crítica frente al ritmo de venta.',
    '13000000-0000-0000-0000-000000000004',
    '11000000-0000-0000-0000-000000000003',
    '12000000-0000-0000-0000-000000000005',
    'high',
    79,
    78,
    'new',
    '2026-05-30 09:20:00-03',
    '2026-06-03 18:00:00-03',
    -5.5,
    '{"demo": true, "products": ["PROD-CEM-50", "PROD-HIER-8", "PROD-TF-20"]}'::jsonb
  ),
  (
    '22000000-0000-0000-0000-000000000004',
    '10000000-0000-0000-0000-000000000001',
    '21000000-0000-0000-0000-000000000004',
    'TNS-004',
    'Stock inmovilizado relevante',
    'Porcelanato y grifería acumulan capital inmovilizado con baja rotación.',
    '13000000-0000-0000-0000-000000000004',
    '11000000-0000-0000-0000-000000000003',
    '12000000-0000-0000-0000-000000000005',
    'medium',
    63,
    75,
    'new',
    '2026-05-30 09:30:00-03',
    '2026-06-10 18:00:00-03',
    -3.0,
    '{"demo": true, "products": ["PROD-PORC-60", "PROD-GRIF-MONO"]}'::jsonb
  ),
  (
    '22000000-0000-0000-0000-000000000005',
    '10000000-0000-0000-0000-000000000001',
    '21000000-0000-0000-0000-000000000005',
    'TNS-005',
    'Acciones sin cierre ni evidencia',
    'Hay acciones vencidas sin evidencia suficiente de cierre.',
    '13000000-0000-0000-0000-000000000001',
    NULL,
    '12000000-0000-0000-0000-000000000002',
    'high',
    76,
    90,
    'in_execution',
    '2026-05-30 09:40:00-03',
    '2026-06-02 18:00:00-03',
    -4.0,
    '{"demo": true}'::jsonb
  )
ON CONFLICT DO NOTHING;

-- ============================================================
-- 22. ACCIONES DEMO
-- ============================================================

INSERT INTO faro.actions (
  action_id,
  company_id,
  tension_id,
  action_code,
  title,
  description,
  action_type,
  responsible_user_id,
  approver_user_id,
  area_id,
  branch_id,
  status,
  priority,
  due_date,
  started_at,
  expected_impact,
  expected_impact_amount,
  evidence_required,
  closure_criteria,
  created_by,
  payload
)
VALUES
  (
    '23000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000001',
    'ACT-001',
    'Revisar política de descuentos por vendedor y producto',
    'Analizar descuentos aplicados por vendedor y bloquear descuentos fuera de política.',
    'corrective',
    '12000000-0000-0000-0000-000000000003',
    '12000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000002',
    NULL,
    'in_analysis',
    'critical',
    '2026-06-06',
    '2026-05-30 10:00:00-03',
    'Recuperar 3 a 5 puntos de margen bruto',
    1800000,
    true,
    'Nueva matriz de descuentos aprobada por dirección y cargada como evidencia.',
    '12000000-0000-0000-0000-000000000002',
    '{"demo": true}'::jsonb
  ),
  (
    '23000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000001',
    'ACT-002',
    'Revisar comisión variable vinculada a margen',
    'Evaluar si el esquema de comisión incentiva ventas con descuento excesivo.',
    'analysis',
    '12000000-0000-0000-0000-000000000002',
    '12000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000001',
    NULL,
    'new',
    'high',
    '2026-06-10',
    NULL,
    'Alinear incentivo comercial con rentabilidad',
    1200000,
    true,
    'Propuesta de política comercial/comisiones validada por dirección.',
    '12000000-0000-0000-0000-000000000002',
    '{"demo": true}'::jsonb
  ),
  (
    '23000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000002',
    'ACT-003',
    'Gestionar cobranza prioritaria de cliente en mora',
    'Contactar cliente Obras Cuyo y acordar plan de pago documentado.',
    'corrective',
    '12000000-0000-0000-0000-000000000004',
    '12000000-0000-0000-0000-000000000002',
    '13000000-0000-0000-0000-000000000003',
    NULL,
    'in_execution',
    'high',
    '2026-06-04',
    '2026-05-30 11:00:00-03',
    'Reducir mora vencida crítica',
    3800000,
    true,
    'Acuerdo de pago o comprobante de gestión cargado como evidencia.',
    '12000000-0000-0000-0000-000000000002',
    '{"demo": true, "customer": "CLI-CUYO-002"}'::jsonb
  ),
  (
    '23000000-0000-0000-0000-000000000004',
    '10000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000003',
    'ACT-004',
    'Generar reposición urgente de productos críticos',
    'Priorizar reposición de cemento, hierro y termofusión.',
    'corrective',
    '12000000-0000-0000-0000-000000000006',
    '12000000-0000-0000-0000-000000000002',
    '13000000-0000-0000-0000-000000000005',
    '11000000-0000-0000-0000-000000000003',
    'new',
    'high',
    '2026-06-03',
    NULL,
    'Reducir riesgo de quiebre de stock',
    2500000,
    true,
    'Orden de compra emitida o proveedor confirmado.',
    '12000000-0000-0000-0000-000000000002',
    '{"demo": true}'::jsonb
  ),
  (
    '23000000-0000-0000-0000-000000000005',
    '10000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000004',
    'ACT-005',
    'Diseñar plan de liquidación de stock inmovilizado',
    'Armar lista de SKU inmovilizados y propuesta comercial controlada.',
    'corrective',
    '12000000-0000-0000-0000-000000000003',
    '12000000-0000-0000-0000-000000000002',
    '13000000-0000-0000-0000-000000000002',
    NULL,
    'new',
    'medium',
    '2026-06-10',
    NULL,
    'Liberar capital inmovilizado sin destruir margen',
    1500000,
    true,
    'Plan de liquidación aprobado con SKUs, descuentos máximos y duración.',
    '12000000-0000-0000-0000-000000000002',
    '{"demo": true}'::jsonb
  ),
  (
    '23000000-0000-0000-0000-000000000006',
    '10000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000005',
    'ACT-006',
    'Regularizar acciones vencidas sin evidencia',
    'Revisar acciones abiertas y exigir evidencia o escalamiento.',
    'follow_up',
    '12000000-0000-0000-0000-000000000002',
    '12000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000001',
    NULL,
    'in_execution',
    'high',
    '2026-06-02',
    '2026-05-30 12:00:00-03',
    'Aumentar disciplina de ejecución',
    NULL,
    true,
    'Acciones regularizadas con evidencia o escaladas.',
    '12000000-0000-0000-0000-000000000001',
    '{"demo": true}'::jsonb
  ),
  (
    '23000000-0000-0000-0000-000000000007',
    '10000000-0000-0000-0000-000000000001',
    NULL,
    'ACT-007',
    'Preparar reporte semanal para dirección',
    'Generar reporte ejecutivo con score, tensiones y acciones.',
    'follow_up',
    '12000000-0000-0000-0000-000000000002',
    '12000000-0000-0000-0000-000000000001',
    '13000000-0000-0000-0000-000000000001',
    NULL,
    'closed',
    'medium',
    '2026-05-31',
    '2026-05-30 13:00:00-03',
    'Mejorar visibilidad ejecutiva semanal',
    NULL,
    true,
    'Reporte generado y validado por dirección.',
    '12000000-0000-0000-0000-000000000001',
    '{"demo": true}'::jsonb
  )
ON CONFLICT DO NOTHING;

-- ============================================================
-- 23. HISTORIAL DE ESTADOS DE ACCIONES
-- ============================================================

INSERT INTO faro.action_status_history (
  company_id,
  action_id,
  previous_status,
  new_status,
  changed_by,
  change_reason,
  metadata
)
VALUES
  ('10000000-0000-0000-0000-000000000001', '23000000-0000-0000-0000-000000000001', NULL, 'in_analysis', '12000000-0000-0000-0000-000000000003', 'Acción asignada desde tensión crítica', '{"demo": true}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', '23000000-0000-0000-0000-000000000003', NULL, 'in_execution', '12000000-0000-0000-0000-000000000004', 'Gestión de cobranza iniciada', '{"demo": true}'::jsonb),
  ('10000000-0000-0000-0000-000000000001', '23000000-0000-0000-0000-000000000007', 'in_execution', 'closed', '12000000-0000-0000-0000-000000000001', 'Reporte validado por dirección', '{"demo": true}'::jsonb)
ON CONFLICT DO NOTHING;

-- ============================================================
-- 24. EVIDENCIA DEMO
-- ============================================================

INSERT INTO faro.evidence (
  evidence_id,
  company_id,
  action_id,
  tension_id,
  evidence_code,
  evidence_type,
  title,
  description,
  storage_uri,
  file_name,
  file_hash,
  submitted_by,
  submitted_at,
  reviewed_by,
  reviewed_at,
  status,
  review_comment,
  metadata
)
VALUES
  (
    '24000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '23000000-0000-0000-0000-000000000003',
    '22000000-0000-0000-0000-000000000002',
    'EVD-001',
    'comment',
    'Gestión inicial de cobranza',
    'Se contactó al cliente Obras Cuyo y se solicitó fecha de pago.',
    NULL,
    NULL,
    NULL,
    '12000000-0000-0000-0000-000000000004',
    '2026-05-30 14:00:00-03',
    '12000000-0000-0000-0000-000000000002',
    NULL,
    'submitted',
    NULL,
    '{"demo": true}'::jsonb
  ),
  (
    '24000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '23000000-0000-0000-0000-000000000007',
    NULL,
    'EVD-002',
    'document',
    'Reporte semanal generado',
    'Reporte ejecutivo demo generado para dirección.',
    's3://faro-demo/reports/reporte-semanal-demo.pdf',
    'reporte-semanal-demo.pdf',
    'demo_report_hash',
    '12000000-0000-0000-0000-000000000002',
    '2026-05-31 09:00:00-03',
    '12000000-0000-0000-0000-000000000001',
    '2026-05-31 10:00:00-03',
    'approved',
    'Reporte validado para demo.',
    '{"demo": true}'::jsonb
  ),
  (
    '24000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    '23000000-0000-0000-0000-000000000001',
    '22000000-0000-0000-0000-000000000001',
    'EVD-003',
    'document',
    'Borrador política de descuentos',
    'Primera versión de política de descuentos máximos por familia.',
    's3://faro-demo/evidence/politica-descuentos-demo.pdf',
    'politica-descuentos-demo.pdf',
    'demo_discount_policy_hash',
    '12000000-0000-0000-0000-000000000003',
    '2026-05-31 11:00:00-03',
    NULL,
    NULL,
    'submitted',
    NULL,
    '{"demo": true}'::jsonb
  )
ON CONFLICT DO NOTHING;

-- ============================================================
-- 25. FARO SCORE DEMO
-- Score inicial 66, objetivo post-acciones 74.
-- ============================================================

INSERT INTO faro.score_snapshots (
  score_snapshot_id,
  company_id,
  period_start,
  period_end,
  dimension_type,
  dimension_id,
  score_value,
  previous_score_value,
  delta_value,
  score_status,
  confidence_score,
  components,
  explanation
)
VALUES
  (
    '25000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '2026-04-01',
    '2026-04-30',
    'company',
    NULL,
    74,
    NULL,
    NULL,
    'good',
    82,
    '{
      "commercial_health": 78,
      "margin": 72,
      "cash": 70,
      "stock": 76,
      "execution": 75,
      "data_quality": 82,
      "risk": 74
    }'::jsonb,
    'Score de referencia previo al deterioro de margen y cobranza.'
  ),
  (
    '25000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '2026-05-01',
    '2026-05-31',
    'company',
    NULL,
    66,
    74,
    -8,
    'warning',
    81,
    '{
      "commercial_health": 79,
      "margin": 58,
      "cash": 61,
      "stock": 64,
      "execution": 59,
      "data_quality": 81,
      "risk": 60,
      "main_tensions": ["TNS-001", "TNS-002", "TNS-003", "TNS-005"]
    }'::jsonb,
    'La empresa crece en ventas, pero el deterioro de margen, descuentos, cobranza y ejecución reduce la salud ejecutiva.'
  )
ON CONFLICT (
  company_id,
  period_start,
  period_end,
  dimension_type,
  dimension_id
) DO UPDATE SET
  score_value = EXCLUDED.score_value,
  previous_score_value = EXCLUDED.previous_score_value,
  delta_value = EXCLUDED.delta_value,
  score_status = EXCLUDED.score_status,
  confidence_score = EXCLUDED.confidence_score,
  components = EXCLUDED.components,
  explanation = EXCLUDED.explanation,
  calculated_at = now();

-- ============================================================
-- 26. REPORTE SEMANAL DEMO
-- ============================================================

INSERT INTO faro.reports (
  report_id,
  company_id,
  report_code,
  report_type,
  title,
  period_start,
  period_end,
  status,
  score_snapshot_id,
  content,
  pdf_uri,
  html_uri,
  generated_by,
  generated_at,
  sent_at,
  recipients
)
VALUES
  (
    '26000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    'REP-WEEKLY-2026-W22',
    'weekly_executive',
    'Reporte Semanal Ejecutivo · Empresa Demo Cuyo',
    '2026-05-25',
    '2026-05-31',
    'generated',
    '25000000-0000-0000-0000-000000000002',
    '{
      "executive_summary": "Ventas crecen, pero margen y cobranza deterioran la salud ejecutiva.",
      "score": 66,
      "previous_score": 74,
      "top_tensions": [
        {"code": "TNS-001", "title": "Crecimiento no rentable", "severity": "critical"},
        {"code": "TNS-002", "title": "Venta sin conversión a caja", "severity": "high"},
        {"code": "TNS-003", "title": "Stock crítico en productos de alta rotación", "severity": "high"}
      ],
      "recommended_focus": [
        "Revisar política de descuentos",
        "Gestionar cobranza crítica",
        "Reponer productos críticos",
        "Exigir evidencia de cierre de acciones"
      ]
    }'::jsonb,
    's3://faro-demo/reports/REP-WEEKLY-2026-W22.pdf',
    's3://faro-demo/reports/REP-WEEKLY-2026-W22.html',
    '12000000-0000-0000-0000-000000000002',
    '2026-05-31 09:00:00-03',
    NULL,
    '[
      {"email": "director@empresademo.local", "name": "Director General Demo"},
      {"email": "gerencia@empresademo.local", "name": "Gerente General Demo"}
    ]'::jsonb
  )
ON CONFLICT (company_id, report_code) DO UPDATE SET
  content = EXCLUDED.content,
  status = EXCLUDED.status,
  score_snapshot_id = EXCLUDED.score_snapshot_id,
  updated_at = now();

-- ============================================================
-- 27. NOTIFICACIONES DEMO
-- ============================================================

INSERT INTO faro.notifications (
  notification_id,
  company_id,
  user_id,
  related_entity_type,
  related_entity_id,
  channel,
  notification_type,
  title,
  body,
  status,
  payload,
  scheduled_at,
  sent_at
)
VALUES
  (
    '27000000-0000-0000-0000-000000000001',
    '10000000-0000-0000-0000-000000000001',
    '12000000-0000-0000-0000-000000000003',
    'tension',
    '22000000-0000-0000-0000-000000000001',
    'email',
    'critical_tension',
    'Tensión crítica: crecimiento no rentable',
    'Ventas crecen, pero margen cae y descuentos suben. Revisar política comercial.',
    'pending',
    '{"demo": true, "tension_code": "TNS-001"}'::jsonb,
    now(),
    NULL
  ),
  (
    '27000000-0000-0000-0000-000000000002',
    '10000000-0000-0000-0000-000000000001',
    '12000000-0000-0000-0000-000000000004',
    'action',
    '23000000-0000-0000-0000-000000000003',
    'email',
    'action_due',
    'Acción prioritaria: cobranza cliente en mora',
    'Gestionar cobranza de cliente crítico y cargar evidencia.',
    'pending',
    '{"demo": true, "action_code": "ACT-003"}'::jsonb,
    now(),
    NULL
  ),
  (
    '27000000-0000-0000-0000-000000000003',
    '10000000-0000-0000-0000-000000000001',
    '12000000-0000-0000-0000-000000000005',
    'tension',
    '22000000-0000-0000-0000-000000000003',
    'email',
    'stock_alert',
    'Alerta: stock crítico en productos clave',
    'Cemento, hierro y termofusión requieren revisión de reposición.',
    'pending',
    '{"demo": true, "tension_code": "TNS-003"}'::jsonb,
    now(),
    NULL
  )
ON CONFLICT DO NOTHING;

-- ============================================================
-- 28. AUDITORÍA DEMO
-- ============================================================

INSERT INTO audit.audit_log (
  company_id,
  actor_user_id,
  entity_name,
  entity_id,
  action,
  before_data,
  after_data,
  metadata
)
VALUES
  (
    '10000000-0000-0000-0000-000000000001',
    '12000000-0000-0000-0000-000000000001',
    'seed_demo',
    '10000000-0000-0000-0000-000000000001',
    'insert',
    NULL,
    '{"seed": "FARO-SQL-003", "version": "v1.0"}'::jsonb,
    '{"demo": true, "note": "Seed Empresa Demo ejecutado"}'::jsonb
  )
ON CONFLICT DO NOTHING;

COMMIT;
```

---

# 8. Queries de validación rápida

Después de correr el seed, validar:

```sql id="validate_company"
SELECT company_code, display_name, status
FROM faro.companies
WHERE company_code = 'EMP_DEMO_CUYO';
```

```sql id="validate_sources"
SELECT source_code, name, source_type, quality_score, status
FROM faro.data_sources
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY source_code;
```

```sql id="validate_kpis"
SELECT kpi_code, value, reference_value, delta_pct, status, confidence_score
FROM faro.kpi_snapshots
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY kpi_code;
```

```sql id="validate_tensions"
SELECT tension_code, title, severity, priority_score, status, score_impact
FROM faro.tensions
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY priority_score DESC;
```

```sql id="validate_actions"
SELECT action_code, title, status, priority, due_date
FROM faro.actions
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY due_date;
```

```sql id="validate_score"
SELECT score_value, previous_score_value, delta_value, score_status, explanation
FROM faro.score_snapshots
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY period_end DESC;
```

---

# 9. Queries para mostrar demo

## 9.1 Bandeja de tensiones

```sql id="demo_tension_inbox"
SELECT
  tension_code,
  title,
  severity,
  priority_score,
  confidence_score,
  status,
  score_impact
FROM faro.tensions
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY priority_score DESC;
```

## 9.2 Acciones por responsable

```sql id="demo_actions_by_owner"
SELECT
  a.action_code,
  a.title,
  a.status,
  a.priority,
  a.due_date,
  u.full_name AS responsible
FROM faro.actions a
LEFT JOIN faro.users u
  ON u.user_id = a.responsible_user_id
WHERE a.company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY a.due_date ASC;
```

## 9.3 Score y componentes

```sql id="demo_score"
SELECT
  score_value,
  previous_score_value,
  delta_value,
  score_status,
  confidence_score,
  components,
  explanation
FROM faro.score_snapshots
WHERE company_id = '10000000-0000-0000-0000-000000000001'
ORDER BY period_end DESC
LIMIT 1;
```

## 9.4 Caso crecimiento no rentable

```sql id="demo_growth_not_profitable"
SELECT
  t.tension_code,
  t.title,
  t.description,
  t.severity,
  t.priority_score,
  a.action_code,
  a.title AS action_title,
  a.status AS action_status,
  a.due_date
FROM faro.tensions t
LEFT JOIN faro.actions a
  ON a.tension_id = t.tension_id
WHERE t.company_id = '10000000-0000-0000-0000-000000000001'
  AND t.tension_code = 'TNS-001'
ORDER BY a.due_date;
```

---

# 10. Resultado esperado de demo

Al consultar tensiones, debería verse:

| Código  | Tensión                                     | Severidad | Estado       |
| ------- | ------------------------------------------- | --------- | ------------ |
| TNS-001 | Crecimiento no rentable                     | critical  | in_analysis  |
| TNS-002 | Venta sin conversión a caja                 | high      | in_execution |
| TNS-003 | Stock crítico en productos de alta rotación | high      | new          |
| TNS-004 | Stock inmovilizado relevante                | medium    | new          |
| TNS-005 | Acciones sin cierre ni evidencia            | high      | in_execution |

Al consultar Score:

```text id="yx3jd5"
Score anterior: 74
Score actual: 66
Delta: -8
Estado: warning
```

Lectura ejecutiva:

```text id="ihxfyz"
La empresa vende más, pero está sacrificando margen, financiando clientes y acumulando tensión operativa en stock y ejecución.
```

Ese es el corazón de la demo. No es “mirá qué lindo gráfico”. Es “mirá cómo el sistema encuentra el problema y lo baja a acción”.

---

# 11. Criterios de aceptación

FARO-SQL-003 se considera aceptado si:

| Criterio                             | Estado esperado |
| ------------------------------------ | --------------- |
| Empresa demo creada                  | Sí              |
| Sucursales creadas                   | Sí              |
| Áreas creadas                        | Sí              |
| Usuarios creados                     | Sí              |
| Roles asignados                      | Sí              |
| Fuentes demo creadas                 | Sí              |
| Productos creados                    | Sí              |
| Clientes creados                     | Sí              |
| Empleados/vendedores creados         | Sí              |
| Ventas cargadas                      | Sí              |
| Stock cargado                        | Sí              |
| Cobranzas cargadas                   | Sí              |
| KPIs cargados                        | Sí              |
| Señales generadas                    | Sí              |
| Reglas demo cargadas                 | Sí              |
| Tensiones generadas                  | Sí              |
| Acciones asignadas                   | Sí              |
| Evidencias cargadas                  | Sí              |
| Score cargado                        | Sí              |
| Reporte semanal cargado              | Sí              |
| Demo crecimiento no rentable visible | Sí              |

---

# 12. Qué NO resuelve este seed

| Elemento                        | Motivo                                 | Próximo activo                |
| ------------------------------- | -------------------------------------- | ----------------------------- |
| Dataset completo 6 meses        | Este seed es mínimo demo               | FARO-DEMO-001                 |
| Cálculo real automático de KPIs | Aquí se cargan snapshots               | FARO-ENG-003 / FARO-TEST-001  |
| Parser YAML real                | Aquí se cargan reglas JSON demo        | FARO-ENG-002                  |
| Motor evaluador real            | Aquí se cargan evaluaciones prearmadas | FARO-ENG-003                  |
| UI real                         | Solo deja datos para verla             | FARO-UI-001                   |
| Reporte PDF generado            | Solo registra metadata                 | FARO-TPL-002                  |
| Validación CI                   | Requiere tests                         | FARO-TEST-001 / FARO-TEST-002 |

---

# 13. Próximo paso recomendado

Después de FARO-SQL-003 corresponde construir:

## FARO-CFG-001 · Reglas MVP en YAML

Objetivo:

Convertir las tensiones MVP en reglas declarativas, legibles y ejecutables:

```yaml id="1bweyn"
rule_code: RULE-TNS-001
tension_code: TNS-001
name: Crecimiento no rentable
conditions:
  all:
    - kpi: KPI-SAL-001
      delta_pct: ">= 0.10"
    - kpi: KPI-SAL-002
      delta_pct: "<= -0.10"
    - kpi: KPI-SAL-003
      delta_pct: ">= 0.30"
action:
  create_tension: true
  severity: critical
  assign_to_role: commercial_manager
```

Sin FARO-CFG-001, las reglas existen como idea o seed, pero todavía no son configurables como producto.
