Product Backlog: Historias de Usuario (#US) y Tareas Técnicas (#TK)
📋 Resumen de Estimación General
- Total Story Points (SP) Acumulados: 142 SP (Sprint 0: 5 SP | Sprint 1: 31 SP | Sprint 2: 106 SP)
- Modelo de Branching:
feature/[Nombre]-TK[Número]
- Roles del Sistema: SuperAdministrador (Control total) / Administrador (Gestión operativa y productos) / Empleado (Consulta de stock y traslados)
- Roadmap Interactivo (GitHub Pages): https://ispc-web-2025.github.io/TodoStock-Mobile-RoadMap/ (Username:
CodeLab | Password: RoadMap-2026-Mobile)
🔐 Módulo 01: Autenticación, Sesiones y Navegación
#US01: Autenticación Segura y JWT (#55 / #31)
- Responsables: Miguel Flores / Aylén Bartolino Luna
- Prioridad: Alta | SP: 13 (Sprint 1: 5 SP | Sprint 2: 8 SP)
📖 Historia
Como usuario quiero iniciar sesión y acceder a un menú principal para navegar hacia el resto de la aplicación de acuerdo con mi rol asignado.
✅ Criterios de Aceptación
- Existe una pantalla de Login con validación de campos e inyección de token JWT (
POST /api/usuarios/login/).
- Navegación fluida hacia
MenuPrincipalActivity tras la autenticación exitosa.
- Cierre de sesión seguro con limpieza de tokens en
SesionManager.
- Menú principal vertical accesible (#TK114 - PR #275) adaptado dinámicamente según el rol (
is_superuser, es_admin, es_empleado).
🥒 Escenarios Gherkin
- Escenario 1 (Login Exitoso con JWT):
Dado que un usuario ingresa correo y contraseña válidos en LoginActivity,
Cuando presiona "Ingresar",
Entonces la API retorna HTTP 200 con tokens access y refresh, SesionManager los almacena encriptados y navega a MenuPrincipalActivity.
- Escenario 2 (Intento de Login con Cuenta Pendiente):
Dado que un usuario no aprobado intenta ingresar,
Cuando presiona "Ingresar",
Entonces la API responde HTTP 403 y la app muestra "Esta cuenta aún no ha sido aprobada por un Administrador".
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK01 |
Layout activity_login.xml con validaciones de campos |
2 |
Sprint 1 |
feature/miguel_flores-TK01 |
| #TK02 |
Layout activity_menu_principal.xml |
2 |
Sprint 1 |
feature/miguel_flores-TK02 |
| #TK03 |
Navegación por Intent desde Login hacia Menú |
1 |
Sprint 1 |
feature/miguel_flores-TK03 |
| #TK04 |
Contratos de Intent con extra rol_usuario |
2 |
Sprint 1 |
feature/miguel_flores-TK04 |
| #TK05 |
Retrofit: login contra API y guardado JWT |
2 |
Sprint 2 |
feature/aylen_bartolino_luna-TK05-TK06 |
| #TK06 |
AuthInterceptor HTTP para inyectar cabecera Bearer |
1 |
Sprint 2 |
feature/aylen_bartolino_luna-TK05-TK06 |
| #TK07 |
Botón "Cerrar sesión" con invalidación local |
1 |
Sprint 2 |
feature/miguel_flores-TK48 |
| #TK90 |
Configuración base de la app (ApiClient) |
2 |
Sprint 2 |
feature/aylen_bartolino_luna-TK90 |
| #TK91 |
SplashActivity: verificar sesión previa |
1 |
Sprint 2 |
feature/aylen_bartolino_luna-TK90 |
| #TK92 |
Corregir defecto visual de errores en Login (TC-L-01) |
1 |
Sprint 2 |
feature/miguel_flores-revision-backlog |
| #TK112 |
AuthRepository + LoginViewModel para arquitectura |
2 |
Sprint 2 |
feature/aylen_bartolino_luna-TK112 |
| #TK114 |
Reorganización de Menú Principal vertical accesible |
1 |
Sprint 2 |
feature/miguel_flores-TK114 (PR #275) |
🏢 Módulo 02: Gestión de Sucursales
#US02: Selección e Integración de Sucursales (#56 / #32)
- Responsable: Candelaria Barjollo
- Prioridad: Alta | SP: 7 (Sprint 1: 5 SP | Sprint 2: 2 SP)
📖 Historia
Como usuario quiero elegir la sucursal con la que voy a trabajar para que las demás pantallas filtren la información según la sede seleccionada.
✅ Criterios de Aceptación
- Se muestra la lista dinámica de sucursales activas obtenida desde la API REST (
GET /api/inventario/sucursales/).
- Al seleccionar una sucursal, su
sucursal_id se propaga por Intent hacia GestionStockActivity y MovimientosActivity.
🥒 Escenarios Gherkin
- Escenario 1 (Selección Efectiva de Sucursal):
Dado que el usuario abre SeleccionSucursalActivity,
Cuando selecciona una sucursal de la lista,
Entonces el ID se almacena en SesionManager y se transmite a las pantallas dependientes.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK08 |
Paleta colors.xml y recursos visuales base |
1 |
Sprint 1 |
feature/candelaria_barjollo-TK08 |
| #TK09 |
Layout activity_seleccion_sucursal.xml |
2 |
Sprint 1 |
feature/candelaria_barjollo-TK09 |
| #TK10 |
Adapter con datos de sucursales (SucursalAdapter) |
1 |
Sprint 1 |
feature/candelaria_barjollo-TK10 |
| #TK11 |
Intent con sucursal_id hacia pantallas dependientes |
1 |
Sprint 1 |
feature/candelaria_barjollo-TK11 |
| #TK12 |
Conexión con GET /api/inventario/sucursales/ (SucursalDto) |
2 |
Sprint 2 |
feature/candelaria_barjollo-TK12 (PR #185) |
📦 Módulo 03: Inventario y Stock
#US03: Consulta de Stock y Alertas Visuales (#57 / #33)
- Responsable: Virginia García
- Prioridad: Alta | SP: 10 (Sprint 1: 5 SP | Sprint 2: 5 SP)
📖 Historia
Como Administrador o Empleado quiero ver la lista de productos con su cantidad de stock real en la sucursal elegida para conocer las existencias.
✅ Criterios de Aceptación
GestionStockActivity recibe la sucursal elegida y consulta GET /api/inventario/productos/{id}/stock/.
- Los productos por debajo del umbral mínimo se destacan con un resalte visual rojo en
StockAdapter.
🥒 Escenarios Gherkin
- Escenario 1 (Resalte Visual de Stock Crítico):
Dado que existen productos con cantidad menor al umbral mínimo,
Cuando se renderizan las tarjetas en el RecyclerView,
Entonces la cantidad se resalta en color rojo advirtiendo la necesidad de reposición.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK13 |
Layouts activity_gestion_stock.xml e item_stock.xml |
2 |
Sprint 1 |
feature/virginia_garcia-TK13 |
| #TK14 |
RecyclerView Adapter (StockAdapter) con tarjetas |
2 |
Sprint 1 |
feature/virginia_garcia-TK14-TK15 |
| #TK15 |
Recepción de sucursal_id por Intent y filtrado |
1 |
Sprint 1 |
feature/virginia_garcia-TK14-TK15 |
| #TK16 |
Conectar con GET /api/inventario/productos/{id}/stock/ |
3 |
Sprint 2 |
feature/virginia_garcia-TK16 (PR #216, #220) |
| #TK17 |
Alerta visual de stock bajo umbral en StockAdapter |
2 |
Sprint 2 |
feature/virginia_garcia-TK16 (PR #216, #220) |
✉️ Módulo 04: Contacto y Soporte
#US04: Formulario de Contacto y Soporte Institucional (#58)
- Responsable: Pedro González
- Prioridad: Media | SP: 5 (Sprint 1: 3 SP | Sprint 2: 2 SP)
📖 Historia
Como usuario quiero ver una pantalla de contacto para comunicarme con soporte técnico si experimento problemas.
✅ Criterios de Aceptación
- Formulario
ContactoActivity accesible desde el Menú Principal para todos los roles.
- Envío de consultas a la API (
POST /api/contacto/) con confirmación visual Toast.
🥒 Escenarios Gherkin
- Escenario 1 (Envío Exitoso de Incidencia):
Dado que un usuario completa Nombre, Correo y Mensaje en ContactoActivity,
Cuando presiona "Enviar",
Entonces la API procesa la solicitud y muestra "Mensaje enviado con éxito".
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK18 |
Layout activity_contacto.xml |
2 |
Sprint 1 |
feature/pedro_gonzalez-TK18 |
| #TK19 |
Lógica de envío en ContactoActivity con Toast |
1 |
Sprint 1 |
feature/pedro_gonzalez-TK19 |
| #TK20 |
Selector de sucursal del formulario de contacto |
1 |
Sprint 2 |
feature/pedro_gonzalez-TK42 |
| #TK42 |
Endpoint de contacto y envío real (ContactoApiService) |
1 |
Sprint 2 |
feature/pedro_gonzalez-TK42 (PR #192) |
📝 Módulo 05: Alta de Productos
#US05: Carga de Productos en Catálogo (#59 / #35)
- Responsable: Pedro González
- Prioridad: Alta | SP: 7 (Sprint 1: 3 SP | Sprint 2: 4 SP)
📖 Historia
Como Administrador quiero cargar un nuevo producto para que esté disponible en el catálogo de ventas e inventario.
✅ Criterios de Aceptación
- Formulario
CargaProductoActivity con selección de categoría desde desplegable dinámico (GET /api/inventario/categorias/ - #TK23).
- Alta realizada mediante
POST /api/inventario/productos/ restringido únicamente al rol Administrador.
🥒 Escenarios Gherkin
- Escenario 1 (Alta Exitosa con Categoría):
Dado que un Administrador completa los datos y selecciona una categoría válida,
Cuando presiona "Guardar Producto",
Entonces la API crea el registro y se añade al catálogo.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK21 |
Layout activity_carga_producto.xml |
2 |
Sprint 1 |
feature/pedro_gonzalez-TK21 |
| #TK22 |
Validación visual de campos obligatorios vacíos |
1 |
Sprint 1 |
feature/pedro_gonzalez-TK22 |
| #TK23 |
Conexión con POST /api/inventario/productos/ (Categorías - PR #287) |
2 |
Sprint 2 |
feature/pedro_gonzalez-TK93 |
| #TK93 |
Corregir defecto visual de errores en Carga de Producto |
2 |
Sprint 2 |
feature/pedro_gonzalez-TK93 (PR #197) |
🔄 Módulo 06: Movimientos de Stock
#US06: Movimientos Atómicos entre Sucursales (#60 / #34)
- Responsable: Aylén Bartolino Luna
- Prioridad: Alta | SP: 7 (Sprint 1: 4 SP | Sprint 2: 3 SP)
📖 Historia
Como Empleado o Administrador quiero registrar un movimiento de stock entre dos sucursales para actualizar las existencias en ambas.
✅ Criterios de Aceptación
- Formulario
MovimientosActivity con selectores de sucursal origen, destino, producto y cantidad.
- Transferencia atómica registrada vía
POST /api/inventario/movimientos/ (descuento en origen e incremento en destino).
- Bloqueo si origen = destino o si cantidad <= 0.
- Pantalla puente
MenuMovimientosActivity (#TK113 - PR #276) organizando los tipos de movimientos.
🥒 Escenarios Gherkin
- Escenario 1 (Traslado Atómico Exitoso):
Dado que el usuario selecciona origen "Centro", destino "Norte", producto y cantidad 5,
Cuando presiona "Confirmar Traslado",
Entonces la API procesa la operación dual de forma atómica y confirma el cambio.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK24 |
Layout activity_movimientos.xml |
2 |
Sprint 1 |
feature/aylen_bartolino_luna-TK24 |
| #TK25 |
Spinners de origen y destino con datos reales |
1 |
Sprint 1 |
feature/aylen_bartolino_luna-TK25 |
| #TK26 |
Validaciones locales (origen ≠ destino, cantidad > 0) |
1 |
Sprint 1 |
feature/aylen_bartolino_luna-TK26 |
| #TK27 |
Conexión con API atómica (MovimientoRequest) |
3 |
Sprint 2 |
feature/aylen_bartolino_luna-TK27 (PR #185) |
| #TK113 |
Pantalla intermedia Hub de Movimientos de Stock |
2 |
Sprint 2 |
feature/miguel_flores-TK113 (PR #276) |
👤 Módulo 07: Registro de Usuarios
#US07: Registro de Nuevos Usuarios (#61)
- Responsable: Aylén Bartolino Luna
- Prioridad: Alta | SP: 6 (Sprint 2: 6 SP)
📖 Historia
Como visitante quiero registrarme con mis datos personales (Nombre, Email, DNI, Fecha de Nacimiento y Contraseña) para solicitar mi cuenta en la aplicación.
✅ Criterios de Aceptación
- Con datos válidos (DNI formato numérico, email válido, edad mayor a 18 años, contraseña fuerte de mínimo 9 caracteres con letras, números y especial) y términos aceptados, se crea la cuenta en estado pendiente (
is_active = false) y redirige a Login con aviso.
- La cuenta pendiente no tiene rol asignado y no puede iniciar sesión hasta que un Administrador la apruebe e inscriba su rol.
- Si el email o DNI ya existen, el sistema rechaza la solicitud mostrando error HTTP 409 Conflict sin duplicar usuarios.
- Si la contraseña no cumple la política de fortaleza, se rechaza indicando los requisitos faltantes.
- Los Términos y Condiciones pueden leerse desde la pantalla de Registro; si no se acepta la casilla, el botón "Registrarme" no envía datos.
🥒 Escenarios Gherkin
- Escenario 1 (Registro Exitoso Mayor de Edad):
Dado que un visitante ingresa Nombre, Email único, DNI válido, Fecha de Nacimiento con edad >= 18 años, contraseña robusta y marca la casilla de términos,
Cuando presiona "Registrarme",
Entonces la API crea la cuenta en estado pendiente, muestra un Toast de confirmación y redirige a LoginActivity.
- Escenario 2 (Intento de Registro Menor de Edad):
Dado que un usuario ingresa una fecha de nacimiento correspondiente a una edad menor a 18 años,
Cuando presiona "Registrarme",
Entonces la app bloquea el envío, resalta el campo de fecha en rojo y muestra "Debes ser mayor de 18 años para registrarte".
- Escenario 3 (Términos no aceptados):
Dado que un usuario completa todos sus datos pero no marca la casilla de aceptación de términos,
Cuando presiona "Registrarme",
Entonces la solicitud no se envía a la API y se marca la casilla con mensaje de error obligatorio.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK34 |
RegistroActivity: layout, máscara de fecha, validación +18 y API |
4 |
Sprint 2 |
feature/aylen_bartolino_luna-TK34-TK47 (PR #173, #174, #223) |
| #TK35 |
Verificación de contrato POST /api/usuarios/registro/ en Postman |
1 |
Sprint 2 |
feature/aylen_bartolino_luna-TK34-mensajes |
| #TK47 |
Política de contraseñas robustas en cliente (Validadores.java) y servidor |
1 |
Sprint 2 |
feature/aylen_bartolino_luna-TK34-mensajes |
👑 Módulo 08: Administración de Usuarios y Jerarquía de Roles
#US08: Control y Gestión de Usuarios por Administrador y SuperAdmin (#62)
- Responsables: Miguel Flores / Candelaria Barjollo / Pedro González
- Prioridad: Alta | SP: 7 (Sprint 2: 7 SP)
📖 Historia
Como Administrador quiero cargar, aprobar, listar, editar y dar de baja usuarios para controlar quién accede a la plataforma y con qué nivel de permisos.
✅ Criterios de Aceptación
- Visualización: Un Administrador logueado ve la lista completa de usuarios con nombre, email, rol e insignias
Activo/Inactivo en UsuariosActivosFragment.
- Blindaje Jerárquico (ADR-0008):
- SuperAdmin (
is_superuser=True): Control total; aprueba, edita y da de baja a cualquier Administrador o Empleado. La cuenta raíz no se puede desactivar ni degradar.
- Administrador Estándar (
rol=ADMINISTRADOR): Solo administra cuentas de rol EMPLEADO. Acciones sobre otros Administradores o SuperAdmin se bloquean en UI y la API responde HTTP 403 Forbidden.
- Aprobación de Pendientes (TK109):
CargarUsuarioFragment lista solicitudes pendientes (is_active = false). Al aprobar, es obligatorio asignar rol (EMPLEADO o ADMINISTRADOR).
- Modificación y Baja (TK37): Diálogo modal
dialog_editar_usuario.xml para actualizar datos o procesar baja lógica (is_active = false).
🥒 Escenarios Gherkin
- Escenario 1 (Aprobación de Solicitud Pendiente por Admin):
Dado que un Administrador accede a solicitudes pendientes en CargarUsuarioFragment,
Cuando selecciona una cuenta, asigna el rol EMPLEADO y confirma la aprobación,
Entonces la API actualiza is_active = true, guarda el rol y la cuenta queda habilitada para iniciar sesión.
- Escenario 2 (Intento de Modificación de Administrador por Admin Estándar):
Dado que un Administrador Estándar intenta modificar el rol de otro Administrador o SuperAdmin,
Cuando presiona "Editar",
Entonces la interfaz deshabilita la opción y cualquier petición forzada a la API retorna HTTP 403 Forbidden.
- Escenario 3 (Baja Lógica de Usuario):
Dado que un Administrador abre el diálogo modal de edición sobre un Empleado y presiona "Dar de baja",
Cuando confirma la acción,
Entonces el servidor ejecuta is_active = false, inscribe el evento en LogAuditoria y el usuario ya no puede iniciar sesión.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK36 |
API de usuarios (listar, editar, baja) restringido por jerarquía (ADR-0008) |
2 |
Sprint 2 |
Backend API |
| #TK37 |
UsuariosActivosFragment: listado, edición de rol y baja con diálogo modal |
2 |
Sprint 2 |
feature/pedro_gonzalez-TK37 (PR #300) |
| #TK48 |
Autorización por perfiles y menú dinámico según is_superuser/es_empleado |
2 |
Sprint 2 |
feature/miguel_flores-TK48 (PR #160) |
| #TK109 |
CargarUsuarioFragment: revisión y aprobación obligatoria con rol |
1 |
Sprint 2 |
Backend / App (PR #290) |
✏️ Módulo 09: Edición y Borrado de Productos
#US09: Edición y Eliminación de Productos en Catálogo (#63)
- Responsable: Virginia García / Pedro González
- Prioridad: Media | SP: 4 (Sprint 2: 4 SP)
📖 Historia
Como Administrador quiero consultar, editar y eliminar productos para mantener el catálogo actualizado sin datos obsoletos.
✅ Criterios de Aceptación
- Catálogo completo de productos accesible con barra de búsqueda en tiempo real.
- Al seleccionar "Editar" sobre un artículo,
CargaProductoActivity se abre en modo edición precargando Nombre, Descripción, Categoría y Precio via EXTRA_ID_PRODUCTO y guardando cambios via PATCH /api/inventario/productos/{id}/.
- Si se ingresa un código SKU que ya pertenece a otro producto, la API rechaza la actualización con error HTTP 400.
- Al confirmar la eliminación, el producto se inhabilita lógicamente (
activo = False - ADR-0010), dejando de aparecer en búsquedas y nuevos movimientos de stock.
🥒 Escenarios Gherkin
- Escenario 1 (Edición Exitosa de Producto):
Dado que un Administrador modifica el precio y la categoría de un producto precargado en CargaProductoActivity,
Cuando presiona "Guardar Cambios",
Entonces la API ejecuta PATCH, actualiza la base de datos y la lista de stock refleja los nuevos valores.
- Escenario 2 (Eliminación / Baja Lógica):
Dado que un Administrador pulsa el botón de eliminación sobre un producto en catálogo y confirma en el diálogo,
Cuando se envía la solicitud,
Entonces el servidor establece activo = False (ADR-0010) y el artículo deja de estar disponible para movimientos.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK38 |
API de productos: edición parcial PATCH y baja lógica (activo = False - ADR-0010) |
2 |
Sprint 2 |
Backend API |
| #TK39 |
Listado de productos con búsqueda, edición dual (CargaProductoActivity) y baja lógica |
2 |
Sprint 2 |
feature/virginia_garcia-TK39 (PR #296) |
🎨 Módulo 10: Ayuda y Adaptabilidad
#US10 & #RNF-UX: Ayuda, Instructivo Visual y Adaptabilidad (#64 / #65)
- Responsables: Virginia García / Miguel Flores
- Prioridad: Media | SP: 4 (Sprint 2: 4 SP)
📖 Historia
Como usuario quiero ver una pantalla de ayuda con un instructivo y reproductor de video tutorial, e interfaz adaptable para aprender a usar la app en cualquier orientación y dispositivo.
✅ Criterios de Aceptación
- Desde el Menú Principal se abre
AyudaActivity con accesos a "Cómo usar TodoStock", "Términos" e "Información de la App".
ComoUsarActivity reproduce el video tutorial (como_usar_todostock.mp4) mediante VideoView y MediaController, centrado sin barras negras.
- Al rotar el dispositivo a posición Apaisada (Landscape) o en Tablet, la Activity preserva la posición exacta del video y el estado del formulario sin perder datos (
onSaveInstanceState - #TK41).
InfoAppActivity muestra dinámicamente la versión compilada leyendo BuildConfig.VERSION_NAME.
- Todos los controles multimedia e íconos poseen etiquetas
contentDescription para TalkBack.
🥒 Escenarios Gherkin
- Escenario 1 (Reproducción de Video Tutorial al Rotar):
Dado que un usuario está reproduciendo el video tutorial en ComoUsarActivity en el segundo 15,
Cuando rota la pantalla de posición Vertical a Apaisada (Landscape),
Entonces la Activity se recrea, ajusta el video sin barras negras y continúa reproduciendo desde el segundo 15 sin reiniciar.
- Escenario 2 (Consulta de Versión en InfoApp):
Dado que un usuario abre InfoAppActivity,
Cuando se renderiza la pantalla,
Entonces el texto de versión se pobla automáticamente desde BuildConfig.VERSION_NAME.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK40 |
AyudaActivity, ComoUsarActivity (video adaptativo) e InfoAppActivity (BuildConfig) |
2 |
Sprint 2 |
feature/virginia_garcia-TK40 (PR #301) |
| #TK41 |
Adaptabilidad apaisada/tablet en 11 layouts XML con ScrollView y onSaveInstanceState |
2 |
Sprint 2 |
feature/miguel_flores-TK41 (PR #294) |
⚖️ Módulo 11: Legislación, Privacidad y Arrepentimiento
#US11: Cumplimiento Normativo y Botón de Arrepentimiento (#67)
- Responsable: Aylén Bartolino Luna / Octavio Arnaudo
- Prioridad: Media | SP: 5 (Sprint 2: 5 SP)
📖 Historia
Como usuario quiero conocer y controlar el uso de mis datos personales para ejercer mis derechos de privacidad y arrepentimiento bajo la Ley 25.326.
✅ Criterios de Aceptación
TerminosActivity permite leer las políticas de privacidad y protección de datos personales antes y después del registro.
- Al registrarse, el sistema almacena la fecha y versión de aceptación de términos junto a la cuenta.
- El Menú Principal cuenta con la opción "Darme de baja" (
BajaDeCuenta): al confirmar, la cuenta se desactiva (is_active = false), se revocan los tokens JWT y se inscribe el evento en LogAuditoria (ADR-0009).
- Un usuario dado de baja no puede volver a iniciar sesión (la API responde
HTTP 403 "Esta cuenta no está activa").
🥒 Escenarios Gherkin
- Escenario 1 (Solicitud de Baja Voluntaria de Cuenta):
Dado que un usuario autenticado selecciona "Darme de baja" desde el menú y confirma en el diálogo,
Cuando se envía la petición POST /api/usuarios/desactivar/,
Entonces el servidor desactiva la cuenta, destruye la sesión en SesionManager, redirige a LoginActivity e inscribe la baja en LogAuditoria.
- Escenario 2 (Intento de Reingreso de Cuenta Desactivada):
Dado que un usuario dada de baja intenta iniciar sesión con sus credenciales anteriores,
Cuando presiona "Ingresar",
Entonces el servidor responde HTTP 403 y la app muestra "Esta cuenta no está activa".
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK52 |
Legislación en la app: TerminosActivity y opción 'Darme de baja' (BajaDeCuenta) |
3 |
Sprint 2 |
feature/aylen_bartolino_luna-TK52 (PR #180, #195) |
| #TK105 |
Sección de legislación en la Wiki y verificación de cumplimiento normativo (Ley 25.326) |
2 |
Sprint 2 |
feature/octavio_arnaudo-TK105 (PR #217) |
👤 Módulo 12: Perfil Propio de Usuario
#US12: Ver y Editar Perfil Propio (#70)
- Responsable: Candelaria Barjollo
- Prioridad: Alta | SP: 4 (Sprint 2: 4 SP)
📖 Historia
Como usuario (Administrador o Empleado) quiero ver y modificar mis datos personales para mantener mi perfil actualizado.
✅ Criterios de Aceptación
PerfilActivity muestra el Nombre, Email, DNI, Fecha de Nacimiento y Rol asignado del usuario logueado.
EditarPerfilActivity permite modificar Nombre, Email y DNI enviando una solicitud PATCH /api/usuarios/me/.
- Al confirmar la edición, los cambios persisten en el servidor y se actualizan automáticamente en
SesionManager.
🥒 Escenarios Gherkin
- Escenario 1 (Modificación Exitosa de Datos de Perfil):
Dado que un usuario modifica su Nombre o DNI en EditarPerfilActivity,
Cuando presiona "Guardar Cambios",
Entonces la API ejecuta PATCH /api/usuarios/me/, retorna HTTP 200 OK, actualiza la sesión local y refleja los nuevos datos en PerfilActivity.
🛠️ Tareas Técnicas
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK94 |
PerfilApiService y DTOs (PerfilResponse, PerfilUpdateRequest) |
2 |
Sprint 2 |
feature/candelaria_barjollo-TK94-TK95 (PR #180) |
| #TK95 |
PerfilActivity y EditarPerfilActivity: ver y modificar mis datos |
2 |
Sprint 2 |
feature/candelaria_barjollo-TK94-TK95 (PR #180) |
🛡️ Módulo 13: Hardening de Ciberseguridad
#RNF-SEG: Seguridad, Protección de Sesiones y Auditoría (#68)
- Responsables: Aylén Bartolino Luna / Pedro González
- Prioridad: Alta | SP: 14 (Sprint 2: 14 SP)
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK45 |
Secreción de credenciales, eliminación de claves hardcodeadas y uso de .env |
1 |
Sprint 2 |
Config / .env |
| #TK46 |
Configuración de CORS, ALLOWED_HOSTS y límite de intentos de login |
1 |
Sprint 2 |
Backend Settings |
| #TK49 |
Control de sesiones: access token corto, refresh token con rotación en SesionManager |
2 |
Sprint 2 |
SesionManager.java |
| #TK50 |
TLS: redirección HTTPS y network_security_config en Android |
1 |
Sprint 2 |
network_security_config.xml |
| #TK51 |
Auditoría de seguridad: registro de eventos en la tabla LogAuditoria |
2 |
Sprint 2 |
LogAuditoria |
| #TK53 |
Sistema de Gestión de Riesgos y revisión del plan de seguridad |
1 |
Sprint 2 |
Ciberseguridad |
| #TK54 |
Video corto sobre arquitectura JWT, autenticación y autorización |
1 |
Sprint 2 |
Video Demo |
| #TK55..59 |
Casos de prueba de seguridad (TC-SEG-01 al TC-SEG-05, TC-SEG-06) |
5 |
Sprint 2 |
Planilla Pruebas |
🧪 Módulo 14: Pruebas Automatizadas y Accesibilidad
#ENABLER-QA: Suite de Testing Unitario, Integración y Accesibilidad
- Responsables: Aylén Bartolino Luna / Equipo
- Prioridad: Alta | SP: 21 (Sprint 2: 21 SP)
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK60 |
[AUT-UNIT-01] Tests unitarios de validadores en ValidadoresTest.java (patrón AAA) |
3 |
Sprint 2 |
feature/aylen_bartolino_luna-TK60, TK60-AAA (PR #213, #226) |
| #TK61 |
[AUT-UNIT-02] Tests unitarios de stock bajo y mappers en StockItemTest.java |
2 |
Sprint 2 |
feature/virginia_garcia-TK61 (PR #277) |
| #TK62 |
[AUT-UNIT-03] Tests unitarios de LoginViewModel y repositorio simulado (LoginViewModelTest.java) |
2 |
Sprint 2 |
feature/pedro_gonzalez-TK62 (PR #293) |
| #TK64 |
[AUT-NET-01] Tests de integración de red con MockWebServer (ParseoRespuestasTest.java) |
2 |
Sprint 2 |
test/candelaria_barjollo-TK64 (PR #292) |
| #TK65 |
[AUT-NET-02] Tests de integración de red con MockWebServer simulando errores HTTP 500 (AuthRepositoryTest.java) |
2 |
Sprint 2 |
test/candelaria_barjollo-TK65 (PR #295, PR #297) |
| #TK70 |
[AUT-UI-01] Pruebas de UI automatizadas con Espresso (LoginFlujoTest.java) y Page Objects |
2 |
Sprint 2 |
feature/miguel_flores-TK70 (PR #299) |
| #TK68 |
[AUT-API-02] Suite Postman de integración de catálogo e infraestructura PostmanConfig.java |
2 |
Sprint 2 |
feature/miguel_flores-TK68 (PR #298) |
| #TK80..89 |
Plan de Pruebas, ejecución de casos de prueba y planilla de trazabilidad |
10 |
Sprint 2 |
Testing-y-Calidad |
| #TK96 |
Informe de Accesibilidad y auditoría visual de la app |
1 |
Sprint 2 |
Accesibilidad |
| #TK110 |
Casos de prueba de API y reporte de bugs del endpoint de registro |
1 |
Sprint 2 |
Reporte Bugs |
📚 Módulo 15: Documentación, Proceso y Gestión
#MGMT / #RELEASE: Gestión Ágil, Wiki, Release y Entregables
- Responsables: Octavio Arnaudo / Miguel Flores / Aylén Bartolino Luna
- Prioridad: Alta | SP: 23 (Sprint 0: 3 SP | Sprint 1: 5 SP | Sprint 2: 15 SP)
| Tarea |
Descripción |
SP |
Sprint |
Rama |
| #TK28 |
Setup del repo, estrategia GitFlow, Kanban y Wiki |
2 |
Sprint 0 |
main / develop |
| #TK29 |
Vincular documentación IEEE830 desde la Wiki del proyecto |
1 |
Sprint 0 |
feature/octavio_arnaudo-TK29 |
| #TK30 |
Consolidar plan de pruebas y los 12 test cases en la Wiki |
2 |
Sprint 1 |
feature/octavio_arnaudo-TK30 |
| #TK31 |
Redactar borrador del plan de ciberseguridad y arquitectura JWT |
2 |
Sprint 1 |
feature/octavio_arnaudo-TK30 |
| #TK32 |
Cargar Anexo II del IEEE830 con capturas de pantalla de la app |
1 |
Sprint 1 |
feature/octavio_arnaudo-TK30 |
| #TK33 |
GitHub Action para notificaciones de merges a develop |
1 |
Sprint 1 |
feature/miguel_flores-TK33 |
| #TK43 |
Deploy del backend en Alwaysdata y baseUrl de release |
1 |
Sprint 2 |
Backend Deployment |
| #TK44 |
APK release en main e instrucciones de instalación |
1 |
Sprint 2 |
Release APK |
| #TK97 |
Grabar y editar el video demo grupal (máx. 3 minutos) |
2 |
Sprint 2 |
Video Demo |
| #TK98 |
Milestone Sprint 2, etiquetas e Issues en GitHub |
2 |
Sprint 2 |
GitHub Milestones |
| #TK99 |
Gestión de reporte y seguimiento de bugs |
1 |
Sprint 2 |
GitHub Issues |
| #TK100 |
Registro de las 4 ceremonias del Sprint 2 en la Wiki |
2 |
Sprint 2 |
feature/octavio_arnaudo_TK106 |
| #TK101 |
IEEE830 actualizado con los requerimientos del Sprint 2 |
1 |
Sprint 2 |
feature/octavio_arnaudo_TK106 |
| #TK102 |
Diagrama de navegabilidad y Anexo II con capturas nuevas |
2 |
Sprint 2 |
feature/octavio_arnaudo_TK106 |
| #TK103 |
Wiki: avances individuales, de equipo y enlaces externos |
1 |
Sprint 2 |
Wiki Home |
| #TK104 |
Product Backlog de la Wiki alineado con el backlog general |
1 |
Sprint 2 |
Product-Backlog |
| #TK106 |
README del repositorio actualizado |
1 |
Sprint 2 |
feature/octavio_arnaudo_TK106 |
| #TK107 |
Guion y coordinación del video demo grupal |
1 |
Sprint 2 |
Guion |
| #TK108 |
Commit en main con el backlog y plantillas de Issues/PR |
1 |
Sprint 2 |
Repositorio |
| #TK111 |
Guía de Aclaraciones para Evaluación Docente |
1 |
Sprint 2 |
GUÍA-DOCENTE |
| #TK113 |
Pantallas intermedias Hub de Stock (MenuStockActivity) y Movimientos (MenuMovimientosActivity) |
2 |
Sprint 2 |
feature/miguel_flores-TK113 (PR #276) |
| #TK114 |
Reorganización del Menú Principal con distribución vertical limpia y sin numeración |
1 |
Sprint 2 |
feature/miguel_flores-TK114 (PR #275) |
📊 16. Métricas Ágiles, Velocidad de Sprint y Trazabilidad Completa de Issues/PRs
📈 16.1 Resumen de Velocidad de Desarrollo y Puntos de Historia (SP)
- Sprint 0 (Setup & Arquitectura Base): 5 SP (100% completado).
- Sprint 1 (Layouts, Navegación e Inyección Mock): 31 SP (100% completado).
- Sprint 2 (Integración API REST, JWT, Perfiles, Legales y Unit Tests): 106 SP (100% completado).
- Puntos Acumulados Totales Entregados: 142 Story Points.
🔀 16.2 Mapeo de Pull Requests Fusionados por Historia de Usuario
Cruce auditado del Product Backlog contra los 91 Pull Requests:
| Historia / Módulo |
Descripción Funcional |
SP |
Integrante Principal |
Pull Request Fusionado |
| #US01 |
Autenticación JWT y Menú Principal |
13 |
Miguel Flores / Aylén Bartolino |
PR #49, PR #50, PR #157, PR #160, PR #162, PR #275 |
| #US02 |
Selección de Sucursal |
7 |
Candelaria Barjollo |
PR #17, PR #27, PR #29, PR #185 |
| #US03 |
Consulta de Stock e Inventario |
10 |
Virginia García |
PR #25, PR #216, PR #220 |
| #US04 |
Contacto y Soporte Institucional |
5 |
Pedro González |
PR #39, PR #41, PR #192 |
| #US05 |
Carga y Alta de Productos (Admin) |
7 |
Pedro González |
PR #37, PR #197, PR #287 |
| #US06 |
Movimientos Atómicos de Stock |
7 |
Aylén Bartolino Luna |
PR #10, PR #11, PR #13, PR #18, PR #185, PR #276 |
| #US07 |
Registro de Usuarios con Validaciones |
6 |
Aylén Bartolino Luna |
PR #171, PR #173, PR #223 |
| #US08 |
Gestión de Usuarios y Permisos RBAC |
7 |
Miguel Flores / Candelaria / Pedro |
PR #160 (ADR-0008), PR #180, PR #290, PR #300 |
| #US09 |
Edición y Eliminación de Productos |
4 |
Pedro González / Virginia García |
PR #197, PR #216, PR #296 (ADR-0010) |
| #US10 |
Instructivo de Ayuda y Adaptabilidad |
4 |
Miguel Flores / Virginia García |
PR #217, PR #294, PR #301 |
| #US11 |
Términos, Condiciones y Baja de Cuenta |
5 |
Aylén Bartolino / Octavio Arnaudo |
PR #180, PR #195, PR #217 |
| #US12 |
Perfil Propio y Edición de Datos |
4 |
Candelaria Barjollo |
PR #180 |
| #ENABLER-QA |
Testing Unitario (AAA), Red y UI |
21 |
Aylén / Virginia / Miguel / Cande |
PR #213, #226, #277, #292, #293, #295, #297, #298, #299 |
| #MGMT |
Documentación Wiki, IEEE830, README y APK |
23 |
Octavio Arnaudo / Equipo CodeLab |
PR #47, PR #48, PR #161, PR #229, PR #231, PR #249 |
Volver al Home