# Formato MT940 — Guía de Referencia

## ¿Qué es MT940?

MT940 es un mensaje SWIFT estándar para envío de extractos bancarios. Cada mensaje representa un estado de cuenta con saldo inicial, movimientos y saldo final.

## Estructura de un Mensaje

```
:20:REFERENCIA_TRANSACCION
:25:NUMERO_CUENTA
:28C:NUMERO_EXTRACTO/SECUENCIA
:60F:CSALDO_INICIALYYYMMDDCCCIMPORTE
:61:VDEDCIMPORTECTIPOREF//REFBANCO
:86:DETALLE_LIBRE
:62F:CSALDO_FINALYYMMDDCCCIMPORTE
:64:CSALDO_DISPONIBLEYYMMDDCCCIMPORTE
```

## Campos Requeridos

### `:20:` — Transaction Reference
Referencia única del mensaje. Máximo 16 caracteres.

```
:20:STMT20240115001
```

### `:25:` — Account Identification
Número de cuenta. Puede incluir prefijo BIC:

```
:25:ES9121000418450200051332
:25:BSCHESMMXXX/ES9121000418450200051332   ← con BIC (se limpia)
```

### `:28C:` — Statement Number
Número de extracto / número de secuencia:

```
:28C:00001/001
```

### `:60F:` / `:60M:` — Opening Balance
Saldo inicial. F = final del período anterior, M = intermedio.

Formato: `[C|D]YYMMDDCCCIMPORTE`
- `C` = Crédito (saldo positivo)
- `D` = Débito (saldo negativo)
- `YYMMDD` = Fecha (año de 2 dígitos: ≤30 → 20xx, >30 → 19xx)
- `CCC` = Código ISO de moneda (EUR, USD, etc.)
- `IMPORTE` = Importe con coma decimal (50000,00)

```
:60F:C240101EUR50000,00
```

### `:62F:` / `:62M:` — Closing Balance
Saldo final. Mismo formato que `:60F:`.

```
:62F:C240115EUR54249,50
```

## Campos Opcionales

### `:64:` — Available Balance
Saldo disponible. Mismo formato que `:60F:`.

```
:64:C240115EUR54249,50
```

### `:61:` — Statement Line (Transacción)
Una línea por cada movimiento. Formato:

```
VDEDCFC IMPORTE TIPO REF//REFBANCO
│││││└── Funds Code (opcional, ej: R para la tercera letra de moneda)
│││└──── C/D/RC/RD = Credit/Debit/Reversal Credit/Reversal Debit
││└───── Entry Date MMDD (opcional)
│└────── Value Date YYMMDD
```

Ejemplo:
```
:61:2401150115CR1500,00NTRFREF001//BANKREF001
         ││││ └── NTRF = tipo, REF001 = ref cliente, BANKREF001 = ref banco
         │││└──── C = Crédito
         ││└───── R = Funds code (tercera letra de EUR)
         │└────── Entry date: 01/15 (enero 15)
         └─────── Value date: 24/01/15 → 2024-01-15
```

**Tipos de transacción (TIPO, 4 chars):**
- `NTRF` = No-SWIFT transfer
- `NCHK` = No-SWIFT cheque
- `NDDT` = No-SWIFT direct debit
- `NSTO` = No-SWIFT standing order
- etc.

### `:86:` — Information to Account Owner
Texto libre con detalle de la transacción anterior `:61:`. Máximo 6 líneas de 65 caracteres.

```
:86:Transferencia recibida de ACME Corp - Factura 2024-001
```

## Indicadores Debit/Credit

| MT940 | camt.053 | Significado |
|---|---|---|
| `C` | `CRDT` | Crédito |
| `D` | `DBIT` | Débito |
| `RC` | `CRDT` | Reversal de Crédito |
| `RD` | `DBIT` | Reversal de Débito |

## Manejo de Fechas

- Año `YY` ≤ 30 → `20YY` (ej: `24` → `2024`)
- Año `YY` > 30 → `19YY` (ej: `99` → `1999`)
- Salida: ISO 8601 `YYYY-MM-DD`

## Manejo de Importes

- Separador decimal: coma (`,`) en MT940
- Convertido a punto (`.`) internamente → `float`
- En XML camt.053: formato `50000.00` (dos decimales)

## Ejemplo Completo

```
:20:STMT20240115001
:25:ES9121000418450200051332
:28C:00001/001
:60F:C240101EUR50000,00
:61:2401150115CR1500,00NTRFREF001//BANKREF001
:86:Transferencia recibida de ACME Corp - Factura 2024-001
:61:2401150115DR250,50NCHKREF002//BANKREF002
:86:Pago servicios hosting enero 2024
:61:2401160116CR3000,00NTRFREF003//BANKREF003
:86:Cobro cliente XYZ - Proyecto desarrollo
:62F:C240115EUR54249,50
:64:C240115EUR54249,50
```
