# Arquitectura — SHIPPING-ZONES

## Problema detectado
El sistema actual de envíos solo soporta zonas por `country + postal_code_prefix` y tiene dos limitaciones:

1. Una zona genérica de España con `postal_code_prefix = null` también matchea Baleares/Canarias.
2. El endpoint público `/shipping/methods` devuelve métodos de todas las zonas compatibles en vez de resolver la **mejor zona** como sí hace `ShippingService.calculate()`.
3. El checkout frontend carga métodos sin contexto de `country/postalCode`, así que la UI puede enseñar opciones no válidas para la dirección real.

## Diseño propuesto

### 1) Extender zonas con exclusiones
Añadir a `shipping_zones` un campo:
- `excluded_postal_code_prefixes text[]`

Con esto una zona "España peninsular" puede excluir:
- `07` (Baleares)
- `35`, `38` (Canarias)
- opcionalmente `51`, `52` si se quiere mantener también fuera Ceuta/Melilla

### 2) Unificar matching de zona
Hacer que el listado público de métodos use la misma resolución de mejor zona que el cálculo de shipping:
- misma lógica de prefijo más específico
- respetando exclusiones
- evitando devolver simultáneamente métodos de la zona genérica y de una zona específica

### 3) Admin shipping UI
Actualizar admin shipping para editar el nuevo campo como CSV legible.

### 4) Frontend checkout
Actualizar la obtención de métodos de envío para que use `country` y `postalCode` reales del formulario/dirección seleccionada.

## Alcance
- Sí entra:
  - exclusiones por prefijo postal
  - mejor matching de zona en backend
  - checkout contextual por país/código postal
  - soporte admin para editar exclusiones
- No entra:
  - rediseño completo del motor de campañas/logística
  - nuevas tarifas complejas por operador

## Nota
Con este enfoque el sistema ya soporta zonas continentales por país y además permite que una zona genérica excluya archipiélagos/territorios especiales sin romper la arquitectura actual.
