# Módulo de Stock - Documentación

## Descripción General

El módulo de stock permite gestionar de manera completa el inventario de productos (spares/repuestos), incluyendo ingresos, egresos, control de movimientos, generación de remitos en PDF, carga masiva de artículos, y gestión de fotos y compatibilidades entre productos.

## Funcionalidades Implementadas

### 1. Gestión de Artículos

- **Crear artículos**: Agregar nuevos productos con código de parte, nombre, descripción
- **Editar artículos**: Modificar información de productos existentes
- **Eliminar artículos**: Remover productos del sistema
- **Búsqueda**: Buscar artículos por código, nombre o descripción
- **Estado activo/inactivo**: Controlar qué artículos están disponibles

#### Campos de Artículo
- `code`: Código de parte único
- `name`: Nombre del producto
- `description`: Descripción detallada
- `quantity`: Cantidad en stock
- `min_stock`: Stock mínimo requerido
- `notes`: Notas adicionales
- `active`: Estado activo/inactivo
- `compatible_models`: Modelos compatibles (JSON)

### 2. Gestión de Fotos

- **Subir múltiples fotos**: Cada artículo puede tener varias imágenes
- **Eliminar fotos**: Remover imágenes del producto
- **Validación**: Solo se aceptan archivos de imagen (jpeg, png, gif)
- **Tamaño máximo**: 2MB por imagen

### 3. Compatibilidad entre Productos

- **Agregar compatibilidad**: Relacionar productos que son compatibles entre sí
- **Ver productos compatibles**: Listar todos los productos relacionados
- **Eliminar compatibilidad**: Remover relaciones entre productos

### 4. Ingresos de Stock

- **Registrar ingresos**: Añadir productos al inventario
- **Trazabilidad**: Registro de quién ingresó y cuándo
- **Actualización automática**: El stock se actualiza automáticamente

#### Campos de Ingreso
- Producto seleccionado
- Cantidad ingresada
- Motivo del ingreso
- Notas adicionales
- Usuario que registró

### 5. Egresos de Stock

- **Registrar egresos**: Retirar productos del inventario
- **Asignación**: Indicar a quién se asigna el producto
- **Motivo**: Registrar el motivo del egreso
- **Validación de stock**: Verificar disponibilidad antes del egreso

#### Campos de Egreso
- Producto seleccionado
- Cantidad retirada
- Motivo del egreso
- Persona asignada (usuario)
- Notas adicionales
- Usuario que registró

### 6. Remitos en PDF

- **Generar remito**: Crear documento PDF con los artículos entregados
- **Descargar PDF**: Bajar el archivo PDF
- **Imprimir remito**: Vista previa para impresión
- **Numeración automática**: Formato REM-YYYYMMDD-NNNN
- **Información completa**: Incluye datos del remito, artículos, y firmas

#### Contenido del Remito
- Número de remito
- Fecha y hora de entrega
- Entregado a (persona/organización)
- Generado por (usuario)
- Lista de artículos con código, descripción, cantidad
- Observaciones
- Espacios para firmas

### 7. Carga Masiva (Batch Upload)

- **Importar desde CSV**: Subir archivo CSV con múltiples productos
- **Validación**: Verificar datos antes de importar
- **Logs de errores**: Reportar líneas con errores
- **Resumen**: Mostrar cantidad de productos importados exitosamente

#### Formato CSV
```csv
code,name,description,quantity,min_stock,notes
COD001,Producto 1,Descripción del producto,10,5,Notas adicionales
COD002,Producto 2,Descripción del producto 2,20,10,
```

### 8. Historial de Movimientos

- **Ver todos los movimientos**: Lista completa de entradas y salidas
- **Filtros**: Por tipo (ingreso/egreso/ajuste) y por producto
- **Información detallada**: Usuario, fecha, cantidad, motivo, asignación
- **Editar movimientos**: Modificar información de movimientos previos
- **Eliminar movimientos**: Revertir movimientos incorrectos

## Estructura de Base de Datos

### Tablas Principales

#### `spares` - Productos
- `id`: ID único
- `code`: Código de parte único
- `name`: Nombre del producto
- `description`: Descripción detallada
- `quantity`: Cantidad en stock
- `min_stock`: Stock mínimo
- `compatible_models`: JSON con modelos compatibles
- `notes`: Notas adicionales
- `active`: Estado activo/inactivo
- `created_at`, `updated_at`: Timestamps

#### `spare_compatibilities` - Compatibilidad entre Productos
- `id`: ID único
- `spare_id`: ID del producto principal
- `compatible_spare_id`: ID del producto compatible
- `notes`: Notas sobre la compatibilidad
- `created_at`, `updated_at`: Timestamps

#### `spare_movements` - Movimientos de Stock
- `id`: ID único
- `spare_id`: ID del producto
- `qty_change`: Cantidad modificada
- `type`: Tipo (in, out, adjust)
- `motive`: Motivo del movimiento
- `related_type`: Tipo de relación (opcional)
- `related_id`: ID de relación (opcional)
- `notes`: Notas adicionales
- `user_id`: Usuario que realizó el movimiento
- `assigned_to`: Usuario al que se asignó (egresos)
- `created_at`, `updated_at`: Timestamps

#### `delivery_notes` - Remitos
- `id`: ID único
- `number`: Número de remito (único)
- `user_id`: Usuario que generó el remito
- `delivered_to`: Persona/organización que recibe
- `notes`: Observaciones
- `delivered_at`: Fecha y hora de entrega
- `created_at`, `updated_at`: Timestamps

#### `delivery_note_items` - Items del Remito
- `id`: ID único
- `delivery_note_id`: ID del remito
- `spare_id`: ID del producto
- `quantity`: Cantidad entregada
- `notes`: Notas del item
- `created_at`, `updated_at`: Timestamps

## Rutas Disponibles

### Gestión de Stock
- `GET /stock` - Lista de productos
- `GET /stock/create` - Formulario crear producto
- `POST /stock` - Guardar nuevo producto
- `GET /stock/{spare}` - Ver producto
- `GET /stock/{spare}/edit` - Editar producto
- `PUT /stock/{spare}` - Actualizar producto
- `DELETE /stock/{spare}` - Eliminar producto

### Gestión de Fotos
- `POST /stock/{spare}/images` - Subir imágenes
- `DELETE /stock/{spare}/images/{mediaId}` - Eliminar imagen

### Compatibilidad
- `POST /stock/{spare}/compatibility` - Agregar compatibilidad
- `DELETE /stock/{spare}/compatibility/{compatibleId}` - Eliminar compatibilidad

### Carga Masiva
- `POST /stock/batch-upload` - Importar desde CSV

### Movimientos
- `GET /stock/movements` - Lista de movimientos
- `GET /stock/movements/create` - Crear movimiento
- `POST /stock/movements` - Guardar movimiento
- `GET /stock/movements/{movement}/edit` - Editar movimiento
- `PUT /stock/movements/{movement}` - Actualizar movimiento
- `DELETE /stock/movements/{movement}` - Eliminar movimiento

### Remitos
- `GET /stock/delivery-notes` - Lista de remitos
- `GET /stock/delivery-notes/create` - Crear remito
- `POST /stock/delivery-notes` - Guardar remito
- `GET /stock/delivery-notes/{deliveryNote}` - Ver remito
- `DELETE /stock/delivery-notes/{deliveryNote}` - Eliminar remito
- `GET /stock/delivery-notes/{deliveryNote}/pdf` - Descargar PDF
- `GET /stock/delivery-notes/{deliveryNote}/print` - Imprimir remito

## Modelos Creados

### Spare
- Gestión de productos/re spuestos
- Implementa HasMedia (Spatie MediaLibrary) para fotos
- Relaciones: batches, movements, compatibleWith, compatibleProducts, deliveryNoteItems
- Métodos: getStockAvailableAttribute(), isLowStock(), scopeActive()

### SpareMovement
- Gestión de movimientos de stock
- Relaciones: spare, user, assignedTo, related (polimórfica)
- Scopes: typeIn(), typeOut(), typeAdjust()

### DeliveryNote
- Gestión de remitos
- Relaciones: user, items
- Scope: recent()

### DeliveryNoteItem
- Items de cada remito
- Relaciones: deliveryNote, spare

## Tecnologías Utilizadas

- **Laravel 12**: Framework PHP
- **Spatie MediaLibrary**: Gestión de archivos multimedia
- **DomPDF**: Generación de archivos PDF
- **Inertia.js**: Renderizado de vistas (según implementación)
- **MySQL**: Base de datos

## Controladores

### StockController
- Gestión completa de productos
- Subida de imágenes
- Gestión de compatibilidad
- Carga masiva desde CSV

### SpareMovementController
- Gestión de ingresos y egresos
- Actualización automática de stock
- Trazabilidad completa

### DeliveryNoteController
- Generación de remitos
- Exportación a PDF
- Gestión de entregas

## Uso del Sistema

### Crear un Producto

1. Ir a `/stock/create`
2. Completar formulario con código, nombre, descripción, stock mínimo
3. Opcionalmente subir fotos
4. Guardar

### Registrar un Ingreso

1. Ir a `/stock/movements/create`
2. Seleccionar producto
3. Indicar cantidad y tipo "in"
4. Agregar motivo y notas
5. Guardar

### Registrar un Egreso

1. Ir a `/stock/movements/create`
2. Seleccionar producto
3. Indicar cantidad y tipo "out"
4. Seleccionar persona asignada
5. Agregar motivo y notas
6. Guardar

### Generar un Remito

1. Ir a `/stock/delivery-notes/create`
2. Agregar items del remito (producto y cantidad)
3. Indicar a quién se entrega
4. Agregar observaciones
5. Guardar (el remito se genera automáticamente)
6. Opcionalmente descargar PDF o imprimir

### Cargar Productos por Lote

1. Preparar archivo CSV con el formato indicado
2. Ir a la sección de carga masiva
3. Seleccionar archivo CSV
4. Subir archivo
5. Revisar resumen de importación
6. Verificar errores si los hay

### Ver Historial de Movimientos

1. Ir a `/stock/movements`
2. Usar filtros para buscar movimientos específicos
3. Ver detalles de cada movimiento

## Notas Importantes

- Todas las operaciones requieren autenticación
- El stock se actualiza automáticamente con cada movimiento
- Los remitos no pueden ser editados, solo eliminados (lo que revierte los movimientos)
- Las fotos se almacenan usando Spatie MediaLibrary
- Los movimientos incluyen auditoría completa (quién, cuándo, qué, por qué)
- El sistema valida disponibilidad de stock antes de permitir egresos

## Próximas Mejoras Sugeridas

1. Alertas automáticas de stock bajo
2. Notificaciones por email
3. Integración con códigos de barras
4. Reportes de inventario
5. Historial de precios
6. Múltiples ubicaciones de almacén
7. Movimientos entre ubicaciones
8. Integración con sistemas de compras

## Instalación

Las migraciones ya están creadas y ejecutadas. El módulo está listo para usar.

Para reinstalar desde cero:
```bash
php artisan migrate
```

## Contacto y Soporte

Para dudas o problemas, consultar la documentación de Laravel y los modelos del sistema.











