Files
mercadodevida/work/artifacts/SHIPPING-ZONES/architect.md

45 lines
1.9 KiB
Markdown

# 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.