Repository navigation
Product Backlog
- 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)
- Responsables: Miguel Flores / Aylén Bartolino Luna
- Prioridad: Alta | SP: 13 (Sprint 1: 5 SP | Sprint 2: 8 SP)
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.
- Existe una pantalla de Login con validación de campos e inyección de token JWT (
POST /api/usuarios/login/). - Navegación fluida hacia
MenuPrincipalActivitytras 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).
-
Escenario 1 (Login Exitoso con JWT):
Dado que un usuario ingresa correo y contraseña válidos enLoginActivity,
Cuando presiona "Ingresar",
Entonces la API retorna HTTP 200 con tokensaccessyrefresh,SesionManagerlos almacena encriptados y navega aMenuPrincipalActivity. -
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".
| 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) |
- Responsable: Candelaria Barjollo
- Prioridad: Alta | SP: 7 (Sprint 1: 5 SP | Sprint 2: 2 SP)
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.
- Se muestra la lista dinámica de sucursales activas obtenida desde la API REST (
GET /api/inventario/sucursales/). - Al seleccionar una sucursal, su
sucursal_idse propaga porIntenthaciaGestionStockActivityyMovimientosActivity.
-
Escenario 1 (Selección Efectiva de Sucursal):
Dado que el usuario abreSeleccionSucursalActivity,
Cuando selecciona una sucursal de la lista,
Entonces el ID se almacena enSesionManagery se transmite a las pantallas dependientes.
| 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) |
- Responsable: Virginia García
- Prioridad: Alta | SP: 10 (Sprint 1: 5 SP | Sprint 2: 5 SP)
Como Administrador o Empleado quiero ver la lista de productos con su cantidad de stock real en la sucursal elegida para conocer las existencias.
-
GestionStockActivityrecibe la sucursal elegida y consultaGET /api/inventario/productos/{id}/stock/. - Los productos por debajo del umbral mínimo se destacan con un resalte visual rojo en
StockAdapter.
-
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 elRecyclerView,
Entonces la cantidad se resalta en color rojo advirtiendo la necesidad de reposición.
| 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) |
- Responsable: Pedro González
- Prioridad: Media | SP: 5 (Sprint 1: 3 SP | Sprint 2: 2 SP)
Como usuario quiero ver una pantalla de contacto para comunicarme con soporte técnico si experimento problemas.
- Formulario
ContactoActivityaccesible desde el Menú Principal para todos los roles. - Envío de consultas a la API (
POST /api/contacto/) con confirmación visual Toast.
-
Escenario 1 (Envío Exitoso de Incidencia):
Dado que un usuario completa Nombre, Correo y Mensaje enContactoActivity,
Cuando presiona "Enviar",
Entonces la API procesa la solicitud y muestra "Mensaje enviado con éxito".
| 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) |
- Responsable: Pedro González
- Prioridad: Alta | SP: 7 (Sprint 1: 3 SP | Sprint 2: 4 SP)
Como Administrador quiero cargar un nuevo producto para que esté disponible en el catálogo de ventas e inventario.
- Formulario
CargaProductoActivitycon 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.
-
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.
| 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) |
- Responsable: Aylén Bartolino Luna
- Prioridad: Alta | SP: 7 (Sprint 1: 4 SP | Sprint 2: 3 SP)
Como Empleado o Administrador quiero registrar un movimiento de stock entre dos sucursales para actualizar las existencias en ambas.
- Formulario
MovimientosActivitycon 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.
-
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.
| 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) |
- Responsable: Aylén Bartolino Luna
- Prioridad: Alta | SP: 6 (Sprint 2: 6 SP)
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.
- 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.
-
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 aLoginActivity. -
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.
| 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 |
- Responsables: Miguel Flores / Candelaria Barjollo / Pedro González
- Prioridad: Alta | SP: 7 (Sprint 2: 7 SP)
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.
-
Visualización: Un Administrador logueado ve la lista completa de usuarios con nombre, email, rol e insignias
Activo/InactivoenUsuariosActivosFragment. -
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 rolEMPLEADO. Acciones sobre otros Administradores o SuperAdmin se bloquean en UI y la API respondeHTTP 403 Forbidden.
-
SuperAdmin (
-
Aprobación de Pendientes (TK109):
CargarUsuarioFragmentlista solicitudes pendientes (is_active = false). Al aprobar, es obligatorio asignar rol (EMPLEADOoADMINISTRADOR). -
Modificación y Baja (TK37): Diálogo modal
dialog_editar_usuario.xmlpara actualizar datos o procesar baja lógica (is_active = false).
-
Escenario 1 (Aprobación de Solicitud Pendiente por Admin):
Dado que un Administrador accede a solicitudes pendientes enCargarUsuarioFragment,
Cuando selecciona una cuenta, asigna el rolEMPLEADOy confirma la aprobación,
Entonces la API actualizais_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 retornaHTTP 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 ejecutais_active = false, inscribe el evento enLogAuditoriay el usuario ya no puede iniciar sesión.
| 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) |
- Responsable: Virginia García / Pedro González
- Prioridad: Media | SP: 4 (Sprint 2: 4 SP)
Como Administrador quiero consultar, editar y eliminar productos para mantener el catálogo actualizado sin datos obsoletos.
- Catálogo completo de productos accesible con barra de búsqueda en tiempo real.
- Al seleccionar "Editar" sobre un artículo,
CargaProductoActivityse abre en modo edición precargando Nombre, Descripción, Categoría y Precio viaEXTRA_ID_PRODUCTOy guardando cambios viaPATCH /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.
-
Escenario 1 (Edición Exitosa de Producto):
Dado que un Administrador modifica el precio y la categoría de un producto precargado enCargaProductoActivity,
Cuando presiona "Guardar Cambios",
Entonces la API ejecutaPATCH, 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 estableceactivo = False(ADR-0010) y el artículo deja de estar disponible para movimientos.
| 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) |
- Responsables: Virginia García / Miguel Flores
- Prioridad: Media | SP: 4 (Sprint 2: 4 SP)
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.
- Desde el Menú Principal se abre
AyudaActivitycon accesos a "Cómo usar TodoStock", "Términos" e "Información de la App". -
ComoUsarActivityreproduce el video tutorial (como_usar_todostock.mp4) medianteVideoViewyMediaController, 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). -
InfoAppActivitymuestra dinámicamente la versión compilada leyendoBuildConfig.VERSION_NAME. - Todos los controles multimedia e íconos poseen etiquetas
contentDescriptionpara TalkBack.
-
Escenario 1 (Reproducción de Video Tutorial al Rotar):
Dado que un usuario está reproduciendo el video tutorial enComoUsarActivityen 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 abreInfoAppActivity,
Cuando se renderiza la pantalla,
Entonces el texto de versión se pobla automáticamente desdeBuildConfig.VERSION_NAME.
| 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) |
- Responsable: Aylén Bartolino Luna / Octavio Arnaudo
- Prioridad: Media | SP: 5 (Sprint 2: 5 SP)
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.
-
TerminosActivitypermite 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 enLogAuditoria(ADR-0009). - Un usuario dado de baja no puede volver a iniciar sesión (la API responde
HTTP 403"Esta cuenta no está activa").
-
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ónPOST /api/usuarios/desactivar/,
Entonces el servidor desactiva la cuenta, destruye la sesión enSesionManager, redirige aLoginActivitye inscribe la baja enLogAuditoria. -
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 respondeHTTP 403y la app muestra "Esta cuenta no está activa".
| 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) |
- Responsable: Candelaria Barjollo
- Prioridad: Alta | SP: 4 (Sprint 2: 4 SP)
Como usuario (Administrador o Empleado) quiero ver y modificar mis datos personales para mantener mi perfil actualizado.
-
PerfilActivitymuestra el Nombre, Email, DNI, Fecha de Nacimiento y Rol asignado del usuario logueado. -
EditarPerfilActivitypermite modificar Nombre, Email y DNI enviando una solicitudPATCH /api/usuarios/me/. - Al confirmar la edición, los cambios persisten en el servidor y se actualizan automáticamente en
SesionManager.
-
Escenario 1 (Modificación Exitosa de Datos de Perfil):
Dado que un usuario modifica su Nombre o DNI enEditarPerfilActivity,
Cuando presiona "Guardar Cambios",
Entonces la API ejecutaPATCH /api/usuarios/me/, retornaHTTP 200 OK, actualiza la sesión local y refleja los nuevos datos enPerfilActivity.
| 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) |
- 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 |
- 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 |
- 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) |
- 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.
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 |