1.9 KiB
1.9 KiB
Arquitectura — SHIPPING-ZONES
Problema detectado
El sistema actual de envíos solo soporta zonas por country + postal_code_prefix y tiene dos limitaciones:
- Una zona genérica de España con
postal_code_prefix = nulltambién matchea Baleares/Canarias. - El endpoint público
/shipping/methodsdevuelve métodos de todas las zonas compatibles en vez de resolver la mejor zona como sí haceShippingService.calculate(). - 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,52si 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.