# Despliegue — Facturador SUNAT

Guía para publicar el sistema en **https://davidcontrerasfx.com/facturacion** sobre un
hosting compartido barato (cPanel/FTP), **sin Node, sin Composer y sin servicios extra**.

---

## 0. Requisitos del hosting

- **PHP 8.2 o superior** (en cPanel: "Select PHP Version" → 8.2/8.3).
- Extensiones PHP activas: `openssl`, `soap`, `zip`, `gd`, `intl`, `mbstring`, `pdo_mysql`, `bcmath`, `curl`, `dom`, `fileinfo`.
  (En cPanel → "Select PHP Version" → marca esas extensiones.)
- **MySQL/MariaDB**.
- Permitir **conexiones salientes HTTPS** (para llegar a los web services de SUNAT). La mayoría lo permite.

---

## 1. Empaquetar en tu PC

En la carpeta del proyecto, ejecuta en PowerShell:

```powershell
powershell -File deploy.ps1
```

Esto crea la carpeta `deploy/` con dos subcarpetas:

```
deploy/
  facturacion_app/          <- la aplicación (va FUERA de public_html)
  public_html_facturacion/  <- lo público (su contenido va en public_html/facturacion)
```

> El script ya reconfigura `index.php` para el subdirectorio y agrega `RewriteBase /facturacion/`.

---

## 2. Subir los archivos

Estructura final en el servidor (ejemplo con usuario `davidc`):

```
/home/davidc/
├── facturacion_app/          <- sube aquí TODO el contenido de deploy/facturacion_app
│   ├── app/  bootstrap/  config/  database/  routes/  storage/  vendor/ ...
│   └── .env                  (lo creas en el paso 4)
└── public_html/
    └── facturacion/          <- sube aquí el contenido de deploy/public_html_facturacion
        ├── index.php
        ├── .htaccess
        └── assets/ build/ ...
```

Sube por **FTP** (FileZilla) o el **Administrador de archivos** de cPanel.
Si tu hosting no deja crear carpetas fuera de `public_html`, ponlas en el nivel más alto que permita
y ajusta las rutas de `public_html/facturacion/index.php` (las dos líneas con `facturacion_app`).

---

## 3. Crear la base de datos (cPanel → MySQL Databases)

1. Crea una base de datos, ej. `davidc_facturacion`.
2. Crea un usuario MySQL con contraseña y **asígnalo** a esa base con *todos los privilegios*.
3. Anota: nombre de BD, usuario y contraseña (van en el `.env`).

---

## 4. Configurar `.env`

Dentro de `facturacion_app/`, copia `.env.example` como `.env` y complétalo
(usa como base `.env.production.example`):

```
APP_ENV=production
APP_DEBUG=false
APP_URL=https://davidcontrerasfx.com/facturacion
DB_DATABASE=davidc_facturacion
DB_USERNAME=davidc_user
DB_PASSWORD=********
```

Genera la clave de la app (si tienes acceso SSH):

```bash
php artisan key:generate
```

Si **no tienes SSH**, genera un `APP_KEY` en tu PC con `php artisan key:generate --show`
y pégalo en el `.env` del servidor (formato `base64:...`).

---

## 5. Crear las tablas

**Con SSH:**
```bash
cd ~/facturacion_app
php artisan migrate --force
php artisan db:seed --force      # crea el usuario admin y datos base (opcional)
```

**Sin SSH:** exporta la BD desde tu PC y súbela por phpMyAdmin:
```powershell
# en tu PC
C:\xampp\mysql\bin\mysqldump.exe -u root facturador_sunat > facturador.sql
```
Luego en cPanel → phpMyAdmin → tu BD → *Importar* → sube `facturador.sql`.

> Algunos hostings dan "Cron" pero no SSH. Si es tu caso, usa la opción de phpMyAdmin.

---

## 6. Permisos

La carpeta `storage/` y `bootstrap/cache/` deben ser **escribibles** (755 o 775):

```bash
chmod -R 775 storage bootstrap/cache
```
(En cPanel → Administrador de archivos → clic derecho → Permisos.)

---

## 7. Optimizar (recomendado, con SSH)

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

---

## 8. Automatizar SUNAT con un Cron (cPanel → Cron Jobs)

Para que las boletas se reporten y los tickets se consulten solos, agrega **un** cron cada minuto:

```
* * * * * cd /home/davidc/facturacion_app && php artisan schedule:run >> /dev/null 2>&1
```

Laravel se encarga de lo demás (consulta tickets cada 15 min y genera el resumen diario a la 1:00 am).
Si tu hosting no permite cron de 1 minuto, usa cada 15/30 min; el sistema igual funciona con los
botones manuales de la pantalla **Resumen Diario**.

---

## 9. Pasar a PRODUCCIÓN (datos reales)

1. Entra al sistema (`/facturacion`) con el usuario admin y **cambia su contraseña**.
2. En **Empresas**, edita tu empresa con tu **RUC real (10/20)** y datos reales.
3. **Sube tu certificado digital real** (.pfx/.p12 con su contraseña, o .pem) en el formulario de la empresa.
4. Pon tu **usuario y clave SOL reales**.
5. Marca la casilla **"Producción"** → el sistema usará automáticamente los servidores de
   producción de SUNAT (no beta).
6. Emite una factura de prueba real y verifica que SUNAT la acepte.

---

## 10. Seguridad (checklist)

- [ ] `APP_DEBUG=false` y `APP_ENV=production` en el `.env`.
- [ ] HTTPS activo (certificado SSL del dominio) — el sistema fuerza https en producción.
- [ ] La carpeta `facturacion_app/` está **fuera** de `public_html` (el certificado digital y los XML
      quedan inaccesibles desde la web).
- [ ] Contraseña fuerte para el usuario MySQL.
- [ ] Contraseña del usuario admin cambiada.
- [ ] Haz **respaldos** periódicos de la BD y de `storage/app` (ahí viven los XML y CDR).

---

## Problemas comunes

| Síntoma | Causa / Solución |
|---|---|
| Error 500 en blanco | Revisa `facturacion_app/storage/logs/laravel.log`. Suele ser permisos de `storage/` o falta `APP_KEY`. |
| CSS/JS no cargan | Verifica que subiste `assets/` dentro de `public_html/facturacion/` y que `APP_URL` incluye `/facturacion`. |
| "The stream or file ... could not be opened" | Permisos de `storage/` → 775. |
| SUNAT: "Certificado no válido" | En producción el certificado debe ser emitido por una entidad autorizada (no autofirmado). |
| Enlaces apuntan a la raíz, no a /facturacion | Confirma `RewriteBase /facturacion/` en `.htaccess` y `APP_URL`. |
