# 🚀 Guía de Instalación

## Requisitos del sistema

### Requisitos de software
- **PHP:** >= 8.2
- **Composer:** >= 2.x
- **Node.js:** >= 18.x
- **NPM:** >= 9.x
- **Base de datos:** MySQL 8.0+ o MariaDB 10.3+
- **Servidor web:** Apache 2.4+ / Nginx 1.18+ (opcional para desarrollo)

### Extensiones PHP requeridas
```
- php-mbstring
- php-xml
- php-curl
- php-zip
- php-gd
- php-mysql
- php-pdo
- php-tokenizer
- php-json
- php-bcmath
```

## Instalación paso a paso

### 1. Clonar el repositorio
```bash
git clone <url-del-repositorio>
cd CL038_BACK
```

### 2. Instalar dependencias de PHP
```bash
composer install
```

### 3. Instalar dependencias de Node.js
```bash
npm install
```

### 4. Configurar variables de entorno

Copiar el archivo de ejemplo:
```bash
cp .env.example .env
```

Editar `.env` con los datos de tu entorno:
```env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=  # Se generará en el siguiente paso
APP_DEBUG=true
APP_URL=http://localhost:8000

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_vinosylicores
DB_USERNAME=root
DB_PASSWORD=

QUEUE_CONNECTION=database
CACHE_STORE=database
SESSION_DRIVER=database

MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=tu_usuario
MAIL_PASSWORD=tu_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tuempresa.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### 5. Generar clave de aplicación
```bash
php artisan key:generate
```

### 6. Crear base de datos

Crear la base de datos manualmente:
```sql
CREATE DATABASE db_vinosylicores CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

### 7. Ejecutar migraciones
```bash
php artisan migrate
```

Si necesitas datos de prueba:
```bash
php artisan migrate --seed
```

### 8. Crear enlace simbólico de storage
```bash
php artisan storage:link
```

### 9. Crear directorios necesarios
```bash
mkdir -p storage/app/public/pdfTemporal
mkdir -p storage/app/public/excelTemporal
mkdir -p public/plantillas
chmod -R 775 storage bootstrap/cache
```

### 10. Compilar assets de frontend (opcional)
```bash
# Para desarrollo
npm run dev

# Para producción
npm run build
```

### 11. Iniciar el servidor de desarrollo
```bash
# Opción 1: Todo en uno (recomendado)
composer dev

# Opción 2: Servidores individuales
# Terminal 1: Servidor Laravel
php artisan serve

# Terminal 2: Cola de trabajos
php artisan queue:listen --tries=1

# Terminal 3: Vite (assets)
npm run dev
```

La aplicación estará disponible en: `http://localhost:8000`

## Instalación con Docker (Laravel Sail)

### Requisitos
- Docker Desktop
- Docker Compose

### Instalación
```bash
# 1. Instalar dependencias (primera vez)
docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v $(pwd):/var/www/html \
    -w /var/www/html \
    laravelsail/php82-composer:latest \
    composer install --ignore-platform-reqs

# 2. Copiar .env
cp .env.example .env

# 3. Iniciar contenedores
./vendor/bin/sail up -d

# 4. Generar key
./vendor/bin/sail artisan key:generate

# 5. Ejecutar migraciones
./vendor/bin/sail artisan migrate --seed

# 6. Crear enlace simbólico
./vendor/bin/sail artisan storage:link
```

Acceder a: `http://localhost`

## Configuración de servicios externos

### Mailtrap (desarrollo)
1. Crear cuenta en https://mailtrap.io
2. Obtener credenciales SMTP
3. Actualizar en `.env`:
```env
MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=tu_usuario_mailtrap
MAIL_PASSWORD=tu_password_mailtrap
```

### Configuración de correo en producción
Para producción, configurar SMTP real:
```env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=tu_email@gmail.com
MAIL_PASSWORD=tu_app_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@tudominio.com"
MAIL_FROM_NAME="Vinos y Licores"
```

## Verificación de instalación

### Verificar estado de la aplicación
```bash
# Verificar configuración
php artisan config:clear
php artisan config:cache

# Verificar rutas
php artisan route:list

# Verificar conexión a BD
php artisan migrate:status

# Verificar permisos
php artisan storage:link
```

### Pruebas
```bash
# Ejecutar todas las pruebas
composer test

# O con artisan
php artisan test
```

## Generar documentación de API

```bash
php artisan scribe:generate
```

La documentación estará disponible en: `public/docs/index.html`

## Solución de problemas comunes

### Error: "No application encryption key has been specified"
```bash
php artisan key:generate
```

### Error de permisos en storage/
```bash
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
```

### Error: "SQLSTATE[HY000] [2002] Connection refused"
Verificar:
1. MySQL está corriendo: `sudo service mysql status`
2. Credenciales correctas en `.env`
3. Base de datos existe

### Error al subir archivos grandes
Editar `php.ini`:
```ini
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300
memory_limit = 256M
```

### Colas no procesan trabajos
```bash
# Verificar tabla de jobs
php artisan queue:table
php artisan migrate

# Reiniciar worker
php artisan queue:restart
php artisan queue:listen --tries=1
```

### Assets no se compilan
```bash
# Limpiar cache de npm
npm cache clean --force
rm -rf node_modules package-lock.json
npm install

# Limpiar cache de Vite
rm -rf node_modules/.vite
npm run dev
```

## Actualización de la aplicación

### Actualizar desde repositorio
```bash
# 1. Obtener últimos cambios
git pull origin main

# 2. Actualizar dependencias
composer install
npm install

# 3. Ejecutar migraciones nuevas
php artisan migrate

# 4. Limpiar cachés
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear

# 5. Recompilar assets
npm run build

# 6. Reiniciar colas
php artisan queue:restart
```

## Desinstalación

```bash
# 1. Detener servicios
# Ctrl+C en terminales con servidor/cola/vite

# 2. Eliminar base de datos
mysql -u root -p
DROP DATABASE db_vinosylicores;
exit;

# 3. Eliminar archivos
cd ..
rm -rf CL038_BACK

# 4. (Opcional) Limpiar cache de Composer
composer clear-cache
```

## Siguientes pasos

Después de la instalación exitosa:

1. Revisar [Configuracion.md](./Configuracion.md) para ajustes del sistema
2. Revisar [BaseDatos.md](./BaseDatos.md) para entender el esquema
3. Revisar [Arquitectura.md](./Arquitectura.md) para entender la estructura del código
4. Consultar documentación de módulos específicos en carpetas `Compras/` y `PuntoVenta/`
