# Formatos de Entrada

La API detecta automáticamente el formato de entrada. No hay que indicarlo.

## Endpoint

```
POST /api/v1/facturas        → Formato detectado automáticamente
GET  /api/v1/formats         → Lista formatos soportados
```

---

## Formato: `native`

Formato propio de la API. Se detecta por la presencia del campo `factura`.

```json
{
  "tipo": "alta",
  "factura": {
    "emisor_nif": "A12345678",
    "emisor_nombre": "EMPRESA EJEMPLO SL",
    "num_serie": "2024-001",
    "fecha_expedicion": "13-09-2024",
    "tipo_factura": "F1",
    "descripcion": "Servicios de consultoría",
    "destinatario": {
      "nombre": "CLIENTE SL",
      "nif": "B98765432"
    },
    "iva": [
      {"base": 100.00, "cuota": 21.00, "tipo": 21.00}
    ],
    "importe_total": 121.00
  },
  "sistema": {
    "nombre": "Mi Software",
    "nif_proveedor": "A12345678",
    "version": "1.0.0"
  }
}
```

---

## Formato: `dolibarr`

Compatible con el formato que la web envía al BFF de Dolibarr. Los campos numéricos son `number` (no strings) y las fechas son ISO 8601. Se detecta por la presencia del campo `invoice`.

```json
{
  "invoice": {
    "number": "FA2024/001",
    "date": "2024-09-13T00:00:00Z",
    "notePublic": "Servicios de consultoría",
    "lines": [
      {"description": "Servicio A", "quantity": 1, "unitPrice": 60, "taxRate": 21},
      {"description": "Servicio B", "quantity": 2, "unitPrice": 40, "taxRate": 10}
    ]
  },
  "client": {
    "name": "CLIENTE SL",
    "vatNumber": "B98765432"
  },
  "emisor": {
    "nif": "A12345678",
    "nombre": "EMPRESA EJEMPLO SL"
  },
  "sistema": {
    "nombre": "Mi Software",
    "nif_proveedor": "A12345678",
    "version": "1.0.0"
  }
}
```

### Mapeo Dolibarr → VeriFactu

| Dolibarr | VeriFactu |
|---|---|
| `invoice.number` | `num_serie` |
| `invoice.date` | `fecha_expedicion` (ISO → dd-mm-yyyy) |
| `invoice.notePublic` | `descripcion` |
| `lines[].quantity × unitPrice` | calcula `base = total / (1 + rate/100)`, `cuota = total - base` |
| `lines[].taxRate` | agrupa por tipo → `iva[].tipo` |
| `client.name` | `destinatario.nombre` |
| `client.vatNumber` | `destinatario.nif` |
| suma de líneas | `importe_total` (calculado automáticamente) |
| `emisor.nif` | `emisor_nif` |
| `emisor.nombre` | `emisor_nombre` |

> Los totales (`totalHt`, `totalTax`, `total`) **no se envían** — se calculan a partir de las líneas. Esto evita inconsistencias y permite validar que los números cuadran.

---

## Añadir un nuevo formato

1. Crear carpeta `internal/formats/miformato/format.go`
2. Implementar la interfaz `formats.Transformer`:

```go
package miformato

import (
    "encoding/json"
    "VerifactuMidAPI/internal/formats"
)

func init() {
    formats.Register(&Transformer{})
}

type Transformer struct{}

func (t *Transformer) Name() string { return "miformato" }

func (t *Transformer) Transform(raw json.RawMessage) (*formats.TransformResult, error) {
    // Parsear JSON de entrada
    // Validar
    // Devolver TransformResult
}
```

3. Importar en `main.go`:

```go
import _ "VerifactuMidAPI/internal/formats/miformato"
```

La detección es automática: el primer formato que pueda parsear el JSON se usa.
