# _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
