Documento retroactivo. Sprint-1 cerró 2026-04-02 (Semana Santa, 2.5 días). Mauricio (QA Lead) se integró en mayo 2026; este handoff consolida lo entregado para validación dentro del lote consolidado sprints 0-3.
Acta formal ADR-003 GATE-D retroaplicada. Producido por Carlos Torres (Arquitecto) con apoyo de Vanessa Luna (Sr Backend / Gatekeeper Sprint-1).
Destinatario: Mauricio (QA Lead) — ejecutor de Fase 5.
Plantilla canónica base:
architecture/nebula-erp/QA_HANDOFF_TEMPLATE.mdv1.0.0.
| Campo | Valor |
|---|---|
| Sprint | Sprint-1 — Semana Santa (fechas: 2026-03-31 a 2026-04-02) |
| Duración | 2.5 días hábiles (Lun 31 Mar 10:00 – Mié 02 Abr 12:00) |
| Repos | nebula-accounting-core + nebula-models |
| Branch promovida | qa (consolidada con sprints 0/2/3) |
Commit SHA en qa |
<rellenar al cortar lote consolidado> |
| Tag candidato | v0.1.0-rc1 |
| Imagen Docker | 10.110.0.2:5000/nebula/business-domains/finance/nebula-accounting-core:v0.1.0-rc1 |
| Ambiente | nodo-02 QA |
| URL Swagger | https://nodo-02.nebula.centricasoluciones.com/swagger-ui/index.html |
| Fecha entrega QA (planificada) | 2026-05-19 (lote consolidado 0-3) |
| Fecha límite pruebas | A acordar con Mauricio — sprint-1 es sub-lote ligero (2 HTs, 14 endpoints), SLA propuesto 3 días hábiles |
| HT | Título | Estado | Folder | Implementador (R) | Gatekeeper (A) |
|---|---|---|---|---|---|
| HT_CON_005 | Estructura de Cuentas | Released v0.1.0 | sprint-1/htu/HT_CON_005_EstructuraCuentas/ |
Vanessa Luna (Sr) | Carlos Torres (Arq) — Vanessa no puede ser A de sí misma |
| HT_CON_008 | Conceptos y Tipos de Asiento | Released v0.1.0 | sprint-1/htu/HT_CON_008_ConceptosTipoAsiento/ |
Sebastian Saldarriaga (Mid) | Vanessa Luna (Sr/Gatekeeper) |
Total: 2 HTs, 14 endpoints REST nuevos.
HT_CON_005 — Estructura de Cuentas (4 alcances funcionales):
tieneEstructura.tipoPlanContable (solo lectura).bloqueado por nivel (deshabilita niveles con cuentas).HT_CON_008 — Conceptos y Tipos de Asiento (4 alcances):
bloqueado=true — Requiere cuentas reales del Plan PUC (CON_004 Sprint-2). Hasta entonces, STUB activo retorna findMaxNivel()=0 → todos editables.tieneAsientosAsociados=true — Requiere asientos contables transaccionales (HT_CON_012 Sprint-3). Hasta entonces, STUB activo retorna false.No hay endpoints sprint-0 modificados. Todos los listados son NUEVOS sin breaking changes.
| Método | Ruta | Tipo |
|---|---|---|
| GET | /api/v1/estructura-cuentas/read |
NUEVO |
| GET | /api/v1/estructura-cuentas/get?tipoPlanContableId=X |
NUEVO |
| GET | /api/v1/estructura-cuentas/get?tipoPlanContableId=X&modo=editar |
NUEVO |
| PUT | /api/v1/estructura-cuentas/update?tipoPlanContableId=X |
NUEVO (batch) |
| Método | Ruta | Tipo |
|---|---|---|
| GET | /api/v1/conceptos-contables/read |
NUEVO |
| POST | /api/v1/conceptos-contables/page |
NUEVO |
| GET | /api/v1/conceptos-contables/get?id=X |
NUEVO |
| GET | /api/v1/conceptos-contables/activos |
NUEVO |
| POST | /api/v1/conceptos-contables/create |
NUEVO |
| PUT | /api/v1/conceptos-contables/update?id=X |
NUEVO |
| DELETE | /api/v1/conceptos-contables/delete?id=X |
NUEVO |
| POST | /api/v1/tipos-asiento/create |
NUEVO |
| PUT | /api/v1/tipos-asiento/update?id=X |
NUEVO |
| DELETE | /api/v1/tipos-asiento/delete?id=X |
NUEVO |
Total: 14 endpoints nuevos. OpenAPI completo: sprint-1/htu/HT_CON_*/08_Contracts.md.
| Migración | HT | Tablas/Cambios |
|---|---|---|
V1.2.0__conceptos_contables.sql |
CON_008 | conceptos_contables (UK (codigo, client_id, company_id)) |
V1.2.1__tipos_asiento.sql |
CON_008 | tipos_asiento (FK lógica concepto_id, UK (codigo, concepto_id, client_id, company_id)) |
V1.1.6__estructura_niveles_plan.sql (pre-sprint, 15 min) |
CON_005 | estructura_niveles_plan (UK (tipo_plan_contable_id, nivel, client_id, company_id)) — DDL anticipado, anticipa CON_004 |
Patrón estándar: todas heredan 10 columnas de BusinessBaseEntity.
| Recurso | Origen |
|---|---|
| Tipos de Plan Contable (combo) | Sprint-0 V1.1.1 |
| Parámetros sistema | Sprint-0 V1.1.0 |
| Stub | Comportamiento | Resuelve en |
|---|---|---|
EstructuraCuentasComponent.findMaxNivel() → 0 |
Todos los niveles aparecen como bloqueado=false |
Sprint-2 con CON_004 |
TipoAsientoComponent.existsByTipoAsientoId() → false |
tieneAsientosAsociados siempre false |
Sprint-3 con HT_CON_012 |
Implicación QA: validaciones de bloqueo por movimientos (RN-05 CON_005, RN-04 CON_008) NO se pueden probar contra realidad en Sprint-1 individual. Si el lote QA consolidado incluye sprints 2-3, validar dichas reglas con datos de aquellos sprints.
sprint-1/data-fixtures/
├── staging_seed_sprint1.sql (3 TipoPlan + 2 estructuras pre-cargadas + 5 conceptos con 2 tipos c/u)
├── edge_cases_sprint1.sql (concepto con 10 tipos, estructura con 5 niveles, nombre 50 chars)
└── rollback.sql (revierte entre ciclos QA)
| Recurso | Valor |
|---|---|
| Tenant pruebas | tenant_qa_01 |
| Usuario QA Mauricio | mauricio.qa@centrica |
| Tenant aislamiento | tenant_qa_02 |
Selección curada desde 07_TestCases.md de cada HT.
GET /read lista solo TipoPlan con status=ACTIVE (RN-01).GET /get?tipoPlanContableId=X modo consulta → todos los niveles con bloqueado calculado.GET /get?...&modo=editar sin cuentas (stub) → todos los niveles bloqueado=false (RN-04, comportamiento STUB esperado).GET /get?...&modo=editar con cuentas reales (post-Sprint-2 al consolidar lote) → niveles ≤ nivel-máx-cuentas marcados bloqueado=true (RN-05).PUT /update con descripcionNivel vacío → HTTP 400 ESTRUCTURA_NOMBRE_REQUERIDO.PUT /update con descripcionNivel 51 chars → HTTP 400 ESTRUCTURA_NOMBRE_EXCEDE.PUT /update con longitudCodigo=11 → HTTP 400 ESTRUCTURA_LONGITUD_INVALIDA.PUT /update con dos niveles nivel=2 en el batch → HTTP 400 ESTRUCTURA_NIVEL_DUPLICADO.PUT /update batch correcto → HTTP 200, version incrementa, persistencia atómica.PUT /update intentando eliminar un nivel preexistente → HTTP 400 ESTRUCTURA_NIVEL_ELIMINADO (RN-08).GET /read columnas correctas (Código, Nombre, Estado, Cantidad Tipos) orden DESC created_at.POST /create concepto sin tipos → HTTP 200, concepto creado con tiposAsiento=[].POST /create concepto + 3 tipos atomícamente → HTTP 200; rollback si falla un tipo (validar con tipo con código duplicado en el batch).POST /create con código concepto duplicado activo → HTTP 409 CONCEPTO_CODIGO_DUPLICADO.POST /create con nombre concepto duplicado activo → HTTP 409 CONCEPTO_NOMBRE_DUPLICADO.DELETE /conceptos-contables/delete?id=X con concepto que tiene tipos activos → HTTP 409 CONCEPTO_CON_TIPOS.DELETE /tipos-asiento/delete?id=X con tipo asociado a asientos (post-Sprint-3) → HTTP 409 TIPO_CON_ASIENTOS (validar en lote consolidado).GET /get?id=X concepto con tipos → respuesta incluye array tiposAsiento[] con cantidadTipos correcto.POST /tipos-asiento/create con código duplicado dentro del concepto → HTTP 409 TIPO_CODIGO_DUPLICADO.GET /tipos-asiento enriquecimiento LightLoader: conceptoCodigo + conceptoNombre presentes sin N+1 queries (validar log SQL).tenant_qa_01 no visibles desde tenant_qa_02.EstructuraCuentas solo lista TipoPlan que existen en CON_003 (Sprint-0) → no permite estructurar TipoPlan inexistente.AuditLog.| Riesgo | Probabilidad | Impacto | Mitigación QA |
|---|---|---|---|
| Stubs activos enmascaran validaciones de bloqueo | Alta | Medio | Si lote QA es solo Sprint-1: documentar como deuda validar post-Sprint-2/3. Si lote consolidado: probar con datos sprint-2/3. |
| Rollback master-detail concepto+tipos | Media | Alto | Test CP-13 cubre — validar que si falla tipo 2 de 3, el concepto NO queda creado. |
Concurrencia en PUT /estructura-cuentas/update (dos sesiones edit + save) |
Baja | Medio | Test CONC-01: 2 sesiones Postman + delay coordinado — uno gana, otro HTTP 409 OptimisticLockException |
LightLoader N+1 queries en /conceptos/page con muchos registros |
Media | Bajo | Test PERF-LIGHT-S1: paginar 100 conceptos con tipos y validar ≤ 3 queries SQL |
| Edición concepto inmutable post-creación de tipos (regla a confirmar) | Baja | Bajo | Confirmar regla con PO antes de definir comportamiento esperado |
| i18n EN no probado | Baja | Bajo | Smoke Accept-Language: en en 3 endpoints clave |
Validación nivel secuencial obligatoria |
Media | Medio | Test CP-NIV-01: batch con niveles [1, 3] sin nivel 2 → ¿permitido? confirmar regla |
Nota: Sprint-1 no entregó Postman collection oficial. Generación incluida en ciclo QA consolidado mayo-junio 2026.
sprint-1/postman/ (a generar)
├── HT_CON_005_EstructuraCuentas.postman_collection.json (4 requests + CASOS críticos)
├── HT_CON_008_ConceptosTipoAsiento.postman_collection.json (10 requests + master-detail flow)
└── environments/
├── dev_local.postman_environment.json
└── nodo02_qa.postman_environment.json
Responsable propuesto: Brahian Cortes (Jr) — generar desde Swagger en día 1 ciclo QA.
| Flujo | Pasos | HT involucradas |
|---|---|---|
| F1: Estructura completa | Crear TipoPlan (CON_003 Sprint-0) → estructurar niveles (CON_005) → consultar resultado | CON_003 + CON_005 |
| F2: Concepto master-detail | Crear concepto + 3 tipos (CON_008) → editar 1 tipo → soft-delete concepto (debería fallar 409) → soft-delete los 3 tipos → soft-delete concepto OK | CON_008 |
| F3: Stub validation | Estructurar niveles + intentar editar nivel "bloqueado" (no aplica hasta sprint-2 con cuentas) | CON_005 — validar stub |
[HT-CON-XXX] <descripción corta>.nebula-accounting-core.bug, qa, sprint-1, severity-*.POLITICA_REGRESION_QA.md):
critical (bloqueante) — fix SLA 48h.high — fix SLA 72h.medium — fix SLA 5 días.low — deuda aceptada.docker logs nebula-accounting-core --tail 200 + screenshot Swagger.bugfix/HT-CON-XXX-fix-qa.Bug fiscal/contable: escalar a Carlos (Arquitecto).
critical.high./conceptos/page (≤ 3 queries por página de 100).nebula-accounting-core sin errores no esperados.Firma QA Lead (Mauricio): _________________ Fecha: ____________
Firma Arquitecto (Carlos) — cofirma GATE-F: _________________ Fecha: ____________
input Jenkins Deploy QA.QA_CLOSURE_SPRINT_1.md (GATE-F).v0.1.0.Released v0.1.0.| Métrica | Target | Capturada |
|---|---|---|
| Casos críticos verdes | 100% | _________ |
| Casos mayores verdes | ≥ 95% | _________ |
| Casos menores verdes | ≥ 80% | _________ |
| First-time-right HT_005 | ≥ 85% (batch + bloqueo) | _________ |
| First-time-right HT_008 | ≥ 85% (master-detail) | _________ |
| MTTF defectos critical | - | _________ |
| Ciclos retrabajo | ≤ 2 por HT | _________ |
| Días para cierre del lote | ≤ 3 hábiles (2 HTs) | _________ |
| Deuda | Resolución |
|---|---|
Stub findMaxNivel()=0 en CON_005 |
Resuelto en Sprint-2 con CON_004 |
Stub existsByTipoAsientoId()=false en CON_008 |
Resuelto en Sprint-3 con HT_CON_012 |
| Margen 5.6h Sprint-1 destinado correcciones Sprint-0 (longitudes CON_006/007) | Aplicado durante el sprint |
| Versión | Fecha | Autor | Descripción |
|---|---|---|---|
| 0.1 — DRAFT retroactivo | 2026-05-18 | Carlos Torres | Versión inicial retroaplicada al cierre Sprint-1 (2026-04-02). Mauricio QA Lead integrado mayo 2026. |
| 1.0 — Firmado | por firmar | Mauricio + Carlos | Versión firmada al cierre ciclo QA consolidado |
QA_HANDOFF.md — Sprint-1 — Centrica Nebula ERP — ADR-003 retroaplicado