Skip to content

feat(logistics): matching capacidad<->traslado (backend #107)#134

Merged
vgpastor merged 2 commits into
mainfrom
feature/107-matching
Jun 28, 2026
Merged

feat(logistics): matching capacidad<->traslado (backend #107)#134
vgpastor merged 2 commits into
mainfrom
feature/107-matching

Conversation

@vgpastor

Copy link
Copy Markdown
Contributor

Backend de #107. Cierra el bucle logistico: dado un Shipment (#106) que necesita mover carga A->B, sugiere las TransportCapacity (#105) compatibles. Analogo logistico del matching oferta<->necesidad.

Caso de uso SuggestCapacitiesForShipment (solo capa de aplicacion; sin agregado ni migracion): filtra por emergencia + status=available, y cuando el Shipment lo declara, por mode / capacidad>=carga (por dimension) / solape de ventana (mismo helper que ListCapacities #105) / constraints (subconjunto). Coverage NUNCA excluye en duro: rankea (decision abierta del issue -> nodos/area + cercania, geometria de corredor diferida a cuando entren los hubs #108). Orden: tier (match exacto de resourceId > coords resolubles > area/sin coords), luego haversine ascendente (reusa haversineMeters del shared kernel, el mismo de /nearby), desempate por menor holgura de capacidad.

Endpoint GET /logistics/shipments/{id}/capacity-suggestions -> CapacityView[] rankeado, permiso shipment:read (consistente con asignar capacidad a una expedicion). Puerto minimo ResourceLocationLookup (resuelve resourceId->lat/lng contra la tabla resources, como el NeedLookup de offers). gen:api regenerado. TDD: 25 tests nuevos + int-spec. Gate verde: 994/994 tests.

Cierra el EPIC de backend logistico (#105 capacidad + #106 expedicion + #107 matching). Los frontends (form 'Ofrezco transporte', panel de expediciones + vista transportista, sugerencias en la expedicion) van en PRs aparte.

vgpastor added 2 commits June 28, 2026 17:58
…107)

Cierra el bucle logístico: dado un Shipment que mueve carga A→B, sugerir
las TransportCapacity (#105) compatibles y ordenadas.

- window-overlap: extrae el helper de solapamiento de ventana a un módulo
  puro compartido (capacityWindowOverlaps) y lo reutiliza el repo in-memory.
- capacity-match: filtro de compatibilidad (modo, capacidad≥carga por
  dimensión, ventana, restricciones) + ranking (nodo exacto > proximidad
  haversine > área/sin-coords, desempate por holgura). Reutiliza la
  haversine de shared/domain/geo-distance.
- shipment-match-criteria: deriva los criterios del Shipment (hoy abiertos:
  sin modo/carga/ventana/restricciones — no inventa datos).
- ResourceLocationLookup: puerto + adapter drizzle (lee resources) e
  in-memory, espejo del NeedLookup de offers para resolver coords del origen.
- SuggestCapacitiesForShipment: orquesta carga → filtro → ranking → CapacityView.

Cubierto por specs (TDD): 25 casos (matcher puro + caso de uso).
#107)

GET /logistics/shipments/{id}/capacity-suggestions → CapacityView[] ordenado.
Autz: coordinación (@RequirePermission('shipment:read')), mismo patrón que el
flujo de asignar capacidad. Reutiliza el mapper capacity-view (#105).

- ShipmentController: nueva ruta + inyección de SuggestCapacitiesForShipment.
- LogisticsModule: providers del caso de uso y del ResourceLocationLookup.
- int-spec del DrizzleResourceLocationLookup contra Postgres.
- gen:api: regenerado openapi.json y api-client/schema.ts (ruta presente).
- Formato prettier del matcher/caso de uso.
@vgpastor vgpastor enabled auto-merge (squash) June 28, 2026 16:08
@vercel

vercel Bot commented Jun 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
response-grid Ready Ready Preview, Comment Jun 28, 2026 4:08pm

Request Review

@vgpastor vgpastor merged commit 8e9c00f into main Jun 28, 2026
6 checks passed
@vgpastor vgpastor deleted the feature/107-matching branch June 28, 2026 16:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant