# Fibromuebles WhatsApp Agent

Richard atiende WhatsApp, entiende pedidos de muebles a medida y pedidos de cortes sueltos/listas de corte, deduce cortes cuando corresponde y deja presupuestos internos listos para Edelmar como nota privada en Chatwoot.

Regla operativa: Richard no muestra precios al cliente. Los cálculos son internos.

## Capas del Sistema

```text
WhatsApp / Chatwoot
      |
      v
n8n webhook
      |
      v
Richard - AI Agent
      |
      +-- manual de armado
      +-- lógica de calculadora index_lab
      +-- reglas comerciales
      |
      +-- get_logica
      +-- get_prices
      +-- calculate_budget
      +-- prepare_budget_for_edelmar
```

## Archivos Clave

| Archivo | Uso |
|---|---|
| `manual/MANUAL_FIBROMUEBLES.md` | Manual de armado: cómo deducir cortes por tipo de mueble |
| `manual/LOGICA_CALCULADORA_INDEX_LAB.md` | Contrato de tags/formato/cálculo basado en `index_lab` |
| `business-context/fibromuebles.md` | Reglas comerciales, plazos, scoring y escalamiento |
| `workflows/system-prompt-richard.md` | Prompt operativo para el AI Agent Node |
| `workflows/code-nodes/tool-calculate-budget.js` | Motor de cálculo compatible con `calculadora/index_lab.html` |
| `workflows/code-nodes/tool-get-prices.js` | Normalizador de precios/PocketBase con estructura de `index_lab` |
| `workflows/code-nodes/tool-prepare-budget-for-edelmar.js` | Preparación de nota privada para Chatwoot |

## Fuente de Verdad de Cálculo

La fuente ejecutable vigente es:

- `projects/fibromuebles/calculadora/index_lab.html`
- `projects/fibromuebles/calculadora/logica.html`

El repo del agente no debe inventar fórmulas separadas. Debe replicar el contrato de `index_lab` en los code-nodes de n8n.

## Flujo de Presupuesto

1. Richard identifica el mueble.
2. Pide una sola medida o dato faltante por mensaje.
3. Con datos suficientes, deduce cortes usando el manual de armado.
4. Convierte medidas a milímetros.
5. Genera bloque importable para Calculadora/Odoo.
6. Llama a `get_logica`.
7. Llama a `calculate_budget` por pieza o grupo de piezas iguales.
8. Suma subtotales.
9. Llama a `prepare_budget_for_edelmar`.
10. Responde al cliente sin números.

Respuesta pública esperada:

```text
Dale, ya le dejé todo a Edelmar para que te pase el valor final por acá.
```

## Reglas de Precio

- No dar precio exacto.
- No dar rango.
- No dar valor por metro cuadrado.
- No calcular de memoria.
- No usar `#Corte` para piezas vendidas de muebles.
- El total interno siempre lleva `pricing_visibility: private_only`.

## Contrato de Tags

- `#Mueble`: piezas de muebles, con coeficiente MDF/blanco/color.
- `#Corte`: cortes sueltos/listas de corte. No usar para piezas de mueble armado.
- `#Pino`: perfiles por metro lineal.
- `#Cajón`: cajón completo, descompuesto en 4 cortes + mano de obra.
- `#Placas`, `#Calado`, `#Círculo`, `#Herraje`, `#Adicional`: casos especiales.

Tags legacy (`#Medida-MDF`, `#Medida-Blanco`, `#Medida-Color`, `#Estándar`) migran a `#Mueble`.

## Verificación Mínima

Después de cambiar prompt/manual/tools:

1. Ejecutar fixtures de `calculate_budget` contra `index_lab`.
2. Buscar contradicciones: salidas públicas con números o cálculo fuera de tools.
3. Probar una conversación sin medidas: Richard debe pedir un dato.
4. Probar un pedido completo: debe crear nota privada con bloque de cortes y total interno.
5. Confirmar que Chatwoot recibe nota privada, no mensaje público con precio.

## Producción n8n

Los workflows productivos pueden estar modificados directamente en n8n. Antes de tocar producción:

1. Exportar o respaldar workflows.
2. Cambiar code-nodes de forma acotada.
3. Probar ejecución manual o sandbox.
4. Confirmar que `prepare_budget_for_edelmar` usa nota privada.

No guardar secretos reales en este repo.

