feat(expeditions): bloqueo doble traza por stockitem_id (MVP) #5

Closed
opened 2026-03-03 18:22:27 +00:00 by leandro · 0 comments
Owner

Contexto

Ya se persiste stockitem_id en PhLSM_ExpeditionDetails.

FK e índices creados.

UI preserva StockItemId.

CreateFullExpeditionAsync persiste correctamente.

Issue #3 cerrada. Base de trazabilidad física lista.

Objetivo (MVP)
Implementar una validación en Core para impedir que un stockitem_id pueda asociarse a más de una Expedición activa.

Definición de “activa”

Activa = Status NOT IN (Cerrada, Anulada)
(equivalente a estados 1–4 en ExpeditionStatus actual).

Alcance / Enfoque

Validación se ejecuta antes de persistir (Core).

Se consulta a Data/Repository para detectar conflictos (sin modificar modelos EF scaffold).

Error de negocio debe devolverse como 400 con mensaje claro (ya hay manejo de InvalidOperationException).

Criterios de aceptación

Si intento crear una expedición con un stockitem_id ya asociado a una expedición activa → rechazar con error de negocio.

Si el stockitem_id existe solo en expediciones Cerrada o Anulada → permitir.

Si el request trae el mismo stockitem_id repetido en múltiples líneas → rechazar (validación intra-request).

No se modifican modelos EF de Models/ generados por scaffold.

Impacto por capas (plan abajo hacia arriba)

Data: agregar método en repo para detectar conflictos por stockitem_id en expediciones activas.

Domain: agregar DTO pequeño para reportar conflictos (stockitem_id, expedition_id/number, status).

Core: aplicar regla de negocio en CreateAndIssueAsync (o flujo equivalente).

API/UI: sin cambios funcionales esperados (solo propagar mensaje).

Notas / Riesgos

Este MVP no cubre condición de carrera concurrente (se resuelve más adelante con reservas/concurrencia).

**Contexto** Ya se persiste stockitem_id en PhLSM_ExpeditionDetails. FK e índices creados. UI preserva StockItemId. CreateFullExpeditionAsync persiste correctamente. Issue #3 cerrada. Base de trazabilidad física lista. **Objetivo (MVP)** Implementar una validación en Core para impedir que un stockitem_id pueda asociarse a más de una Expedición activa. **Definición de “activa”** Activa = Status NOT IN (Cerrada, Anulada) (equivalente a estados 1–4 en ExpeditionStatus actual). **Alcance / Enfoque** Validación se ejecuta antes de persistir (Core). Se consulta a Data/Repository para detectar conflictos (sin modificar modelos EF scaffold). Error de negocio debe devolverse como 400 con mensaje claro (ya hay manejo de InvalidOperationException). **Criterios de aceptación** Si intento crear una expedición con un stockitem_id ya asociado a una expedición activa → rechazar con error de negocio. Si el stockitem_id existe solo en expediciones Cerrada o Anulada → permitir. Si el request trae el mismo stockitem_id repetido en múltiples líneas → rechazar (validación intra-request). No se modifican modelos EF de Models/ generados por scaffold. **Impacto por capas (plan abajo hacia arriba)** Data: agregar método en repo para detectar conflictos por stockitem_id en expediciones activas. Domain: agregar DTO pequeño para reportar conflictos (stockitem_id, expedition_id/number, status). Core: aplicar regla de negocio en CreateAndIssueAsync (o flujo equivalente). API/UI: sin cambios funcionales esperados (solo propagar mensaje). **Notas / Riesgos** Este MVP no cubre condición de carrera concurrente (se resuelve más adelante con reservas/concurrencia).
leandro added this to the Expeditions milestone 2026-03-03 18:22:27 +00:00
leandro added the
STORY
label 2026-03-03 18:22:27 +00:00
leandro self-assigned this 2026-03-03 18:22:27 +00:00
leandro added this to the phronCare: Tablero DEV project 2026-03-03 18:22:27 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-12 03:08:42 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-15 14:28:56 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-16 22:47:27 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-16 22:47:29 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:36 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:37 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:39 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:40 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:42 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:45 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:47 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:49 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:51 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-23 03:07:52 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-24 20:24:05 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-24 20:24:07 +00:00
leandro moved this to Done in phronCare: Tablero DEV on 2026-03-25 13:27:46 +00:00
Sign in to join this conversation.
No Milestone Expeditions
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: leandro/phronCare#5
No description provided.