RF-005 — Flete calculado por caja, ciudad y categoría¶
| Estado | En desarrollo (rama hquintero) |
| Tipo | Fulfillment provider propio + ruta API de cobertura |
| Ubicación | src/modules/mc-fulfillment/ · identificador mc-group · src/api/store/geozones/ |
| Depende de | Módulo Fulfillment de Medusa — RF-000 · configuración — RF-006 |
| Ver también | Fulfillment MC Group · Selección de ciudades en el checkout |
Requisito¶
Calcular el costo de envío en función de la ciudad de destino, del volumen de la mercadería y de las categorías de producto con tarifa propia, en lugar de aplicar una tarifa plana; ofrecer la opción de envío únicamente en las ciudades donde el transportista opera; y publicar la cobertura y el plazo de entrega por ciudad para su consulta desde el checkout.
Solución adoptada¶
Implementar un fulfillment provider con precio calculado (canCalculate), que resuelve la tarifa
en el momento en que el cliente ingresa su dirección. La configuración —tipos de caja, precios y
categorías especiales— se persiste en la metadata de entidades nativas de Medusa
(FulfillmentSet, ShippingOption, GeoZone), sin tablas propias.
flowchart TD
A[Dirección de envío] --> B[Resolver GeoZone por nombre de ciudad]
B --> C{mc_available}
C -->|no| D[No ofrecer la opción de envío]
C -->|sí| E[Localizar ShippingOption de mc-group en la ServiceZone]
E --> F[Cargar box_types del FulfillmentSet]
F --> G[Separar ítems especiales y normales]
G --> H[Ítems especiales:<br/>precio de categoría × cantidad]
G --> I[Ítems normales:<br/>producto de mayor volumen]
I --> J[Caja más chica en la que entra<br/>fallback: caja por defecto]
H --> K[Total del flete]
J --> K
Modelo de configuración¶
| Dato | Dónde se persiste | Contenido |
|---|---|---|
| Tipos de caja | FulfillmentSet.metadata.box_types |
Código, nombre, largo, ancho, alto, peso máximo, orden y marca de caja por defecto |
| Precio por caja | ShippingOption.metadata.prices |
Importe en guaraníes por código de caja |
| Categorías con tarifa propia | ShippingOption.metadata.special_categories |
Categoría de producto e importe unitario |
| Cobertura y plazo | GeoZone.metadata |
Disponibilidad y horas de entrega por transportista: mc, clx, aex |
Reglas de cálculo¶
- Resolver la geozona por coincidencia de nombre de ciudad sin distinguir mayúsculas, sobre las
geozonas de tipo
city. - Descartar la opción de envío cuando la geozona no tiene habilitado el transportista.
- Clasificar como especial todo ítem cuya categoría tenga precio propio configurado, y cobrarlo por cantidad.
- Cobrar los ítems normales por una sola caja: la más chica cuyas tres dimensiones y peso máximo admitan al producto de mayor volumen del carrito.
- Considerar únicamente las cajas con precio configurado, ordenadas por volumen ascendente, y comparar dimensiones ordenadas de mayor a menor.
- Convertir las unidades de Medusa antes de comparar: milímetros a centímetros y gramos a kilogramos.
- Aplicar la caja marcada por defecto cuando el producto no entra en ninguna caja regular o carece de dimensiones cargadas.
- Sumar el precio de la caja y el de los ítems especiales para obtener el total del flete.
Cobertura publicada¶
GET /store/geozones devuelve los 18 departamentos de Paraguay (ISO 3166-2:PY) y el listado de
ciudades con su cobertura y plazo por transportista, ordenado alfabéticamente. Alimenta el
selector de ciudad del checkout y la promesa de entrega mostrada al cliente.
Criterios de aceptación¶
| # | Criterio |
|---|---|
| 1 | Devolver un costo de envío distinto para dos carritos de distinto volumen hacia la misma ciudad |
| 2 | No ofrecer la opción de envío en una ciudad sin cobertura del transportista |
| 3 | Cobrar la tarifa de categoría por unidad en los ítems especiales, sumada a la caja de los normales |
| 4 | Aplicar la caja por defecto ante un producto sin dimensiones o mayor que toda caja regular |
| 5 | Reflejar en el checkout un cambio de precio de caja realizado en el dashboard, sin desplegar código |
| 6 | Listar departamentos y ciudades con su plazo de entrega desde /store/geozones |
Limitaciones conocidas¶
- Cotizar por el producto de mayor volumen y no por el conjunto: dos unidades del mismo producto cotizan igual que una.
- Resolver la ciudad por texto y no por código: una discrepancia de nombre entre la dirección y la geozona deja el envío sin cobertura.
- Contemplar tres transportistas en la metadata de geozona, pero calcular tarifa únicamente para
mc-group; CLX y AEX solo publican disponibilidad y plazo.