Reporte ciudadano de validez de puntos — EPIC #120 (plan + backend + API + web)#119
Merged
Conversation
Ficha 15: un usuario autenticado puede reportar un punto de acopio como cerrado, inexistente, mudado o desactualizado. Tras N reportes de usuarios distintos el punto se marca "dudoso" (sigue visible) y un coordinador confirma el cierre o lo descarta. Concepto propio en el contexto resources (entidad ResourceValidityReport + flag `disputed` en Resource), con API, modelo de datos Drizzle, plan de frontend (Atomic Design) y decisiones abiertas. Incluye la entrada en el indice del backlog.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Convierte §8 (decisiones abiertas) en decisiones resueltas: concepto propio en resources, umbral N=3, fotos solo coordinación, sin TTL en MVP, excluir al dueño del recuento, texto de badge "En verificación · posible cierre" y sin cooldown en el MVP.
Open
11 tasks
5 tasks
) Un usuario autenticado puede reportar un punto como cerrado / ya no existe / mudado / desactualizado; tras N=3 reportes de usuarios distintos el recurso pasa a `disputed` (sigue visible, con aviso). Coordinación resuelve en 3 vías: confirmar cierre, marcar inválido (rejected) o descartar. - Dominio: Resource.disputed/disputedAt + flagDisputed/clearDispute/markInvalid + eventos resource.disputed / resource.dispute_resolved; entidad ResourceValidityReport (+ enums ValidityReason/ValidityReportStatus). - Migración 0031: tabla resource_validity_reports (índice único parcial: un reporte abierto por usuario) + columnas disputed/disputed_at en resources. - Casos de uso: ReportResourceValidity (upsert + dedup + umbral, excluye al dueño), ResolveResourceDispute (devuelve MutationAuditResult para el activity trail), GetDisputedResources, GetResourceValidityReports. Repos (puerto/Drizzle/memoria) + wiring del módulo. - 23 tests nuevos; gate verde (build/lint/prettier/test). Parte de la EPIC #120. Ajustes de diseño en docs/features/15 §9.
…gen:api (#122) - Endpoints: POST /resources/:id/validity-reports (ciudadano autenticado), POST /resources/:id/dispute/resolve (coordinador; motivo obligatorio → audit trail vía setAuditContext), GET /resources/:id/validity-reports y GET /emergencies/:id/coordination/disputed (cola de coordinación). - `disputed`/`disputedAt` expuestos en los read models públicos (ResourceView + ResourceViewDto → aparece en list/in-bounds/nearby/detalle). - ReportResourceValidity pasa a ser resource-scoped (sin emergencyId en el comando; se deriva del recurso). - Errores de dominio nuevos mapeados en el filtro HTTP (403/409). - pnpm gen:api: openapi.json + packages/api-client/src/schema.ts regenerados (paths nuevos verificados). - e2e: reporte → dudoso (umbral 3) → resolver (cerrar/descartar), authz (dueño 403, sin token 401, no-coordinador 403) y públicos exponen disputed. Parte de la EPIC #120.
7 tasks
- DisputedBadge (variante 'disputed' en Badge) en la tarjeta de punto y la
ficha de detalle cuando el punto está en duda ("En verificación").
- CTA "¿Algo va mal? Avísanos" en la tarjeta (listados) y en la ficha → lleva
al formulario de reporte.
- Ruta /e/[slug]/recursos/[resourceId]/reportar-estado: formulario (motivo de
4 opciones, nota y fotos opcionales) con server action que llama a
POST /resources/:id/validity-reports; auth-gated (redirige a login?next=).
- i18n es/en (resource_card.disputed_label/report_cta + sección reportar_validez).
Parte de la EPIC #120 (#123). Pendiente del front: estilo de marcador/popup de
mapa para puntos en duda.
4 tasks
…, #123) - #124: pestaña "Puntos en duda" en coordinación + entrada en el hub con contador. Cola (DisputedQueue) con desglose por motivo, nº de reportantes y última fecha; acciones de resolución (confirmar cierre / marcar inválido / descartar) con motivo obligatorio → POST /resources/:id/dispute/resolve (queda en el audit trail). Server action resolveDispute. - #123: el mapa muestra "En verificación · posible cierre" en el popup de los puntos en duda (disputed enhebrado en MapPoint desde landing + in-bounds). - i18n es/en. Parte de la EPIC #120.
3 tasks
…untos (ficha 15) Revisión en profundidad de la disputa de puntos y del código colindante. Bugs: - La ingesta externa (re-import de acopiove) ya no resetea disputed/disputedAt ni deja reportes abiertos huérfanos: se preservan como campos local-owned. - flagDisputed() es idempotente (no duplica evento ni reinicia disputedAt). - La cola "Puntos en duda" filtra por visibilidad: un punto disputado que luego se cierra/oculta deja de aparecer aunque el flag persista. - Re-reportar cambiando solo el motivo ya no borra la nota/fotos previas (se reenvían solo cuando el cliente las aporta). - Primer reporte concurrente del mismo usuario: se captura la violación 23505 del índice parcial one_open_per_user y se pliega en un update (antes 500). - Antes de marcar disputed se re-lee el recurso para no emitir dos eventos resource.disputed si dos ciudadanos cruzan el umbral a la vez. Refactors: - DomainExceptionFilter: ternario anidado -> tabla error->status por instanceof. - ResolveResourceDispute: un unico switch (accion + targetStatus); guardado de reportes en paralelo. GetDisputedResources: lecturas por recurso en paralelo. - Predicado de visibilidad extraido a Resource.isPubliclyVisible(). - DTO byReason tipado como Record<string,number> en el cliente generado. - Web: la CTA "avisar de un problema" vive solo en la ficha, no en cada tarjeta de la lista; revalidatePath tras reportar; se quita aria-label redundante. Tests: idempotencia, preservacion de nota/fotos, exclusion de cerrados de la cola, doble resolucion, re-disputa tras descartar, diff de auditoria en dismiss, preservacion de disputed en re-ingesta, e int-spec del pliegue del 23505.
…hie-pocjs4 # Conflicts: # docs/features/00-indice.md
…nes de shipment + byReason)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Permite que un usuario autenticado reporte un punto de acopio como cerrado, ya no existe, mudado o desactualizado. Tras N = 3 reportes de usuarios distintos el punto se marca "dudoso" (sigue visible, con aviso) y un coordinador lo resuelve (confirmar cierre · marcar inválido · descartar).
Implementación completa de la EPIC #120.
Closes #121
Closes #122
Closes #123
Closes #124
Backend (#121)
Resource.disputed/disputedAt+flagDisputed/clearDispute/markInvalid+ eventos; entidadResourceValidityReport; migración0031(índice único parcial = un reporte abierto por usuario). Casos de uso con dedup, umbral y resolución de 3 vías (devuelveMutationAuditResult→ activity trail de #135).API (#122)
POST /resources/:id/validity-reports(ciudadano) ·POST /resources/:id/dispute/resolve(coordinador, motivo obligatorio) ·GET /resources/:id/validity-reports·GET /emergencies/:id/coordination/disputed.disputed/disputedAten los 4 read models públicos ·pnpm gen:api.Web ciudadano (#123)
DisputedBadge("En verificación") en tarjeta y ficha; aviso en el popup del mapa./recursos/[id]/reportar-estado(formulario auth-gated: 4 motivos · nota · fotos).Web coordinación (#124)
Gate
Verde de punta a punta: api build · lint · prettier · test (1066) · e2e (8) — web build · lint —
gen:api.Follow-ups opcionales (menores)
GET …/validity-reportsya existe).