IEEE830 - ISPC-WEB-2025/TodoStock-AppMovil GitHub Wiki
Estándar: IEEE Std 830-1998
Versión: 2.0 | Fecha: 14 de Octubre de 2026
Estado: Documento en Producción
| Revisión | Fecha | Autor / Rol | Descripción de Cambios |
|---|---|---|---|
| 0.1 | 2026-05-01 | Equipo de Producto | Borrador inicial de objetivos. |
| 0.5 | 2026-06-10 | Base de Datos | Desglose de requisitos de backend (Django). |
| 1.0 | 2026-09-13 | Interfaz de Usuario | Integración del MVP Sprint 1 en Android (Java) y Angular. |
| 1.5 | 2026-09-30 | Equipo de Producto / QA | Cierre y congelamiento del Incremento Sprint 2. Integración de API REST, JWT, perfiles de usuario, legislación y testing. |
| 2.0 | 2026-10-14 | Equipo de Producto / QA | Entrega Final y consolidación SRS IEEE 830-1998 completa cubriendo historias #US01 a #US12, RNFs, enablers de QA, tareas técnicas (#TK01 a #TK112) y matriz de trazabilidad. |
- Introducción
- Descripción General
- Requisitos Específicos
- Verificación y Trazabilidad de Requisitos
- Anexos y Tareas Transversales
Este documento tiene como objetivo definir de manera exhaustiva los requisitos para el sistema TodoStock, una solución integral de gestión de inventarios. Este documento sirve como base para el desarrollo, pruebas y despliegue del ecosistema, asegurando que todos los componentes (Móvil, Web y Backend) funcionen armónicamente.
TodoStock es una plataforma multipropósito que incluye:
- Backend (Django REST Framework): El motor central que gestiona la persistencia de datos, lógica de negocio, autenticación JWT y procesamiento de movimientos.
- Frontend Web (Angular): Una Single Page Application (SPA) para administración centralizada, gestión de usuarios, sucursales y reportes.
- App Móvil (Android Java): Una aplicación nativa diseñada para el personal de depósito y ventas en campo, con soporte para gestión de inventario y modo offline.
Fuera del Alcance:
- Procesamiento de pagos directos con tarjetas de crédito (se delega a pasarelas externas).
- Gestión de nómina de empleados (RH).
- SRS: Software Requirements Specification.
- JWT: JSON Web Token (Estándar para autenticación segura).
- ORM: Object-Relational Mapping (Django Models).
- SPA: Single Page Application (Arquitectura de Angular).
- Retrofit: Librería de Android para comunicación con APIs REST.
- CORS: Cross-Origin Resource Sharing.
- ACID: Atomicity, Consistency, Isolation, Durability (Propiedades de transacciones de BD).
- Estándar IEEE 830-1998.
- Documentación oficial de Django REST Framework.
- Guía de diseño de Angular (v17+).
- Principios de arquitectura limpia de Android.
- Wiki del proyecto TodoStock (GitHub).
El sistema se divide en tres subsistemas principales que interactúan a través de protocolos seguros HTTPS. La lógica de negocio está centralizada en el backend, mientras que el frontend y la app móvil actúan como clientes ricos que proporcionan una experiencia de usuario optimizada para sus respectivos entornos.
TodoStock se concibe como un ecosistema distribuido. No es solo una aplicación, sino una red de herramientas sincronizadas.
Note
Diagrama de Arquitectura de Sistemas Muestra la interacción entre la BD MySQL, el servidor Django, los clientes Angular y la App Android.
graph TD
subgraph Clientes ["Capa de Presentación (Clientes)"]
A["📱 App Móvil (Android Java)<br/>Retrofit + SesionManager"]
B["💻 App Web (Angular SPA)<br/>Standalone Components + Signals"]
end
subgraph Backend ["Capa de Aplicación (Backend)"]
C["🌐 Proxy Inverso (Nginx)"]
D["🐍 Backend Server (Django REST Framework)<br/>JWT Auth + Serializers + ORM"]
end
subgraph Persistencia ["Capa de Datos"]
E[("🛢️ Base de Datos<br/>MySQL")]
end
A -->|"HTTPS / JSON (Bearer JWT)"| C
B -->|"HTTPS / JSON (Bearer JWT)"| C
C -->|"Reverse Proxy / WSGI"| D
D -->|"Django ORM (Consultas ACID)"| E
El sistema permite realizar las siguientes acciones críticas:
- Registro de usuarios con roles específicos (Administrador, Empleado).
- Inicio de sesión seguro con emisión de tokens JWT (
token_access,token_refresh). - Protección de rutas basada en guards (Angular) e interceptores (
AuthInterceptoren Android).
- Catalogación de productos con SKU únicos.
- Gestión de stock segmentado por sucursales.
- Definición de stocks mínimos globales y por sucursal para alertas visuales.
- Registro de Entradas y Salidas.
- Traslados atómicos entre sucursales con validación de stock origen.
| Clase de Usuario | Nivel Técnico | Responsabilidades |
|---|---|---|
| Administrador | Alto | Gestión total del sistema, ABM de usuarios, asignación de roles (Administrador y Empleado), ABM completo de productos (alta, edición, eliminación), configuración de sucursales, gestión de permisos y auditoría de seguridad. |
| Empleado (Operativo / Vendedor / Depósito) | Medio (Dispositivos Móviles) | Operaciones diarias de inventario, consulta de catálogo y existencia de stock, registro de movimientos entre sucursales, recepción y salida de mercadería, y carga asistida de productos. |
- Servidor: Python 3.10+, Django 6.0, MySQL. Despliegue en Alwaysdata / Docker / Nginx.
- Web: Navegadores modernos (Chrome, Firefox, Safari) compatibles con Angular 17+.
- Móvil: Dispositivos Android 7.0 (Nougat) o superior (API 24+).
- Lenguaje: Backend en Python, Frontend en TypeScript, Móvil en Java nativo.
-
Seguridad: Gestión centralizada de sesión con
SesionManager(SharedPreferences) en Android para tokens JWT. - Comunicación: Formato JSON estricto en todas las APIs REST.
Se proporcionará:
- Wiki técnica en el repositorio de GitHub.
- Manual de usuario e instructivos en la sección de Ayuda de la app.
- Guía de Aclaraciones Docente (
GUÍA-DOCENTE.md).
- Web: Diseño responsivo con TailwindCSS / Angular Material.
-
Móvil: Interfaz optimizada en Java / Material Design 3 con
Activitiesy layouts XML.
- El backend expone endpoints bajo
/api/. - Comunicación vía Retrofit HTTP Client en Android con
AuthInterceptor.
-
FR-AUTH-01: El sistema permitirá el login mediante email y contraseña validando credenciales contra la API (
POST /api/usuarios/login/). -
FR-AUTH-02: Los tokens JWT tendrán tiempo de expiración corto con renovaciones mediante refresh token (
POST /api/usuarios/token/refresh/). -
FR-AUTH-03: En Android, la sesión se administra en
SesionManager(SharedPreferences) inyectando el token Bearer enAuthInterceptor. Si la sesión expira o es inválida, el usuario es redirigido automáticamente aLoginActivity. -
FR-AUTH-04:
SplashActivityevalúa el estado de la sesión guardada y decide el destino (MenuPrincipalActivityoLoginActivity).
[US01] Autenticación y Menú Principal
- ID: US01 | Prioridad: Alta (Bloqueante) | Story Points: 8 (Sprint 1: 5 SP | Sprint 2: 3 SP)
- Responsable: Miguel Flores / Aylén Bartolino Luna
- Narrativa: Como usuario quiero iniciar sesión y acceder a un menú principal para navegar hacia el resto de la app según mi rol.
-
Criterios de Aceptación: Transición fluida Login → Menú Principal, menú condicional según el rol (
AdministradoroEmpleado), validaciones de campos y cierre de sesión efectivo. -
Endpoints:
POST /api/usuarios/login/,POST /api/usuarios/token/refresh/
Tareas Técnicas Asociadas (#US01):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK01 | Diseñar el layout activity_login.xml con validación de inputs en tiempo real. |
Miguel Flores | Sprint 1 | 2 | Alta | activity_login.xml |
| TK02 | Diseñar el layout activity_menu_principal.xml (hub) con accesos a módulos. |
Miguel Flores | Sprint 1 | 2 | Alta | activity_menu_principal.xml |
| TK03 | Navegación mediante Intent desde Login hacia MenuPrincipalActivity. |
Miguel Flores | Sprint 1 | 1 | Alta | LoginActivity.java |
| TK04 | Contrato de Intent desde menú a Activities hijas con rol_usuario. |
Miguel Flores | Sprint 1 | 2 | Alta | MenuPrincipalActivity.java |
| TK05 | Retrofit: login contra la API y guardado del JWT en SesionManager. |
Aylén Bartolino | Sprint 2 | 2 | Alta |
AuthRepository.java / SesionManager.java
|
| TK06 | Interceptor HTTP para inyectar cabecera Authorization: Bearer <token>. |
Aylén Bartolino | Sprint 2 | 1 | Media | AuthInterceptor.java |
| TK07 | Botón "Cerrar sesión" con limpieza de tokens y retorno a Login. | Miguel Flores | Sprint 2 | 1 | Media | MenuPrincipalActivity.java |
| TK90 | Configuración base de la app para consumir la API (ApiClient). |
Aylén Bartolino | Sprint 2 | 2 | Alta | ApiClient.java |
| TK91 |
SplashActivity: decidir destino según sesión guardada. |
Aylén Bartolino | Sprint 2 | 1 | Media | SplashActivity.java |
| TK92 | Corregir defecto visual de errores en Login (TC-L-01). | Miguel Flores | Sprint 2 | 1 | Media | LoginActivity.java |
| TK112 |
AuthRepository + LoginViewModel para arquitectura de Login. |
Aylén Bartolino | Sprint 2 | 2 | Alta | LoginViewModel.java |
-
FR-SUC-01: El sistema obtendrá la lista de sucursales activas desde la API (
GET /api/inventario/sucursales/). -
FR-SUC-02: Al seleccionar una sucursal, la app almacena y transmite el
sucursal_idpor Intent para filtrar los productos e inventarios.
[US02] Selección de Sucursal
- ID: US02 | Prioridad: Alta | Story Points: 7 (Sprint 1: 5 SP | Sprint 2: 2 SP)
- Responsable: Candelaria Barjollo
- Narrativa: Como usuario quiero elegir la sucursal con la que voy a trabajar para que las demás pantallas muestren su información.
-
Criterios de Aceptación: Lista en
SeleccionSucursalActivitypoblada conSucursalAdapter, selección persistente y transmisión delsucursal_id. -
Endpoints:
GET /api/inventario/sucursales/
Tareas Técnicas Asociadas (#US02):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK08 | Paleta de colores colors.xml y recursos visuales base. |
Candelaria Barjollo | Sprint 1 | 1 | Alta | colors.xml |
| TK09 | Layout activity_seleccion_sucursal.xml con RecyclerView/Spinner. |
Candelaria Barjollo | Sprint 1 | 2 | Alta | activity_seleccion_sucursal.xml |
| TK10 | Adapter con datos de sucursales (SucursalAdapter). |
Candelaria Barjollo | Sprint 1 | 1 | Media | SucursalAdapter.java |
| TK11 | Navegación por Intent pasando sucursal_id seleccionado. |
Candelaria Barjollo | Sprint 1 | 1 | Alta | SeleccionSucursalActivity.java |
| TK12 | Conexión con GET /api/inventario/sucursales/ con SucursalDto. |
Candelaria Barjollo | Sprint 2 | 2 | Alta | SucursalDto.java |
-
FR-STK-01: Visualización de stock de productos por sucursal (
GET /api/inventario/productos/{id}/stock/o por querysucursal_id). -
FR-STK-02: Resaltado visual automático en
StockAdaptercuando la cantidad de un ítem sea menor o igual al umbral mínimo (cantidad_stock <= stock_min).
[US03] Gestión e Inventario de Stock
- ID: US03 | Prioridad: Alta | Story Points: 10 (Sprint 1: 5 SP | Sprint 2: 5 SP)
- Responsable: Virginia Garcia
- Narrativa: Como Administrador o Empleado quiero ver una lista de productos con su cantidad de stock de la sucursal elegida para conocer la situación del inventario.
-
Criterios de Aceptación: Lista reactiva en
GestionStockActivity, filtrado porsucursal_idy alerta visual destacada en rojo ante stock bajo umbral. -
Endpoints:
GET /api/inventario/productos/{id}/stock/
Tareas Técnicas Asociadas (#US03):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK13 | Layouts activity_gestion_stock.xml e item_stock.xml. |
Virginia Garcia | Sprint 1 | 2 | Alta | activity_gestion_stock.xml |
| TK14 |
StockAdapter con mapeo de productos y existencias. |
Virginia Garcia | Sprint 1 | 2 | Alta | StockAdapter.java |
| TK15 | Recepción de sucursal_id por Intent y filtrado de la lista. |
Virginia Garcia | Sprint 1 | 1 | Media | GestionStockActivity.java |
| TK16 | Conexión con InventarioApiService para consulta de stock real. |
Virginia Garcia | Sprint 2 | 3 | Alta | InventarioApiService.java |
| TK17 | Implementación de alerta visual de stock bajo el umbral en StockAdapter. |
Virginia Garcia | Sprint 2 | 2 | Media | StockAdapter.java |
-
FR-CONT-01: Envío de mensajes de soporte e incidencias desde
ContactoActivityconectando conPOST /api/contacto/. - FR-CONT-02: Selector de sucursal en formulario de contacto poblado con datos de sucursales reales.
[US04] Contacto y Soporte
- ID: US04 | Prioridad: Media | Story Points: 5 (Sprint 1: 3 SP | Sprint 2: 2 SP)
- Responsable: Pedro Gonzalez
- Narrativa: Como usuario quiero ver una pantalla de contacto para comunicarme con soporte si lo necesito.
- Criterios de Aceptación: Formulario con nombre, email, sucursal, mensaje, validaciones de campos vacíos y confirmación por Toast/API.
-
Endpoints:
POST /api/contacto/
Tareas Técnicas Asociadas (#US04):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK18 | Layout activity_contacto.xml. |
Pedro Gonzalez | Sprint 1 | 2 | Media | activity_contacto.xml |
| TK19 | Lógica de envío en ContactoActivity con confirmación por Toast. |
Pedro Gonzalez | Sprint 1 | 1 | Media | ContactoActivity.java |
| TK20 | Selector de sucursal del formulario de contacto con datos reales. | Pedro Gonzalez | Sprint 2 | 1 | Media | ContactoActivity.java |
| TK42 | Endpoint de contacto y envío real (ContactoApiService, ContactoRequest). |
Pedro Gonzalez | Sprint 2 | 1 | Media | ContactoApiService.java |
-
FR-PROD-01: Creación de nuevos productos en catálogo (
POST /api/inventario/productos/). Acción reservada a usuarios con rol Administrador. - FR-PROD-02: Validaciones de código SKU único, precios mayores a cero y campos obligatorios.
[US05] Carga de Productos
- ID: US05 | Prioridad: Alta | Story Points: 7 (Sprint 1: 3 SP | Sprint 2: 4 SP)
- Responsable: Pedro Gonzalez
- Narrativa: Como Administrador quiero cargar un nuevo producto para que esté disponible en el catálogo.
-
Criterios de Aceptación: Formulario en
CargaProductoActivity, validaciones de entradas y persistencia en servidor mediante POST. -
Endpoints:
POST /api/inventario/productos/
Tareas Técnicas Asociadas (#US05):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK21 | Layout activity_carga_producto.xml (formulario de alta). |
Pedro Gonzalez | Sprint 1 | 2 | Media | activity_carga_producto.xml |
| TK22 | Validación visual de campos obligatorios vacíos antes de enviar. | Pedro Gonzalez | Sprint 1 | 1 | Media | CargaProductoActivity.java |
| TK23 | Conexión con POST /api/inventario/productos/ (solo Administrador). |
Pedro Gonzalez | Sprint 2 | 2 | Alta | CargaProductoActivity.java |
| TK93 | Corregir defecto visual de errores en Carga de Producto (TC-CP-01). | Pedro Gonzalez | Sprint 2 | 2 | Media | CargaProductoActivity.java |
- FR-MOV-01: Registro de transferencias de inventario entre sucursales origen y destino con validación de stock disponible.
-
FR-MOV-02: Procesamiento atómico en backend (
POST /api/vendedor/movimientos/o/api/inventario/movimientos/): la transacción incrementa y decrementa existencias de forma dual.
[US06] Movimientos entre Sucursales
- ID: US06 | Prioridad: Alta | Story Points: 7 (Sprint 1: 4 SP | Sprint 2: 3 SP)
- Responsable: Aylén Bartolino Luna
- Narrativa: Como Empleado o Administrador quiero registrar un movimiento de stock entre dos sucursales para que la existencia se actualice en ambas.
- Criterios de Aceptación: Formulario con spinners origen/destino, selección de producto y cantidad, bloqueo si origen = destino o cantidad <= 0.
-
Endpoints:
POST /api/vendedor/movimientos/
Tareas Técnicas Asociadas (#US06):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK24 | Layout activity_movimientos.xml (origen/destino, producto, cantidad). |
Aylén Bartolino | Sprint 1 | 2 | Alta | activity_movimientos.xml |
| TK25 | Spinners de sucursal origen/destino y producto. | Aylén Bartolino | Sprint 1 | 1 | Media | MovimientosActivity.java |
| TK26 | Validaciones locales de negocio (origen ≠ destino, cantidad > 0). | Aylén Bartolino | Sprint 1 | 1 | Media | MovimientosActivity.java |
| TK27 | Conexión con API atómica de movimientos (MovimientoRequest). |
Aylén Bartolino | Sprint 2 | 3 | Alta | MovimientosActivity.java |
-
FR-REG-01: Solicitud de alta de cuenta en
RegistroActivitymediantePOST /api/usuarios/registro/(nombre, email, DNI, fecha de nacimiento con edad mínima +18 y contraseña). -
FR-REG-02: Estado inicial de la cuenta en
PENDIENTEde aprobación por un Administrador.
[US07] Registro de Usuarios
- ID: US07 | Prioridad: Alta | Story Points: 6 (Sprint 2: 6 SP)
- Responsable: Aylén Bartolino Luna
- Narrativa: Como visitante quiero registrarme con mis datos para solicitar mi cuenta en la app.
-
Criterios de Aceptación: Formulario de registro con validaciones de campos, formato DNI, edad mínima +18 y contraseña en
Validadores.java. -
Endpoints:
POST /api/usuarios/registro/
Tareas Técnicas Asociadas (#US07):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK34 |
RegistroActivity: layout, validaciones de edad mínima (+18) y API. |
Aylén Bartolino | Sprint 2 | 4 | Alta | RegistroActivity.java |
| TK35 | Verificación de endpoint de registro y pruebas Postman. | Aylén Bartolino | Sprint 2 | 1 | Media | RegistroApiService.java |
| TK47 | Política de contraseñas robustas y validación en Validadores.java. |
Aylén Bartolino | Sprint 2 | 1 | Media | Validadores.java |
-
FR-USR-ADM-01: Listado, aprobación, asignación de rol (
ADMINISTRADORoEMPLEADO) y desactivación de usuarios desde la API (GET/PUT/DELETE /api/usuarios/). Acción exclusiva de Administradores. -
FR-USR-ADM-02: Menú condicional por rol en
MenuPrincipalActivity(#TK48): las opciones administrativas solo se despliegan sies_admines verdadero.
[US08] Control y Gestión de Usuarios (Admin)
- ID: US08 | Prioridad: Alta | Story Points: 7 (Sprint 2: 7 SP)
- Responsable: Miguel Flores / Candelaria Barjollo
- Narrativa: Como Administrador quiero cargar, aprobar, listar, editar y dar de baja usuarios para controlar quién accede y con qué rol.
- Criterios de Aceptación: Listado de usuarios, asignación de roles, activación de cuentas pendientes y control de acceso.
-
Endpoints:
GET/PUT/DELETE /api/usuarios/,GET /api/usuarios/roles/
Tareas Técnicas Asociadas (#US08):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK36 | API de usuarios (listar, editar, baja) solo Administrador. | Miguel Flores | Sprint 2 | 2 | Alta | Backend API |
| TK37 | Gestión de usuarios: lista, edición y baja con diálogo. | Candelaria Barjollo | Sprint 2 | 2 | Alta | Front / App |
| TK48 | Autorización por perfiles (Administrador / Empleado) y menú por rol. | Miguel Flores | Sprint 2 | 2 | Alta | MenuPrincipalActivity.java |
| TK109 | Cargar usuario y aprobar registros pendientes (Administrador). | Candelaria Barjollo | Sprint 2 | 1 | Media | Backend / App |
-
FR-PROD-ADM-01: Edición y baja lógica de productos (
PUT/DELETE /api/inventario/productos/<id>/). Exclusivo para Administradores.
[US09] Edición y Eliminación de Productos (Admin)
- ID: US09 | Prioridad: Media | Story Points: 4 (Sprint 2: 4 SP)
- Responsable: Pedro Gonzalez
- Narrativa: Como Administrador quiero editar y eliminar productos para mantener el catálogo libre de datos obsoletos.
- Criterios de Aceptación: Modificación de campos de productos y eliminación lógica con control de error si posee existencias.
-
Endpoints:
PUT/DELETE /api/inventario/productos/<id>/
Tareas Técnicas Asociadas (#US09):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK38 | API de productos: edición y baja lógica con respuesta descriptiva. | Pedro Gonzalez | Sprint 2 | 2 | Media | Backend API |
| TK39 | Listado de productos con opciones de editar y eliminar. | Pedro Gonzalez | Sprint 2 | 2 | Media | CargaProductoActivity.java |
- FR-UX-01: Pantalla e instructivos de ayuda para guiar al usuario en la operatoria del sistema.
- FR-UX-02: Adaptabilidad de layouts para orientaciones landscape y tablets, manteniendo el estado de UI ante rotaciones de pantalla.
[US10 & RNF-UX] Ayuda e Instructivos de Uso
- ID: US10 / RNF-UX | Prioridad: Media | Story Points: 4 (Sprint 2: 4 SP)
- Responsable: Miguel Flores / Equipo
- Narrativa: Como usuario quiero ver una pantalla de ayuda con instructivos y contar con un diseño adaptable al rotar el dispositivo.
- Criterios de Aceptación: Pantalla de ayuda funcional, preservación de estado en rotación de pantalla.
Tareas Técnicas Asociadas (#US10 / RNF-UX):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK40 | Activity e instructivo de Ayuda visual. | Miguel Flores | Sprint 2 | 2 | Media | Layout Ayuda |
| TK41 | Layouts landscape y tablet, y conservación de estado al rotar. | Miguel Flores | Sprint 2 | 2 | Media | Layouts XML |
-
FR-LEG-01: Pantalla
TerminosActivitypara visualización de Términos y Condiciones y Políticas de Privacidad (Ley 25.326). -
FR-LEG-02: Mecanismo de arrepentimiento y solicitud de baja de cuenta propia en
BajaDeCuentaconectando conDELETE /api/usuarios/me/.
[US11] Legislación, Términos y Baja de Cuenta
- ID: US11 | Prioridad: Media | Story Points: 5 (Sprint 2: 5 SP)
- Responsables: Aylén Bartolino Luna / Octavio Arnaudo
- Narrativa: Como usuario quiero conocer y controlar el uso de mis datos personales y contar con la opción de darme de baja.
-
Criterios de Aceptación: Visualización de textos legales en
TerminosActivityy opción activa de baja de cuenta enBajaDeCuenta. -
Endpoints:
DELETE /api/usuarios/me/
Tareas Técnicas Asociadas (#US11):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK52 | Legislación en la app: TerminosActivity, términos y 'Darme de baja' (BajaDeCuenta). |
Aylén Bartolino | Sprint 2 | 3 | Media |
TerminosActivity.java, BajaDeCuenta.java
|
| TK105 | Sección de legislación en la Wiki y verificación de cumplimiento normativo. | Octavio Arnaudo | Sprint 2 | 2 | Media | Proteccion-de-Datos.md |
-
FR-PERFIL-01: Consulta y actualización de datos personales del propio usuario autenticado (
PerfilActivityyEditarPerfilActivity) medianteGET/PATCH /api/usuarios/me/.
[US12] Perfil de Usuario Propio
- ID: US12 | Prioridad: Alta | Story Points: 4 (Sprint 2: 4 SP)
- Responsable: Candelaria Barjollo
- Narrativa: Como usuario quiero ver y editar mis datos personales para mantener mi información actualizada.
-
Criterios de Aceptación: Vista de perfil en
PerfilActivityy formulario de modificación enEditarPerfilActivityconectado a la API. -
Endpoints:
GET/PATCH /api/usuarios/me/
Tareas Técnicas Asociadas (#US12):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK94 |
PerfilApiService y DTOs (PerfilResponse, PerfilUpdateRequest). |
Candelaria Barjollo | Sprint 2 | 2 | Alta | PerfilApiService.java |
| TK95 |
PerfilActivity y EditarPerfilActivity: ver y editar mis datos. |
Candelaria Barjollo | Sprint 2 | 2 | Alta |
PerfilActivity.java, EditarPerfilActivity.java
|
- PE-01: Tiempo de respuesta de la API < 1s para consultas de inventario y autenticación.
- PE-02: Carga fluida de RecyclerViews de stock y sucursales con scroll reactivo.
-
Arquitectura Android: Aplicación nativa en Java, arquitectura por capas (
network,repositorio,sesion,validacion) y vistas XML con Material Design. -
Arquitectura Backend: Django REST Framework expuesto en
/api/con base de datos MySQL.
-
NFR-SEC-01: Inyección automática del header
Authorization: Bearer <token>medianteAuthInterceptor. -
NFR-SEC-02: Gestión centralizada de sesión mediante
SesionManager(SharedPreferences). -
NFR-SEC-03: Registro automático de eventos sensibles en la tabla
LogAuditoriaen servidor (#TK51). - NFR-SEC-04: Comunicaciones encriptadas vía HTTPS / TLS 1.2+.
Tareas Técnicas de Ciberseguridad (#RNF-SEG):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK45 | Secreción de credenciales, eliminación de claves hardcodeadas y uso de .env. |
Aylén Bartolino | Sprint 2 | 1 | Alta | Config / .env
|
| TK46 | Configuración de CORS, ALLOWED_HOSTS y límite de intentos de login en servidor. |
Aylén Bartolino | Sprint 2 | 1 | Alta | Backend Settings |
| TK49 | Control de sesiones: access token corto, refresh token con rotación. | Aylén Bartolino | Sprint 2 | 2 | Alta | SesionManager.java |
| TK50 | TLS: redirección HTTPS y network_security_config en Android. |
Aylén Bartolino | Sprint 2 | 1 | Alta | network_security_config.xml |
| TK51 | Auditoría de seguridad: registro de eventos en tabla LogAuditoria. |
Aylén Bartolino | Sprint 2 | 2 | Alta | LogAuditoria |
| TK53 | Sistema de Gestión de Riesgos y revisión del plan de seguridad. | Octavio Arnaudo | Sprint 2 | 1 | Media | Ciberseguridad.md |
| TK54 | Video corto sobre arquitectura JWT, autenticación y autorización. | Octavio Arnaudo | Sprint 2 | 1 | Media | Video demo |
| TK55..59 | Casos de prueba de seguridad (TC-SEG-01 al TC-SEG-05). | Aylén Bartolino / Pedro González | Sprint 2 | 5 | Alta | Planilla de Pruebas |
-
NFR-QA-01: Suite de pruebas unitarias implementada en
ValidadoresTest.java(app/src/test/java/com/ispc/todostock/validacion/) aplicando el patrón Arrange-Act-Assert (AAA) sobre contraseñas, emails, DNI y edad mínima (+18).
Tareas Técnicas de Testing y Calidad (#ENABLER-QA):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK60 |
[AUT-UNIT-01] Tests unitarios de validadores en ValidadoresTest.java (patrón AAA). |
Aylén Bartolino | Sprint 2 | 3 | Alta | ValidadoresTest.java |
| TK61 |
[AUT-UNIT-02] Tests unitarios de stock bajo umbral y mappers. |
Virginia Garcia | Sprint 2 | 2 | Media | Tests unitarios |
| TK62 |
[AUT-UNIT-03] Tests unitarios de repositorios. |
Aylén Bartolino | Sprint 2 | 2 | Media | Tests unitarios |
| TK63 |
[AUT-UNIT-04] Tests unitarios de token, sesión y AuthInterceptor. |
Aylén Bartolino | Sprint 2 | 2 | Media | Tests unitarios |
| TK80..89 | Plan de Pruebas, ejecución de casos TC-L, TC-STK, TC-MOV, TC-REG, TC-CP, TC-C y planilla. | Octavio Arnaudo | Sprint 2 | 10 | Alta | Testing-y-Calidad.md |
| TK96 | Informe de Accesibilidad y auditoría visual de la app. | Octavio Arnaudo | Sprint 2 | 1 | Media | Accesibilidad.md |
| TK110 | Casos de prueba de API y reporte de bugs del endpoint de registro. | Octavio Arnaudo | Sprint 2 | 2 | Media | Reporte Bugs |
Tareas Técnicas Transversales y de Proceso (#MGMT / #RELEASE):
| ID | Tarea Técnica | Responsable | Sprint | SP | Prioridad | Entregable / Archivo |
|---|---|---|---|---|---|---|
| TK28 | Setup del repo, estrategia GitFlow, Kanban y Wiki. | Octavio Arnaudo | Sprint 0 | 2 | Alta | GitHub / Wiki |
| TK29 | Vincular documentación IEEE830 desde la Wiki. | Octavio Arnaudo | Sprint 0 | 1 | Media | Wiki IEEE830 |
| TK30 | Consolidar plan de pruebas y los 12 test cases en la Wiki. | Octavio Arnaudo | Sprint 1 | 2 | Alta | Testing-y-Calidad.md |
| TK31 | Redactar borrador del plan de ciberseguridad y JWT. | Octavio Arnaudo | Sprint 1 | 2 | Alta | Ciberseguridad.md |
| TK32 | Cargar Anexo II del IEEE830 con capturas de pantalla. | Octavio Arnaudo | Sprint 1 | 1 | Media | Anexos.md |
| TK33 | GitHub Action para notificaciones de merges a develop. |
Miguel Flores | Sprint 1 | 1 | Media | .github/workflows/ |
| TK43 | Deploy del backend en Alwaysdata y baseUrl de release. | Miguel Flores | Sprint 2 | 1 | Alta | Backend Deployment |
| TK44 | APK release en main e instrucciones de instalación. |
Miguel Flores | Sprint 2 | 1 | Alta | Release v1.0.0 |
| TK97 | Grabar y editar el video demo grupal (máx. 3 minutos). | Aylén Bartolino | Sprint 2 | 2 | Media | Video Demo |
| TK98 | Milestone Sprint 2, etiquetas e Issues en GitHub. | Octavio Arnaudo | Sprint 2 | 2 | Alta | GitHub Milestones |
| TK99 | Gestión de reporte y seguimiento de bugs. | Octavio Arnaudo | Sprint 2 | 1 | Media | GitHub Issues |
| TK100 | Registro de las 4 ceremonias del Sprint 2 en la Wiki. | Octavio Arnaudo | Sprint 2 | 2 | Alta | Ceremonias-Scrum.md |
| TK101 | IEEE830 actualizado con los requerimientos del Sprint 2. | Octavio Arnaudo | Sprint 2 | 1 | Alta | IEEE830.md |
| TK102 | Diagrama de navegabilidad y Anexo II con capturas nuevas. | Octavio Arnaudo | Sprint 2 | 2 | Alta | Navegabilidad.md |
| TK103 | Wiki: avances individuales, de equipo y enlaces externos. | Octavio Arnaudo | Sprint 2 | 1 | Media | Wiki Home |
| TK104 | Product Backlog de la Wiki alineado con el backlog general. | Octavio Arnaudo | Sprint 2 | 1 | Alta | Product-Backlog.md |
| TK106 | README del repositorio actualizado. | Octavio Arnaudo | Sprint 2 | 1 | Alta | README.md |
| TK107 | Guion y coordinación del video demo grupal. | Aylén Bartolino | Sprint 2 | 1 | Media | Guion Demo |
| TK108 | Commit en main con el backlog y plantillas de Issues/PR. |
Miguel Flores | Sprint 2 | 1 | Alta | Repositorio |
| TK111 | Guía de Aclaraciones para Evaluación Docente. | Octavio Arnaudo | Sprint 2 | 1 | Alta | GUÍA-DOCENTE.md |
El esquema relacional está diseñado para soportar integridad referencial estricta.
Note
Diagrama Entidad-Relación (ER)
erDiagram
ROLE {
int id PK
string nombre UK
string descripcion
}
USUARIO {
int id PK
string nombre
string email UK
string dni UK
date fecha_nacimiento
string password
int rol_id FK
}
CATEGORIA {
int id_cat PK
string nombre
}
PRODUCTO {
int id_art PK
string nombre
string codigo UK
string descripcion
decimal precio_venta
int stock_min_global
int id_cat FK
}
SUCURSAL {
int id_suc PK
string nombre
string direccion
boolean es_central
}
STOCK_SUCURSAL {
int id_stock PK
int id_art FK
int id_suc FK
int cantidad_stock
int stock_min
}
PROVEEDOR {
int id_prov PK
string nombre
string cuit UK
string telefono
string email
string direccion
}
PRODUCTO_PROVEEDOR {
int id_enlace PK
int id_art FK
int id_prov FK
decimal precio_costo
}
MOVIMIENTO {
int id_mov PK
string tipo
datetime fecha_hora
int cantidad
int stock_previo
string motivo
int id_art FK
int id_suc FK
int id_usuario FK
int id_prov FK
}
ROLE ||--o{ USUARIO : "asignado_a"
CATEGORIA ||--o{ PRODUCTO : "clasifica"
USUARIO ||--o{ MOVIMIENTO : "registra"
PRODUCTO ||--o{ STOCK_SUCURSAL : "posee"
SUCURSAL ||--o{ STOCK_SUCURSAL : "almacena"
PRODUCTO ||--o{ MOVIMIENTO : "involucra"
SUCURSAL ||--o{ MOVIMIENTO : "ocurre_en"
PROVEEDOR ||--o{ MOVIMIENTO : "origina"
PRODUCTO ||--o{ PRODUCTO_PROVEEDOR : "provisto_por"
PROVEEDOR ||--o{ PRODUCTO_PROVEEDOR : "provee"
- USUARIO: id, nombre, email (PK), password, rol_id.
- PRODUCTO: id_art (PK), nombre, codigo (Unique), precio_venta, stock_min_global.
- SUCURSAL: id_suc (PK), nombre, direccion.
- STOCK_SUCURSAL: id_stock (PK), id_art (FK), id_suc (FK), cantidad_stock.
- MOVIMIENTO: id_mov (PK), tipo, fecha_hora, id_art (FK), id_suc (FK), id_usuario (FK).
| ID Requisito | Caso de Prueba (Wiki) | Método |
|---|---|---|
| FR-AUTH-01 / #US01 | TC-L-01 al TC-L-04 (Login, Validaciones y Sesión) | Automatizado / Unitario (ValidadoresTest) |
| FR-SUC-01 / #US02 | TC-SSUC-01 y TC-SSUC-02 (Selección de Sucursal) | Manual / Integración API |
| FR-STK-01 / #US03 | TC-STK-01 y TC-STK-02 (Stock y Alertas Visuales) | Manual / Integración API |
| FR-CONT-01 / #US04 | TC-C-01 (Contacto y Soporte) | Manual / API |
| FR-PROD-01 / #US05 | TC-CP-01 (Carga de Producto y Validación Válida) | Manual / API |
| FR-MOV-01 / #US06 | TC-MOV-001 al TC-MOV-006 (Movimientos Atómicos) | Manual / Integración API |
| FR-REG-01 / #US07 | TC-REG-01 al TC-REG-04 (Registro de Usuarios, Edad y Validaciones) | Automatizado / Unitario (ValidadoresTest) |
| FR-USR-ADM / #US08 | Verificación de Roles y Menú Condicional | Manual / API |
| FR-PROD-ADM / #US09 | Edición y Eliminación de Productos | Manual / API |
| FR-UX / #US10 | Instructivo de Ayuda y Rotación de Pantalla | Manual |
| FR-LEG / #US11 | Términos, Políticas y Baja de Cuenta (BajaDeCuenta) |
Manual / API |
| FR-PERFIL / #US12 | Consultar y Editar Perfil Propio | Manual / API |
| NFR-SEC / RNF-SEG | TC-SEG-01 al TC-SEG-05 (Hardening de Seguridad y JWT) | Auditoría de Seguridad |
| NFR-QA / ENABLER-QA | Tests Unitarios en ValidadoresTest.java (Patrón AAA) |
Unitario (JUnit) |
El contraste directo entre las especificaciones IEEE 830, el código fuente nativo en app/, el backend y los registros de Pull Requests confirma el cumplimiento total del alcance acordado:
| Requerimiento SRS | Módulo / Historia | Actividades / Componentes | Backend Django (Backend/) |
Cobertura de Tests | Pull Requests Fusionados | Estado |
|---|---|---|---|---|---|---|
| RF-01 / #US01 | Autenticación JWT |
LoginActivity, SesionManager, AuthInterceptor
|
usuarios/views.py (POST /login/) |
test_auth_enforcement.py |
PR #49, PR #50, PR #160 | ✅ CUMPLIDO |
| RF-02 / #US02 | Selección Sucursal |
SeleccionSucursalActivity, SucursalAdapter
|
inventario/views.py (GET /sucursales/) |
test_sucursales.py |
PR #185 | ✅ CUMPLIDO |
| RF-03 / #US03 | Stock e Inventario |
GestionStockActivity, StockAdapter
|
inventario/views.py (GET /stock/) |
test_stock_consolidado.py, ValidadoresTest
|
PR #216, PR #220 | ✅ CUMPLIDO |
| RF-04 / #US04 | Contacto y Soporte |
ContactoActivity, ContactoApiService
|
usuarios/views.py (POST /contacto/) |
TC-C-01 |
PR #192 | ✅ CUMPLIDO |
| RF-05 / #US05 | Alta de Producto | CargaProductoActivity |
inventario/views.py (POST /productos/) |
TC-CP-01 |
PR #197, PR #287 | ✅ CUMPLIDO |
| RF-06 / #US06 | Movimientos Stock | MovimientosActivity |
inventario/views.py (POST /movimientos/) |
test_traslados.py |
PR #185 (ADR-0002) | ✅ CUMPLIDO |
| RF-07 / #US07 | Registro Usuarios |
RegistroActivity, Validadores.java
|
usuarios/views.py (POST /registro/) |
ValidadoresTest.java (AAA) |
PR #171, PR #173, PR #223, PR #283 | ✅ CUMPLIDO |
| RF-08 / #US08 | Administración RBAC |
MenuPrincipalActivity, UsuariosActivosFragment
|
usuarios/views.py (GET/PATCH /usuarios/) |
test_auth_enforcement.py |
PR #160 (ADR-0008), PR #290, PR #300 (TK37) | ✅ CUMPLIDO |
| RF-09 / #US09 | Edición de Producto |
CargaProductoActivity, GestionStockActivity
|
inventario/views.py (PATCH /productos/{id}/) |
test_mobile_api.py |
PR #197, PR #216, PR #296 (TK39), PR #323 | ✅ CUMPLIDO |
| RF-10 / #US10 | Ayuda y Usabilidad |
AyudaActivity, Layouts Apaisados/Tablet |
- |
TC-L-03, TC-L-04
|
PR #217, PR #294 | ✅ CUMPLIDO |
| RF-11 / #US11 | Legislación / Baja |
TerminosActivity, BajaDeCuenta
|
usuarios/views.py (POST /desactivar/) |
TC-SEG-05 |
PR #180, PR #195, PR #217 | ✅ CUMPLIDO |
| RF-12 / #US12 | Perfil Propio |
PerfilActivity, EditarPerfilActivity
|
usuarios/views.py (GET/PATCH /me/) |
usuarios/tests.py |
PR #180 | ✅ CUMPLIDO |
-
Seguridad (RNF-SEG): Verificado mediante el almacenamiento seguro de tokens con
EncryptedSharedPreferences, expiración de acceso a los 15 minutos, rotación de refresh tokens y archivo de seguridadnetwork_security_config.xmllimitando la comunicación a HTTPS. -
Rendimiento y Adaptabilidad (RNF-PERF / RNF-UX): Peticiones asíncronas con Retrofit2 y OkHttp3 en hilos secundarios, renderizado fluido en
RecyclerViewy adaptabilidad completa a orientación Apaisada (Landscape) y Tablets medianteScrollViewy preservación de estado cononSaveInstanceState(#TK41 - PR #294). -
Calidad de Código y Testing (RNF-QA): Cobertura unitaria, red y UI automatizada en Android (
app/src/test/yapp/src/androidTest/):-
Pruebas Unitarias:
ValidadoresTest.java(TK60 - AAA),StockItemTest.java(TK61) yLoginViewModelTest.java(TK62). -
Pruebas de Red:
ParseoRespuestasTest.java(TK64 - 200 OK) yAuthRepositoryTest.java(TK65 - HTTP 500) conMockWebServer. -
Pruebas de UI Automatizadas (Espresso - AUT-UI-01 / TK70 - PR #299): Flujo completo Login ➔ Menú en
LoginFlujoTest.javautilizando Page Objects (LoginScreen,MenuPrincipalScreen),AccessibilityChecks.enable()eIdlingResource. -
Integración de API (Postman - AUT-API-02 / TK68 - PR #298): Suite Postman de catálogo de productos e infraestructura utilitaria en
PostmanConfig.java.
-
Pruebas Unitarias:
- 401 Unauthorized: El JWT ha expirado o es inválido.
- 403 Forbidden: El rol del usuario no tiene permisos para la acción (ej. Empleado intentando acción de Administrador).
- 422 Unprocessable Entity / 400 Bad Request: Error de validación (ej. campos vacíos, contraseñas fuera de norma o DNI/email duplicado).
FIN DEL DOCUMENTO