# Stock Manager Home

Sistema de gestión de inventario y asignación de activos desarrollado con Next.js 15, Prisma, PostgreSQL y NextAuth.

## 📋 Descripción

Stock Manager es una aplicación web completa para la gestión de inventarios, activos y asignaciones de equipamiento. Permite controlar tanto ítems genéricos (gestionados por cantidad) como activos serializados (con número de serie único), registrar movimientos de stock, y gestionar asignaciones a destinatarios por departamentos.

## ✨ Características principales

### Gestión de Inventario

- **Ítems genéricos**: Productos sin número de serie, gestionados por cantidad en stock
- **Activos serializados**: Equipos individuales con número de serie único
- **Categorías**: Organización jerárquica de productos
- **Control de stock**: Niveles mínimos/máximos, alertas de stock bajo (WIP)
- **Estados múltiples**: Disponible, Asignado, Reservado, En reparación, Averiado, Robado, Dado de baja

### Gestión de Destinatarios

- Registro de empleados/destinatarios por departamento
- Información de contacto (email, teléfono)
- Historial de asignaciones por destinatario

### Sistema de Asignaciones

- Asignación de ítems genéricos (por cantidad)
- Asignación de activos individuales (uno a uno)
- Seguimiento de fechas de asignación y devolución
- Notas y detalles de cada asignación
- Registro del usuario que realiza cada asignación

### Movimientos e Historial

- Registro completo de todos los movimientos de stock
- Tipos de movimiento: IN, OUT, ASSIGNMENT, RETURN, ADJUSTMENT, DELETED
- Trazabilidad completa con stock previo y nuevo
- Auditoría de todos los cambios con usuario y fecha

### Importación de Datos

- Importación masiva vía CSV
- Plantilla descargable para importaciones
- Validación de datos en el proceso de importación

### Sistema de Autenticación y Roles

- Autenticación segura con NextAuth v5
- 4 roles de usuario: ADMIN, MANAGER, STAFF, VIEWER
- Permisos diferenciados según rol
- Contraseñas hasheadas con bcrypt

## 🚀 Tecnologías

- **Framework**: Next.js 15 (App Router)
- **Base de datos**: PostgreSQL 18
- **ORM**: Prisma 6
- **Autenticación**: NextAuth v5
- **UI**: React 19, Tailwind CSS, Shadcn
- **Validación**: Zod
- **Formularios**: React Hook Form
- **Runtime**: Bun (recomendado)
- **Containerización**: Docker + Docker Compose

## 🔨 Desarrollo en entorno DevContainer

Este proyecto incluye configuración para desarrollo en contenedor usando [DevContainer](https://containers.dev/).

1. Abre el proyecto en VS Code y selecciona "Reopen in Container".
2. El entorno instalará dependencias automáticamente (bun i) y lanzará el servidor de desarrollo (bun run dev).
3. El puerto 3000 estará disponible para acceder a la app desde tu navegador.

## 🔨 Desarrollo local

### Prerrequisitos

- Node.js 18+ o Bun
- PostgreSQL 13+ (o usar Docker Compose)
- Git

1. Clonar el repositorio:

```bash
git clone <repo-url>
cd stock-manager
```

2. Instalar dependencias:

```bash
bun install
# o
npm install
```

3. Configurar variables de entorno:

```bash
cp .env.example .env
```

Editar `.env` con tus configuraciones:

```env
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/stockmanager"
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_DB=stockmanager
POSTGRES_HOST=db
POSTGRES_PORT=5432

# NextAuth
AUTH_SECRET="your-secret-key-here"
AUTH_TRUST_HOST=true
DOMAIN=localhost:3000
```

4. Ejecutar migraciones de base de datos:

```bash
bun run db:migrate
# o generar el cliente Prisma
bun run db:generate
```

5. (Opcional) Ejecutar seed para datos iniciales:

```bash
bun run db:seed
```

6. Iniciar el servidor de desarrollo:

```bash
bun run dev
```

Abrir [http://localhost:3000](http://localhost:3000) en el navegador.

## 🐳 Despliegue con Docker

### Producción

```bash
docker-compose -f compose.yaml up -d
```

Con Traefik (reverse proxy):

```bash
docker-compose -f compose.yaml -f compose.traefik.yaml up -d
```

## 📜 Scripts disponibles

```bash
# Desarrollo
bun run dev              # Inicia servidor de desarrollo con Turbopack
bun run build            # Construye para producción
bun run start            # Inicia servidor de producción

# Linting y formato
bun run lint             # Ejecuta ESLint
bun run lint:fix         # Corrige errores de ESLint automáticamente
bun run format           # Formatea código con Prettier

# Base de datos
bun run db:push          # Sincroniza schema sin migraciones
bun run db:migrate       # Crea y ejecuta migraciones
bun run db:migrate:reset # Resetea BD y ejecuta migraciones
bun run db:deploy        # Ejecuta migraciones en producción
bun run db:generate      # Genera cliente Prisma
bun run db:studio        # Abre Prisma Studio (GUI para BD)
```

## 📁 Estructura del proyecto

```
src/
├── app/                    # App Router de Next.js
│   ├── (auth)/            # Rutas de autenticación
│   │   └── login/
│   ├── (dashboard)/       # Rutas del dashboard
│   │   ├── (home)/        # Página principal
│   │   ├── assignments/   # Gestión de asignaciones
│   │   ├── import/        # Importación de datos
│   │   ├── inventory/     # Gestión de inventario
│   │   │   ├── assets/    # Activos serializados
│   │   │   ├── categories/# Categorías
│   │   │   └── items/     # Ítems genéricos
│   │   ├── movements/     # Historial de movimientos
│   │   └── recipients/    # Gestión de destinatarios
│   └── api/               # API routes
│       ├── auth/          # Endpoints de autenticación
│       └── db/            # Endpoints de base de datos
├── components/            # Componentes React
│   ├── auth/             # Componentes de autenticación
│   ├── common/           # Componentes comunes
│   ├── forms/            # Componentes de formularios
│   ├── layout/           # Componentes de layout
│   └── ui/               # Componentes UI (Radix)
├── lib/                   # Utilidades y configuración
│   ├── actions/          # Server Actions
│   ├── schemas/          # Schemas de validación Zod
│   └── types/            # Tipos TypeScript
├── services/             # Servicios de lógica de negocio
├── prisma/               # Schema y migraciones Prisma
│   ├── schema.prisma     # Definición del modelo de datos
│   ├── migrations/       # Historial de migraciones
│   └── seed.ts           # Datos iniciales
└── styles/               # Estilos globales
```

## 🔐 Seguridad

- Autenticación mediante JWT
- Contraseñas hasheadas con bcrypt
- Validación de datos con Zod en cliente y servidor
- Protección de rutas según roles
- Variables de entorno para secretos
- Sanitización de inputs

## 🗃️ Modelo de datos

El sistema gestiona las siguientes entidades principales:

- **Users**: Usuarios del sistema con roles y permisos
- **Recipients**: Destinatarios/empleados que reciben asignaciones
- **Categories**: Categorías de productos
- **Items**: Ítems genéricos (sin número de serie)
- **Assets**: Activos individuales (con número de serie)
- **Assignments**: Asignaciones de ítems/activos a destinatarios
- **Movements**: Registro de todos los movimientos de inventario

Ver `src/prisma/schema.prisma` para el esquema completo.
