erp-construccion/docs/02-definicion-modulos/MAI-004-compras-inventarios/_MAP.md

812 lines
32 KiB
Markdown

# _MAP: MAI-004 - Compras e Inventarios
**Epica:** MAI-004
**Nombre:** Compras e Inventarios
**Fase:** 1 - Alcance Inicial
**Presupuesto:** $22,000 MXN
**Story Points:** 48 SP
**Estado:** Documentado
**Sprints:** Sprint 11-14 (Semanas 16.5-22)
**Prioridad:** P1 - Alta
**Ultima actualizacion:** 2025-12-06
---
## Proposito
Implementar sistema completo de gestion de compras e inventarios para construccion con:
- Catalogo de proveedores con calificacion automatica
- Cotizaciones (RFQ) multi-proveedor con comparativo
- Requisiciones y ordenes de compra con flujos de aprobacion
- Inventarios multi-almacen con valorizacion PEPS
- Kardex y analisis de consumo vs presupuesto
- **Integracion con app movil MOB-002 (Almacenista)**
**Justificacion:** Control eficiente de compras e inventarios es critico para optimizar costos, prevenir paros de obra y mantener exactitud en stock desde el inicio de cualquier proyecto.
**Reutilizacion Core:** 80% (concepto de gestion de inventarios adaptado)
---
## Contenido
### Requerimientos Funcionales (4)
| ID | Archivo | Titulo | Estado |
|----|---------|--------|--------|
| RF-PURCH-001 | [RF-PURCH-001-catalogo-proveedores.md](./requerimientos/RF-PURCH-001-catalogo-proveedores.md) | Catalogo de Proveedores y Cotizaciones | Documentado |
| RF-PURCH-002 | [RF-PURCH-002-requisiciones-ordenes-compra.md](./requerimientos/RF-PURCH-002-requisiciones-ordenes-compra.md) | Requisiciones y Ordenes de Compra | Documentado |
| RF-PURCH-003 | [RF-PURCH-003-almacenes-inventarios.md](./requerimientos/RF-PURCH-003-almacenes-inventarios.md) | Almacenes y Control de Inventarios | Documentado |
| RF-PURCH-004 | [RF-PURCH-004-kardex-alertas.md](./requerimientos/RF-PURCH-004-kardex-alertas.md) | Kardex y Alertas de Stock | Documentado |
### Especificaciones Tecnicas (4)
| ID | Archivo | Titulo | RF | Estado |
|----|---------|--------|-------|--------|
| ET-PURCH-001 | [ET-PURCH-001-implementacion-proveedores.md](./especificaciones/ET-PURCH-001-implementacion-proveedores.md) | Implementacion de Proveedores | RF-PURCH-001 | Documentado |
| ET-PURCH-002 | [ET-PURCH-002-implementacion-requisiciones-ordenes.md](./especificaciones/ET-PURCH-002-implementacion-requisiciones-ordenes.md) | Implementacion de Requisiciones y OCs | RF-PURCH-002 | Documentado |
| ET-PURCH-003 | [ET-PURCH-003-implementacion-almacenes.md](./especificaciones/ET-PURCH-003-implementacion-almacenes.md) | Implementacion de Almacenes | RF-PURCH-003 | Documentado |
| ET-PURCH-004 | [ET-PURCH-004-implementacion-kardex-alertas.md](./especificaciones/ET-PURCH-004-implementacion-kardex-alertas.md) | Implementacion de Kardex y Alertas | RF-PURCH-004 | Documentado |
### Historias de Usuario (8)
| ID | Archivo | Titulo | SP | Sprint | Estado |
|----|---------|--------|----|--------|--------|
| US-PURCH-001 | [US-PURCH-001-registro-proveedor.md](./historias-usuario/US-PURCH-001-registro-proveedor.md) | Registro de Proveedor | 5 | 11 | Documentado |
| US-PURCH-002 | [US-PURCH-002-solicitud-cotizaciones.md](./historias-usuario/US-PURCH-002-solicitud-cotizaciones.md) | Solicitar Cotizaciones (RFQ) | 8 | 11 | Documentado |
| US-PURCH-003 | [US-PURCH-003-crear-requisicion-obra.md](./historias-usuario/US-PURCH-003-crear-requisicion-obra.md) | Crear Requisicion desde Obra | 5 | 12 | Documentado |
| US-PURCH-004 | [US-PURCH-004-aprobar-generar-orden-compra.md](./historias-usuario/US-PURCH-004-aprobar-generar-orden-compra.md) | Aprobar y Generar Orden de Compra | 8 | 12 | Documentado |
| US-PURCH-005 | [US-PURCH-005-recibir-material-almacen.md](./historias-usuario/US-PURCH-005-recibir-material-almacen.md) | Recibir Material en Almacen | 5 | 12 | Documentado |
| US-PURCH-006 | [US-PURCH-006-control-almacenes-movimientos.md](./historias-usuario/US-PURCH-006-control-almacenes-movimientos.md) | Control de Almacenes y Movimientos | 7 | 13 | Documentado |
| US-PURCH-007 | [US-PURCH-007-kardex-analisis-consumo.md](./historias-usuario/US-PURCH-007-kardex-analisis-consumo.md) | Kardex y Analisis de Consumo | 5 | 13 | Documentado |
| US-PURCH-008 | [US-PURCH-008-dashboard-inventarios-alertas.md](./historias-usuario/US-PURCH-008-dashboard-inventarios-alertas.md) | Dashboard de Inventarios y Alertas | 5 | 14 | Documentado |
**Total Story Points:** 48 SP
**Distribucion por Sprint:**
- Sprint 11 (13 SP): Proveedores + RFQ + Comparativo
- Sprint 12 (18 SP): Requisiciones + OC + Recepcion
- Sprint 13 (12 SP): Almacenes + Kardex
- Sprint 14 (5 SP): Dashboard + Alertas
### Implementacion
Inventarios de trazabilidad:
- [TRACEABILITY.yml](./implementacion/TRACEABILITY.yml) - Matriz completa de trazabilidad
- [DATABASE.yml](./implementacion/DATABASE.yml) - Objetos de base de datos
- [BACKEND.yml](./implementacion/BACKEND.yml) - Modulos backend
- [FRONTEND.yml](./implementacion/FRONTEND.yml) - Componentes frontend
- [MOBILE.yml](./implementacion/MOBILE.yml) - Especificaciones de app movil MOB-002
### Pruebas
Documentacion de testing:
- [TEST-PLAN.md](./pruebas/TEST-PLAN.md) - Plan de pruebas
- [TEST-CASES.md](./pruebas/TEST-CASES.md) - Casos de prueba
- [INTEGRATION-TESTS.md](./pruebas/INTEGRATION-TESTS.md) - Tests de integracion
---
## Referencias
- **README:** [README.md](./README.md) - Descripcion detallada de la epica
- **Resumen:** [RESUMEN-EPICA-MAI-004.md](./RESUMEN-EPICA-MAI-004.md) - Resumen ejecutivo completo
- **Fase 1:** [../README.md](../README.md) - Informacion de la fase completa
- **Roadmap:** [../ROADMAP-DETALLADO.md](../ROADMAP-DETALLADO.md) - Sprints 11-14
---
## Metricas
| Metrica | Valor |
|---------|-------|
| **Presupuesto estimado** | $22,000 MXN |
| **Presupuesto target** | $22,000 MXN ±5% |
| **Story Points estimados** | 48 SP |
| **Duracion estimada** | 4 sprints (8 semanas) |
| **Reutilizacion Core** | 80% |
| **Integraciones externas** | 0 (internas: 4) |
| **RF a implementar** | 4/4 |
| **ET a implementar** | 4/4 |
| **US a completar** | 8/8 |
---
## Modulos Afectados
### Base de Datos
**Schemas:** `purchasing_management`, `inventory_management`
**Tablas principales (19 tablas):**
purchasing_management:
- `suppliers` - Catalogo de proveedores
- `supplier_ratings` - Calificaciones de proveedores
- `rfqs` - Solicitudes de cotizacion
- `quotes` - Cotizaciones recibidas
- `requisitions` - Requisiciones de material
- `requisition_items` - Detalle de requisiciones
- `requisition_approvals` - Flujo de aprobaciones
- `purchase_orders` - Ordenes de compra
- `purchase_order_items` - Detalle de OCs
- `purchase_order_receipts` - Recepciones de material
- `invoices` - Facturas de proveedores
inventory_management:
- `warehouses` - Almacenes por obra
- `warehouse_locations` - Ubicaciones en almacen
- `inventory_stock` - Existencias actuales
- `inventory_lots` - Lotes para PEPS
- `inventory_movements` - Movimientos de inventario
- `stock_alerts` - Alertas de inventario
- `consumption_analysis` - Analisis de consumo
- `material_stock_config` - Configuracion de umbrales
**Funciones y Triggers:**
- Calculo de scoring de proveedores (0-100)
- Valorizacion PEPS automatica
- Actualizacion de stock en movimientos
- Generacion automatica de alertas
- Calculo de consumo vs presupuesto
**ENUMs:**
- `supplier_status` (active, suspended, blacklisted)
- `rfq_status` (draft, sent, closed)
- `requisition_status` (draft, sent, approved, rejected, converted)
- `purchase_order_status` (draft, sent, confirmed, received_partial, received_total, cancelled)
- `movement_type` (entry, exit, transfer, adjustment)
- `alert_type` (stock_min, reorder_point, overconsumption, no_movement, stock_max)
### Backend
**Modulo:** `purchases` + `inventory`
**Path:** `apps/backend/src/modules/`
**Services:**
purchases:
- `SupplierService` - CRUD y calificacion de proveedores
- `RFQService` - Gestion de cotizaciones
- `QuoteService` - Comparacion y scoring
- `RequisitionService` - Requisiciones con aprobaciones
- `PurchaseOrderService` - Ordenes de compra y recepciones
- `InvoiceService` - Registro de facturas
inventory:
- `WarehouseService` - Gestion de almacenes
- `InventoryService` - Control de stock
- `MovementService` - Entradas, salidas, traspasos
- `KardexService` - Trazabilidad de movimientos
- `AlertService` - Alertas inteligentes
- `AnalysisService` - Consumo vs presupuesto
**CRON Jobs:**
- Analisis diario de consumo
- Generacion de alertas automaticas
- Actualizacion de calificaciones de proveedores
- Deteccion de materiales sin movimiento
### Frontend Web
**Features:** `purchases`, `inventory`
**Path:** `apps/frontend/src/features/`
**Componentes principales:**
Proveedores y Cotizaciones:
- `SuppliersListView` - Lista de proveedores
- `SupplierFormModal` - Alta/edicion de proveedor
- `SupplierDetailView` - Detalle con historial
- `RFQFormModal` - Crear solicitud de cotizacion
- `QuoteComparisonView` - Comparativo visual de cotizaciones
- `SupplierRatingWidget` - Calificacion 0-100
Requisiciones y OCs:
- `RequisitionsListView` - Lista de requisiciones
- `RequisitionFormModal` - Crear requisicion
- `RequisitionApprovalPanel` - Panel de aprobaciones
- `PurchaseOrdersListView` - Lista de ordenes
- `PurchaseOrderFormModal` - Generar OC
- `PurchaseOrderPDFPreview` - Vista previa de PDF
- `ReceiptModal` - Registro de recepciones
Inventarios:
- `WarehousesListView` - Lista de almacenes
- `WarehouseDetailView` - Detalle con ubicaciones
- `InventoryStockTable` - Existencias actuales
- `MovementFormModal` - Registro de movimientos
- `KardexView` - Trazabilidad por material
- `StockAlertsPanel` - Panel de alertas
- `ConsumptionAnalysisView` - Analisis vs presupuesto
- `InventoryDashboard` - Dashboard ejecutivo
**Guards:** AuthGuard, RoleGuard (permisos especificos)
### App Movil (React Native)
**App:** MOB-002 - Almacenista
**Plataformas:** Android, iOS
**Framework:** React Native + Expo
**Features:** `warehouse-operations`
**Path:** `apps/mobile/almacen/src/features/`
**Pantallas principales:**
1. **Login**
- Autenticacion con credenciales ERP
- Modo offline con cache de credenciales
2. **Selector de Obra/Almacen**
- Lista de obras asignadas al almacenista
- Seleccion de almacen activo
3. **Dashboard de Almacen**
- Resumen de existencias
- Solicitudes de salida pendientes
- Alertas de stock bajo
- Recepciones programadas
4. **Recepcion de Material**
- Busqueda de orden de compra
- Escaneo de codigo de barras/QR
- Registro de cantidad recibida
- Captura de foto de evidencia
- Asignacion de ubicacion
- Firma digital del proveedor
5. **Salida de Material**
- Lista de solicitudes pendientes
- Verificacion de existencias
- Registro de cantidad entregada
- Firma digital del receptor
- Vinculacion con partida presupuestal
6. **Consulta de Inventario**
- Busqueda de materiales
- Existencias en tiempo real
- Ubicacion en almacen
- Movimientos recientes
7. **Inventario Fisico**
- Modo de conteo ciclico
- Escaneo de materiales
- Registro de cantidades contadas
- Generacion de diferencias
8. **Transferencias**
- Transferencias entre almacenes
- Seleccion de destino
- Registro de salida/entrada
- Tracking de transferencias en transito
9. **Historial de Movimientos**
- Listado de movimientos del dia
- Filtros por tipo de movimiento
- Estado de sincronizacion
- Reenvio de movimientos fallidos
**Funcionalidades especiales:**
- **Modo Offline:** SQLite local con cola de sincronizacion
- **Escaner:** Codigos de barras y QR (react-native-camera)
- **Firma Digital:** Canvas para captura de firmas
- **Geolocalizacion:** GPS en movimientos
- **Fotos:** Captura de evidencia fotografica
- **Push Notifications:** Alertas de solicitudes pendientes
- **Sincronizacion:** Background sync automatica
**Tecnologias:**
- React Native 0.73+
- Expo 50
- WatermelonDB (offline storage)
- Zustand (state management)
- Axios (API sync)
- expo-camera (escaneo)
- expo-location (GPS)
- Firebase Cloud Messaging (push)
**Validaciones en App:**
| Validacion | Descripcion | Accion si falla |
|------------|-------------|-----------------|
| **Existencias** | Verificar stock disponible antes de salida | Bloquear salida, mostrar disponible |
| **Orden de compra** | Validar OC activa en recepciones | Advertencia, permitir recepcion manual |
| **Ubicacion** | Material debe tener ubicacion asignada | Solicitar ubicacion antes de guardar |
| **Cantidades** | No permitir cantidades negativas | Validacion en formulario |
| **Firma digital** | Requerir firma en entregas | Bloquear guardado sin firma |
**Modo Offline:**
Capacidades:
- Almacenar hasta 1000 movimientos en cola
- Cache de inventario actualizado diariamente
- Cache de ordenes de compra pendientes
- Indicador visual de movimientos pendientes de sincronizacion
Sincronizacion:
- Automatica al detectar conexion
- Manual por boton "Sincronizar ahora"
- Resolucion de conflictos (ultimo gana)
- Retry automatico con backoff exponencial
---
## Flujo de Documentacion RF → ET → US → Codigo
### Ejemplo: Requisiciones de Material
```
RF-PURCH-002: Requisiciones y Ordenes de Compra
ET-PURCH-002: Implementacion de Requisiciones y OCs
├─ Schemas SQL (requisitions, requisition_items, requisition_approvals)
├─ TypeORM Entities (Requisition, RequisitionItem, RequisitionApproval)
├─ Services (RequisitionService con logica de aprobaciones)
├─ Controllers (RequisitionController con endpoints REST)
└─ React Components (RequisitionFormModal, RequisitionApprovalPanel)
US-PURCH-003: Crear Requisicion desde Obra (5 SP)
├─ Frontend: RequisitionFormModal con selector de materiales
├─ Backend: POST /api/v1/requisiciones
├─ Database: INSERT en requisitions + requisition_items
└─ Notificacion: Email al aprobador nivel 1
US-PURCH-004: Aprobar y Generar Orden de Compra (8 SP)
├─ Frontend: RequisitionApprovalPanel + PurchaseOrderFormModal
├─ Backend: POST /api/v1/requisiciones/:id/aprobar
├─ Backend: POST /api/v1/ordenes-compra (conversion automatica)
├─ Database: UPDATE requisition_status, INSERT purchase_orders
└─ PDF: Generacion de OC para proveedor
Codigo Implementado:
├─ apps/backend/src/modules/purchases/
│ ├─ entities/requisition.entity.ts
│ ├─ services/requisition.service.ts
│ ├─ controllers/requisition.controller.ts
│ └─ dto/create-requisition.dto.ts
├─ apps/frontend/src/features/purchases/
│ ├─ components/RequisitionFormModal.tsx
│ ├─ components/RequisitionApprovalPanel.tsx
│ └─ hooks/useRequisitions.ts
└─ apps/database/migrations/
└─ 003_create_requisitions_schema.sql
```
### Ejemplo: Movimientos de Inventario (App Movil)
```
RF-PURCH-003: Almacenes y Control de Inventarios
+
RF-PURCH-004: Kardex y Alertas de Stock
ET-PURCH-003: Implementacion de Almacenes
+
ET-PURCH-004: Implementacion de Kardex y Alertas
├─ Schemas SQL (warehouses, inventory_stock, inventory_movements, inventory_lots)
├─ TypeORM Entities (Warehouse, InventoryStock, InventoryMovement)
├─ Services (InventoryService, MovementService, AlertService)
├─ Triggers (actualizacion automatica de stock con PEPS)
└─ API Endpoints para app movil
US-PURCH-005: Recibir Material en Almacen (5 SP)
├─ App Movil: ReceptionScreen con escaneo QR
├─ Backend: POST /api/v1/inventario/entradas
├─ Database: INSERT inventory_movements + UPDATE inventory_stock
├─ PEPS: Creacion de nuevo lote (inventory_lots)
└─ Notificacion: Push al residente de obra
US-PURCH-006: Control de Almacenes y Movimientos (7 SP)
├─ App Movil: MovementsScreen con tipos (entrada/salida/traspaso)
├─ Frontend Web: InventoryStockTable + MovementFormModal
├─ Backend: API completa de movimientos
├─ Database: Triggers para stock automatico
└─ Alertas: Generacion de stock_alerts si < umbral
Codigo Implementado:
├─ apps/backend/src/modules/inventory/
│ ├─ entities/warehouse.entity.ts
│ ├─ entities/inventory-movement.entity.ts
│ ├─ services/inventory.service.ts
│ ├─ services/movement.service.ts
│ └─ services/alert.service.ts
├─ apps/frontend/src/features/inventory/
│ ├─ components/InventoryStockTable.tsx
│ ├─ components/MovementFormModal.tsx
│ └─ components/StockAlertsPanel.tsx
└─ apps/mobile/almacen/src/features/warehouse/
├─ screens/ReceptionScreen.tsx
├─ screens/MovementsScreen.tsx
├─ screens/InventoryScreen.tsx
└─ services/offline-sync.service.ts
```
---
## Integracion con App Movil MOB-002 (Almacenista)
### Arquitectura de Integracion
```
┌──────────────────────────────────────────────────────────────┐
│ Backend (NestJS) │
│ │
│ ┌────────────────────┐ ┌─────────────────────┐ │
│ │ PurchaseController │ │ InventoryController │ │
│ └────────┬───────────┘ └──────────┬──────────┘ │
│ │ │ │
│ ┌────────▼───────────┐ ┌─────────▼──────────┐ │
│ │ PurchaseOrderService│ │ InventoryService │ │
│ └────────┬───────────┘ └──────────┬─────────┘ │
│ │ │ │
│ ┌────────▼──────────────────────────────▼─────────┐ │
│ │ PostgreSQL Database │ │
│ │ - purchasing_management schema │ │
│ │ - inventory_management schema │ │
│ └─────────────────────────────────────────────────┘ │
└──────────────────────────┬───────────────────────────────────┘
│ REST API
│ WebSocket (notificaciones)
┌──────────────────────────▼───────────────────────────────────┐
│ App Movil MOB-002 (React Native) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Reception │ │ Exit │ │ Inventory │ │
│ │ Screen │ │ Screen │ │ Screen │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌──────▼─────────────────▼─────────────────▼───────┐ │
│ │ Movement Service (React Native) │ │
│ │ - API calls con retry │ │
│ │ - Offline queue management │ │
│ └──────────────────────┬───────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼───────────────────────────┐ │
│ │ WatermelonDB (SQLite - Offline Storage) │ │
│ │ - movements_queue (pendientes sincronizacion) │ │
│ │ - inventory_cache (datos offline) │ │
│ │ - purchase_orders_cache │ │
│ └──────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
### API Endpoints para App Movil
**Autenticacion:**
```
POST /api/v1/auth/login
POST /api/v1/auth/refresh-token
```
**Recepciones de Material:**
```
GET /api/v1/ordenes-compra/pendientes-recepcion
GET /api/v1/ordenes-compra/:id
POST /api/v1/inventario/entradas
POST /api/v1/inventario/entradas/:id/upload-photo
```
**Salidas de Material:**
```
GET /api/v1/inventario/solicitudes-salida
POST /api/v1/inventario/salidas
POST /api/v1/inventario/solicitudes-salida/:id/aprobar
POST /api/v1/inventario/solicitudes-salida/:id/rechazar
```
**Consulta de Inventario:**
```
GET /api/v1/inventario/existencias?almacen_id=:id
GET /api/v1/inventario/buscar?q=:query
GET /api/v1/inventario/ubicacion/:material_id
```
**Transferencias:**
```
POST /api/v1/inventario/transferencias
GET /api/v1/inventario/transferencias/pendientes
POST /api/v1/inventario/transferencias/:id/confirmar-recepcion
```
**Inventario Fisico:**
```
POST /api/v1/inventario/conteo-fisico
POST /api/v1/inventario/conteo-fisico/:id/ajustar
GET /api/v1/inventario/diferencias
```
**Sincronizacion:**
```
POST /api/v1/sync/movements/batch
GET /api/v1/sync/inventory/delta?last_sync=:timestamp
```
### Flujo de Sincronizacion Offline
```mermaid
sequenceDiagram
participant App as App Movil
participant Queue as Cola Local
participant API as Backend API
participant DB as PostgreSQL
Note over App: Sin conexion a internet
App->>Queue: Guardar movimiento localmente
Queue-->>App: Confirmacion local
Note over App: Conexion restaurada
App->>App: Detectar conexion
App->>Queue: Obtener movimientos pendientes
Queue-->>App: Lista de movimientos
loop Por cada movimiento
App->>API: POST /api/v1/sync/movements/batch
API->>DB: Guardar movimiento
DB-->>API: Confirmacion
API-->>App: Success (movement_id)
App->>Queue: Marcar como sincronizado
end
App->>API: GET /api/v1/sync/inventory/delta
API->>DB: Obtener cambios desde last_sync
DB-->>API: Delta de inventario
API-->>App: Inventario actualizado
App->>App: Actualizar cache local
```
### Resolucion de Conflictos
| Escenario | Estrategia | Accion |
|-----------|-----------|--------|
| **Mismo movimiento duplicado** | Detectar por UUID generado en app | Rechazar duplicado, notificar en app |
| **Stock insuficiente en salida** | Validar en servidor | Rechazar movimiento, actualizar cache |
| **Material eliminado** | Validar existencia en servidor | Rechazar movimiento, sincronizar catalogo |
| **Orden de compra cancelada** | Validar estado en servidor | Rechazar recepcion, notificar en app |
| **Cambios concurrentes de stock** | Ultimo movimiento gana | Aplicar movimiento, recalcular stock |
---
## Alertas Inteligentes
### Tipos de Alertas
1. **Stock Minimo** (alert_type: `stock_min`)
- Trigger: `stock_actual < umbral_minimo`
- Severidad: Alta
- Accion: Notificar a almacenista + compras
2. **Punto de Reorden** (alert_type: `reorder_point`)
- Trigger: `stock_actual <= punto_reorden`
- Severidad: Media
- Accion: Sugerir crear requisicion
3. **Sobreconsumo** (alert_type: `overconsumption`)
- Trigger: `consumo_real > presupuesto * 1.05`
- Severidad: Alta
- Accion: Notificar a residente + jefe de proyecto
4. **Sin Movimiento** (alert_type: `no_movement`)
- Trigger: Materiales sin movimiento en 90 dias
- Severidad: Baja
- Accion: Sugerir transferencia o venta
5. **Stock Maximo** (alert_type: `stock_max`)
- Trigger: `stock_actual > umbral_maximo`
- Severidad: Media
- Accion: Alertar de exceso de inventario
### Configuracion de Umbrales
Por defecto:
- Stock minimo: 10% del presupuestado
- Punto de reorden: 20% del presupuestado
- Stock maximo: 150% del presupuestado
Configurable por:
- Material especifico
- Almacen
- Obra
---
## Testing
### Unit Tests (Backend)
```typescript
describe('InventoryService', () => {
it('should calculate PEPS cost correctly')
it('should prevent negative stock exits')
it('should generate stock alerts when below threshold')
it('should update stock automatically on movements')
})
describe('RequisitionService', () => {
it('should validate budget availability')
it('should handle approval workflow correctly')
it('should convert requisition to purchase order')
})
describe('PurchaseOrderService', () => {
it('should calculate totals with taxes')
it('should generate PDF correctly')
it('should track partial receptions')
})
```
### E2E Tests (App Movil)
```typescript
describe('Warehouse Operations E2E', () => {
it('should complete material reception flow')
it('should process material exit request')
it('should handle offline mode correctly')
it('should sync pending movements when online')
it('should scan QR code and fetch material')
})
```
### Integration Tests
```typescript
describe('Purchase to Inventory Integration', () => {
it('should create inventory entry from PO reception')
it('should update stock with PEPS valuation')
it('should link exit to budget item')
it('should generate alerts on low stock')
})
```
---
## Riesgos Especificos
| Riesgo | Probabilidad | Impacto | Mitigacion |
|--------|-------------|---------|------------|
| **Complejidad de PEPS** | Media | Alto | Triggers bien probados, stored procedures |
| **Performance con miles de movimientos** | Media | Medio | Indices apropiados, paginacion, archivado |
| **Sincronizacion offline falla** | Media | Alto | Cola persistente, retry automatico, logs detallados |
| **Conflictos de stock concurrente** | Alta | Medio | Validaciones en servidor, locks transaccionales |
| **Adopcion de app movil por almacenistas** | Media | Alto | UI simple, capacitacion, modo offline robusto |
---
## Checklist de Implementacion
### Backend
- [ ] Schemas SQL completos (purchasing_management, inventory_management)
- [ ] TypeORM entities con relaciones
- [ ] Services con logica de negocio
- [ ] Triggers para PEPS y stock automatico
- [ ] API REST completa
- [ ] Generacion de PDFs (ordenes de compra)
- [ ] Sistema de notificaciones (email + in-app)
- [ ] CRON jobs para analisis y alertas
- [ ] Tests unitarios >80% coverage
### Frontend Web
- [ ] Gestion de proveedores y calificaciones
- [ ] RFQ y comparativo de cotizaciones
- [ ] Requisiciones con flujo de aprobacion
- [ ] Ordenes de compra con PDFs
- [ ] Gestion de almacenes y ubicaciones
- [ ] Control de movimientos de inventario
- [ ] Kardex detallado por material
- [ ] Dashboard de inventarios con graficas
- [ ] Panel de alertas
- [ ] Analisis de consumo vs presupuesto
### App Movil MOB-002
- [ ] Login y autenticacion
- [ ] Selector de obra/almacen
- [ ] Recepcion de material con escaneo QR
- [ ] Procesamiento de solicitudes de salida
- [ ] Consulta de inventario en tiempo real
- [ ] Inventario fisico/conteo ciclico
- [ ] Transferencias entre almacenes
- [ ] Captura de firma digital
- [ ] Modo offline con WatermelonDB
- [ ] Cola de sincronizacion automatica
- [ ] Push notifications
- [ ] UI optimizada para campo
### Database
- [ ] Schemas y tablas creadas
- [ ] Funciones de scoring y PEPS
- [ ] Triggers de stock automatico
- [ ] Triggers de alertas
- [ ] Indices optimizados
- [ ] Politicas RLS para multi-tenancy
### Testing
- [ ] Unit tests backend >80%
- [ ] E2E tests de app movil
- [ ] Integration tests flujo completo
- [ ] Tests de sincronizacion offline
- [ ] Tests de PEPS con multiples lotes
- [ ] Performance tests con volumen alto
### Despliegue
- [ ] Variables de entorno configuradas
- [ ] Deploy de app a stores (TestFlight, Play Store)
- [ ] Configuracion de push notifications
- [ ] Monitoreo de sincronizacion
- [ ] Logs de errores (Sentry)
- [ ] Documentacion de API
- [ ] Manual de usuario de app movil
---
## Quick Links
### Documentacion Tecnica
- Matriz de trazabilidad: [TRACEABILITY.yml](./implementacion/TRACEABILITY.yml)
- Modelo de datos: [DATABASE.yml](./implementacion/DATABASE.yml)
- Especificaciones backend: [BACKEND.yml](./implementacion/BACKEND.yml)
- Especificaciones app movil: [MOBILE.yml](./implementacion/MOBILE.yml)
### Historias de Usuario por Funcionalidad
**Proveedores y Cotizaciones:**
- [US-PURCH-001](./historias-usuario/US-PURCH-001-registro-proveedor.md) - Registro de Proveedor
- [US-PURCH-002](./historias-usuario/US-PURCH-002-solicitud-cotizaciones.md) - Solicitar Cotizaciones (RFQ)
**Requisiciones y Ordenes de Compra:**
- [US-PURCH-003](./historias-usuario/US-PURCH-003-crear-requisicion-obra.md) - Crear Requisicion desde Obra
- [US-PURCH-004](./historias-usuario/US-PURCH-004-aprobar-generar-orden-compra.md) - Aprobar y Generar Orden de Compra
- [US-PURCH-005](./historias-usuario/US-PURCH-005-recibir-material-almacen.md) - Recibir Material en Almacen
**Almacenes e Inventarios:**
- [US-PURCH-006](./historias-usuario/US-PURCH-006-control-almacenes-movimientos.md) - Control de Almacenes y Movimientos
- [US-PURCH-007](./historias-usuario/US-PURCH-007-kardex-analisis-consumo.md) - Kardex y Analisis de Consumo
- [US-PURCH-008](./historias-usuario/US-PURCH-008-dashboard-inventarios-alertas.md) - Dashboard de Inventarios y Alertas
### Requerimientos Funcionales por Subsistema
**Compras:**
- [RF-PURCH-001](./requerimientos/RF-PURCH-001-catalogo-proveedores.md) - Catalogo de Proveedores y Cotizaciones
- [RF-PURCH-002](./requerimientos/RF-PURCH-002-requisiciones-ordenes-compra.md) - Requisiciones y Ordenes de Compra
**Inventarios:**
- [RF-PURCH-003](./requerimientos/RF-PURCH-003-almacenes-inventarios.md) - Almacenes y Control de Inventarios
- [RF-PURCH-004](./requerimientos/RF-PURCH-004-kardex-alertas.md) - Kardex y Alertas de Stock
### Especificaciones Tecnicas
- [ET-PURCH-001](./especificaciones/ET-PURCH-001-implementacion-proveedores.md) - Implementacion de Proveedores
- [ET-PURCH-002](./especificaciones/ET-PURCH-002-implementacion-requisiciones-ordenes.md) - Implementacion de Requisiciones y OCs
- [ET-PURCH-003](./especificaciones/ET-PURCH-003-implementacion-almacenes.md) - Implementacion de Almacenes
- [ET-PURCH-004](./especificaciones/ET-PURCH-004-implementacion-kardex-alertas.md) - Implementacion de Kardex y Alertas
---
## Lessons Learned (a documentar post-implementacion)
1. **PEPS requiere triggers robustos:** La valorizacion automatica es compleja, requiere testing exhaustivo
2. **Modo offline es critico:** Obras no siempre tienen conexion, cola de sincronizacion debe ser solida
3. **UX simple en app movil:** Almacenistas necesitan flujos rapidos y directos
4. **Alertas deben ser accionables:** No solo notificar, sino sugerir acciones concretas
5. **Integracion con presupuestos clave:** Vinculacion temprana con MAI-002 evita retrabajo
---
## Siguiente Paso
Iniciar implementacion comenzando por:
1. Setup de schemas de base de datos
2. Backend de proveedores y cotizaciones (Sprint 11)
3. Frontend de requisiciones y ordenes de compra (Sprint 12)
4. App movil MOB-002 en paralelo con inventarios (Sprint 13-14)
---
**Generado:** 2025-12-06
**Mantenedores:** @tech-lead @backend-team @mobile-team @inventory-team
**Estado:** Documentado
**Prioridad:** P1 - Alta para control de costos y prevencion de paros