# Lógica de Calculadora - index_lab

Este archivo resume el contrato que Richard debe respetar al calcular. La fuente ejecutable sigue siendo `calculadora/index_lab.html`; esta guía existe para que los agentes no mezclen lógica de cálculo con manual de armado o reglas comerciales.

## Estructura de Datos

`get_prices` y `get_logica` deben devolver:

```json
{
  "precios": {},
  "dimensiones": {},
  "herrajes": {},
  "tapacantos": {},
  "coeficientes": {}
}
```

`herrajes` usa:

```json
{
  "telescopica": { "costo": 18000, "coef": 1.3 }
}
```

`tapacantos` usa:

```json
{
  "abs-encolado": { "nombre": "ABS encolado", "costo": 350, "coef": 1.5 }
}
```

Precio final unitario = `costo * coef`. Presupuesto completo = suma de lineas + `PRECIO_FIJO_MARKUP`.

## Tags Vigentes

- `#Mueble`: pieza de mueble vendida internamente. Usa coeficiente por material.
- `#Corte`: cortes sueltos/lista de corte. No usar para piezas de mueble armado.
- `#Pino`: perfil de pino por metro lineal.
- `#Cajón`: cajón completo, se descompone en cortes + mano de obra.
- `#Placas`: emplacados.
- `#Calado`: calado lineal.
- `#Círculo`: calado circular.
- `#Herraje`: herraje por unidad.
- `#Adicional`: monto fijo interno, no se multiplica por coeficiente general.
- `#Sobrante`: material sobrante.

Tags legacy migran a `#Mueble`:

- `#Estándar`
- `#Medida-MDF`
- `#Medida-Blanco`
- `#Medida-Color`

## Material y Coeficiente

`#Mueble` decide coeficiente por código de material:

- Termina en `b`: blanco.
- Termina en `c`: color.
- Empieza con `p`: pino.
- Resto: MDF.

Coeficientes por defecto:

```json
{
  "#Mueble": { "mdf": 2.6, "blanco": 2.8, "color": 3.3 },
  "#Corte": 1.6,
  "#Pino": 2.1,
  "#Sobrante": 1,
  "PRECIO_FIJO_MARKUP": 5000
}
```

Regla de total de presupuesto:

```text
TOTAL = suma de todas las lineas calculadas + PRECIO_FIJO_MARKUP
PRECIO_FIJO_MARKUP = 5000
```

## Formato Importable

Estructura general:

```text
#Tag | datos \ observación opcional
```

Piezas estándar:

```text
#Mueble | cant de A x B en MAT [canto] (pint) // Nota opcional
#Corte | cant de A x B en MAT [canto] (pint) // Nota opcional
```

Las medidas del bloque importable van separadas con espacios alrededor de `x`: `600 x 300`.
El parser interno acepta `600x300` como tolerancia, pero Richard debe generar siempre `600 x 300`.
La nota opcional después de `//` describe la pieza y también es válida para Calculadora/Odoo: `// Lateral`, `// Estante`, `// Fondo`.

- A y B van en milímetros.
- `canto`: `x` = lado A, `y` = lado B, `xy` = ambos.
- `pint`: `(1)` o `(2)` para caras pintadas.

Pino:

```text
#Pino | cant de LARGOmm en MAT
```

Herraje:

```text
#Herraje | cant de TIPO
```

Cajón:

```text
#Cajón | cant de A x B x C Cajones [lat,frenteInt,frenteVis:canto,fondo] // Nota opcional
```

Defaults de cajón:

```text
[18,18,18b,3]
```

Ejemplo con frente visible con canto:

```text
#Cajón | 3 de 300 x 400 x 150 Cajones [18,18,18b:x,3]
```

Placas:

```text
#Placas | cant de A x B x C Emplacados
```

Calados:

```text
#Calado | cant de Amm Calado Lineal
#Círculo | cant de ØAmm Calado Circular
```

Adicional:

```text
#Adicional | monto \ descripción
```

## Regla de Tapacanto

El tipo de tapacanto se aplica por bloque o llamada del tool, no por línea textual. Default: `abs-encolado`.

El costo se calcula con:

```text
metros_lineales * tapacantos[tipo].costo * tapacantos[tipo].coef
```

## Fórmulas de Alto Nivel

No calcular a mano en conversación. Estas reglas sólo sirven para verificar el tool.

`#Mueble`, `#Corte`, `#Sobrante`:

```text
superficie = (a_mm / 1000) * (b_mm / 1000) * cantidad
costoMat = superficie * PRECIOS[material]
tapacanto = ml_canto * precioFinalTapacanto
trozado = cantidad * ((a + b) * 2) * ((COEF_TROZADO / 10) + espesor * COEF_CORTE_LINEAL)
total_raw = costoMat * coefEfectivo + tapacanto + pintura + trozado
total = total_raw * COEF_GENERAL
```

`#Cajón`:

- 2 laterales: B x C.
- 2 frente interior: A x C.
- 1 frente visible: A x C.
- 1 fondo: A x B.
- Mano de obra: `cantidad * (MO_CAJON_FIJO + volumen_m3 * MO_CAJON_VOL)`.

`#Adicional`:

```text
total = monto
```

No se multiplica por `COEF_GENERAL`.

## Salida de Agente

El bloque importable y el total interno van sólo en nota privada de Chatwoot para Edelmar.

Respuesta pública esperada:

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