Skip to content

[EPIC] Extraer la gestión de almacén a un paquete reutilizable (@globalemergency/warehouse-core) #355

Description

@vgpastor

Objetivo

Extraer la gestión de almacén de ResponseGrid a un producto open-source independiente — un WMS genérico (pensado para almacenes de Protección Civil, pero válido para cualquier sector) — y hacer que ResponseGrid lo reutilice como librería interna, en lugar de mantener la misma lógica dos veces.

Son dos software totalmente separados (distinta BD, servidor, auth y organizaciones; sin datos compartidos). El único punto de unión es código reutilizado vía paquetes.


🧭 Estado actual y próximos pasos (handoff para agentes)

Hecho: Fase 1 ✅ · Fase 2 ✅ (núcleo de dominio del WMS nuevo, dominio puro) · Fase 0 ✅ (taxonomía data-driven #380 + migración de consumidores a slug #382/#395) · Fase 0.5 persistencia ✅ (warehouse-postgres, schema wms. + repos + consumidor de validación, #383/#392).

Fase 3 (app de referencia standalone) se desarrolla directamente en OTRO repositorio, fuera de este monorepo — no se implementa aquí ni se trackea en esta épica.

Próximos pasos (issues abiertas, claimables):

Orden sugerido: #385#386.

Convenciones para continuar (importante):

  • Cada incremento = rama nueva desde main (git fetch origin main && git checkout -B origin/main), PR con Closes #NN, squash + auto-merge en verde. Reclamar la issue (in-progress) antes de empezar (protocolo en AGENTS.md).
  • @globalemergency/warehouse-core es dominio puro: ESLint no-restricted-imports prohíbe @nestjs/*, drizzle-orm, pg y apps/*. Tenencia opaca vía ScopeId.
  • Tests del paquete: se co-ubican como src/**/*.test.ts, compilan con tsc -p tsconfig.test.json a dist-test/ (git-ignored) y corren con node --test — porque el type-stripping puro no soporta enum/parameter-properties. Los gatea el step CI «Run tests — warehouse-core» (pnpm --filter '@globalemergency/warehouse-core' test). .prettierrc propio del paquete (comillas simples). Los int-tests de warehouse-postgres necesitan Postgres → job Test con servicio.
  • Al genericizar consumidores del host: frontera 1:1 (API y columna DB sin cambios; el adapter traduce), como se hizo con ScopeId/emergency_id en feat(warehouse-core): extrae containers (Container) al paquete usando ScopeId #366/Extraer el módulo logistics (TransportCapacity + Shipment) a @globalemergency/warehouse-core #367.

Decisiones ya cerradas

  • Qué viaja en el paquete: dominio + persistencia + migraciones, en capas → @globalemergency/warehouse-core (puro) + @globalemergency/warehouse-postgres (Drizzle) + @globalemergency/warehouse-nest (glue DI, opcional). Sin HTTP ni auth (los pone cada host).
  • Granularidad: un solo warehouse-core con módulos internos (kernel/catalog/inventory/containers/logistics) vía subpath exports.
  • Auth/permisos: fuera del paquete (cada host). En el paquete solo ports de autorización + actorId opaco.
  • Tenencia: el core opera contra un ScopeId opaco (WMS → Organización/Prote; ResponseGrid → Emergencia/Centro).
  • Consumo: entidades reales del paquete (cero copia); el vertical compone (referencia por id).
  • Scope de paquete: @globalemergency/*. Topología final: polyrepo; paso 1 = in-monorepo (workspace:*).

Estado de partida (extraer vs construir)

Lo existente cubre ~40%. Se construye (~60%): Warehouse/Zone/Bin, StockItem, StockMovement (kardex), salidas/consumo, FEFO/caducidad activa, UoM + decimales, min/max, recuentos, concurrencia optimista, idempotencia.

Issues hijas

✅ Entregado

🔜 Abierto (claimable)

Fase 0 — Genericización in-situ

Fase 0.5 — Paquete precursor in-monorepo

Fase 1 — Mover lo puro extraíble al paquete

Fase 2 — Construir el núcleo WMS nuevo (en el paquete)

Núcleo de dominio del WMS completo (dominio puro): ubicaciones + existencia + kardex + FEFO + recuentos (#388) + reservas (#390) + caducidad (#393), con persistencia Postgres (#383). Queda min/max (reorder) (en pausa: se está pensando algo más grande) y el recuento a nivel de bin como refinamiento futuro; lo esencial está.

Fase 3 — App de referencia standalonefuera de este repo

  • WMS OSS desplegable con auth propia. Se desarrolla directamente en otro repositorio (fuera de este monorepo); no se trackea aquí.

Fase 4 — Extracción a repo OSS#386

Transversales (decisiones abiertas)#385

  • Nombre de producto (marca) · [ ] Licencia OSS · [ ] Alcance mínimo v1 · [ ] Integración desacoplada salida↔donación (futura)

Definición de Done

Criterios base: cada sub-issue con gate CI verde y PR con Closes #NN.

Criterios específicos:


Esta épica es el punto de entrada; el detalle técnico de cada pieza va en su sub-issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1area:dataIngesta, taxonomia y datos de recursosepic

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions