45 lines
1.9 KiB
Markdown
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.
|