# Instalar Activa ERP en hosting compartido (cPanel, sin Terminal)

Esta guia es para tu caso real: un plan de **hosting compartido** donde solo
tienes el panel de **cPanel** (sin WHM, sin acceso root) y **sin la opcion
de Terminal/SSH**. Con esas dos restricciones no es posible ejecutar
`composer` ni `php artisan` directamente en el servidor, ni crear varias
bases de datos dinamicamente — por eso el proyecto esta preparado para
instalarse sin ninguno de los dos:

- Las dependencias de PHP (`vendor/`) se generan **una sola vez, en tu
  propia computadora**, y se suben ya listas junto con el resto del
  proyecto.
- Solo hace falta **una** base de datos MySQL (la que crea la herramienta
  normal de cPanel, sin privilegios especiales) porque todas las empresas
  comparten las mismas tablas, separadas internamente por `company_id`.
- Las migraciones, la carga de datos base y la creacion del usuario
  master se hacen desde el navegador, en `https://tudominio/instalar`, con
  un asistente de 3 pasos incluido en el propio sistema — no requiere
  `php artisan` por consola.
- Los respaldos tambien se generan y restauran en PHP puro (sin
  `mysqldump`), asi que funcionan aunque el hosting tenga `exec` /
  `shell_exec` deshabilitados (lo habitual en shared hosting).

## Resumen de los pasos

1. Generar `vendor/` en tu computadora y armar el ZIP a subir.
2. Crear la base de datos MySQL desde cPanel.
3. Subir y descomprimir el proyecto (fuera de `public_html`).
4. Crear el subdominio y apuntarlo a la carpeta `public/`.
5. Activar SSL (AutoSSL).
6. Verificar la version de PHP y sus extensiones.
7. Dar permisos de escritura a `storage/` y `bootstrap/cache/`.
8. Correr el instalador web (`/instalar`): base de datos, tablas, usuario
   master.
9. Programar la tarea Cron.
10. Primer ingreso.

---

## 1. Generar `vendor/` en tu computadora

El servidor de hosting compartido no tiene Composer disponible (o no
puedes ejecutarlo sin Terminal), asi que las dependencias de Laravel
(`vendor/`) se descargan una sola vez, **fuera** del hosting, y se suben ya
incluidas dentro del proyecto. Elige la opcion que te resulte mas comoda:

**Opcion A — Tienes PHP instalado en tu PC (Windows/Mac/Linux):**

```bash
cd activa-erp
composer install --no-dev --optimize-autoloader
```

Si no tienes Composer, instalalo una vez desde
[getcomposer.org](https://getcomposer.org/download/) (en Windows, el
instalador `Composer-Setup.exe` detecta e instala PHP si hace falta).

**Opcion B — No tienes PHP ni Composer instalados y no quieres instalarlos:**

- Pide a un desarrollador de confianza que corra el comando de la Opcion A
  por ti (solo toma un minuto) y te devuelva la carpeta `activa-erp/` ya
  con `vendor/` adentro.
- O contacta a soporte de tu hosting: muchos proveedores, aunque el plan
  sea compartido, pueden correr `composer install` por ti una vez desde su
  propio acceso interno si les envias el proyecto — vale la pena
  preguntar antes de descartar esta opcion.

Al terminar cualquiera de las dos opciones, comprime **toda** la carpeta
`activa-erp/` (con `vendor/` ya adentro) en un `.zip` para subirla en el
paso 3. El ZIP pesara bastante mas que el original (decenas de MB) porque
ahora incluye las dependencias.

## 2. Crear la base de datos MySQL en cPanel

1. **cPanel → Bases de datos → Bases de datos MySQL** (MySQL Databases).
2. En "Crear una base de datos nueva", escribe un nombre (por ejemplo
   `activaerp`) y crea. cPanel le antepone tu usuario, quedando algo como
   `TUUSUARIO_activaerp`.
3. En "Usuarios de MySQL → Añadir un usuario nuevo", crea un usuario (por
   ejemplo `activaerp`) con una contraseña segura. Quedara como
   `TUUSUARIO_activaerp`.
4. En "Añadir usuario a la base de datos", selecciona ese usuario y esa
   base de datos, y marca **TODOS LOS PRIVILEGIOS** (All Privileges).
5. Anota los tres datos completos (con el prefijo de tu usuario): nombre de
   la base, nombre de usuario y contraseña. Los necesitaras en el paso 8.

No hace falta nada mas de MySQL — el sistema no necesita crear bases de
datos adicionales, solo usa tablas dentro de esta.

## 3. Subir el proyecto FUERA de `public_html`

Por seguridad, el codigo de Laravel (incluido el archivo `.env` con tus
contraseñas) **no debe** quedar dentro de una carpeta publicamente
accesible. La convencion correcta en cPanel es:

```
/home/TU_USUARIO/activa-erp/            <- todo el proyecto Laravel aqui (fuera de public_html)
/home/TU_USUARIO/activa-erp/public/     <- esta sera la UNICA carpeta visible al mundo
```

Pasos:

1. Entra a **cPanel → Archivos → Administrador de archivos** (File
   Manager).
2. Ve a tu directorio home (un nivel arriba de `public_html`) y usa
   "Cargar" (Upload) para subir el ZIP armado en el paso 1
   (`activa-erp.zip`, ya con `vendor/` adentro).
3. Una vez subido, selecciona el archivo y usa **Extraer** (Extract). Debe
   quedar como `/home/TU_USUARIO/activa-erp/`.

> Si el ZIP es muy grande y la carga por el navegador falla o es muy
> lenta, sube el proyecto por **FTP** (cPanel → Archivos → Cuentas FTP)
> con un cliente como FileZilla, que maneja mejor archivos grandes y
> permite reanudar si se corta la conexion.

## 4. Crear el subdominio y apuntarlo a `public/`

1. **cPanel → Dominios → Subdominios** (Subdomains).
2. Subdominio: `erp` — Dominio: `e-learningvzla.com.ve` (o el dominio que
   corresponda).
3. En **Raiz del documento** (Document Root), cPanel propone algo como
   `public_html/erp.e-learningvzla.com.ve`. Bórralo y escribe en su lugar
   la ruta relativa a tu home:
   ```
   activa-erp/public
   ```
4. Guarda. Con esto, cualquier visita a
   `https://erp.e-learningvzla.com.ve` sirve unicamente lo que hay dentro
   de `public/` — el resto del proyecto (`.env`, `app/`, etc.) queda fuera
   del alcance del navegador aunque alguien intente adivinar la ruta.

## 5. Activar SSL (AutoSSL)

1. **cPanel → Seguridad → SSL/TLS Status**.
2. Marca el (sub)dominio `erp.e-learningvzla.com.ve` y ejecuta "Run
   AutoSSL" (gratis, usa Let's Encrypt). En unos minutos queda con HTTPS,
   sin necesidad de `certbot` ni Terminal.

## 6. Verificar la version de PHP y sus extensiones

1. **cPanel → Software → Select PHP Version** (o "MultiPHP Manager" si tu
   panel lo llama asi).
2. Elige **PHP 8.2** o superior para el (sub)dominio del ERP.
3. En la misma pantalla, en "Extensiones" (Extensions), confirma que estan
   marcadas: `mbstring`, `xml`/`dom`, `curl`, `zip`, `bcmath`, `pdo_mysql`,
   `gd`, `intl`, `fileinfo`. Si alguna no aparece marcada, actívala y
   guarda — no requiere reiniciar nada, aplica de inmediato.

## 7. Permisos de `storage/` y `bootstrap/cache/`

Laravel necesita poder escribir en dos carpetas del proyecto (logs,
cache de vistas, archivos subidos, respaldos). Desde el Administrador de
archivos:

1. Entra a `activa-erp/storage/`, clic derecho → **Cambiar permisos**
   (Change Permissions) → marca lectura/escritura/ejecucion para
   "Propietario" y "Grupo" (numericamente `775`) → aplica **"Recursivo en
   todos los subdirectorios"**.
2. Repite lo mismo para `activa-erp/bootstrap/cache/`.

(En hosting compartido normalmente el usuario del sistema y el que corre
PHP son el mismo, asi que no hace falta `chown`, solo ajustar permisos.)

## 8. Correr el instalador web

Con la base de datos creada (paso 2) y el proyecto ya en su lugar (pasos
3-7), entra desde el navegador a:

```
https://erp.e-learningvzla.com.ve/instalar
```

El asistente tiene 3 pasos:

1. **Conexion a la base de datos:** completa la URL de la aplicacion y los
   tres datos de MySQL del paso 2 (host generalmente `localhost`, puerto
   `3306`, y el nombre de base/usuario/contraseña con el prefijo de tu
   cuenta). El sistema prueba la conexion antes de continuar; si falla, te
   indica el error tal cual lo devuelve MySQL. Al confirmar, esto escribe
   el archivo `.env` por ti — no hace falta editarlo a mano.
2. **Crear las tablas:** con un clic, el sistema ejecuta las migraciones y
   siembra los datos base (monedas). Se ve el resultado en pantalla; si
   algo falla (por ejemplo, una extension de PHP faltante), lo muestra ahi
   mismo y puedes corregirlo y reintentar sin perder lo ya hecho.
3. **Usuario master:** creas el nombre, correo y contraseña del primer
   usuario, que sera el administrador del sistema (gestiona empresas,
   usuarios y licencias).

Al terminar el paso 3, el instalador se **bloquea automaticamente para
siempre** (crea `storage/installed.lock`): si alguien vuelve a visitar
`/instalar` despues, vera un mensaje de que el sistema ya fue instalado,
sin poder tocar nada. Esto es intencional, para que nadie pueda re-correr
el instalador sobre un sistema ya en produccion.

> Si necesitas cambiar los datos de conexion a la base de datos mas
> adelante (por ejemplo, cambiaste la contraseña de MySQL), edita
> directamente el archivo `.env` desde el Administrador de archivos de
> cPanel (esta fuera de `public/`, pero es un archivo de texto normal que
> se abre con el editor de cPanel).

## 9. Programar la tarea Cron

El sistema tiene dos tareas automaticas: el respaldo diario de cada
empresa (3:00 am) y el cierre mensual de inventario (dia 1 de cada mes,
2:00 am, segun el Articulo 177 del Reglamento de la Ley de ISLR). Para que
se ejecuten, cPanel debe llamar al programador de Laravel cada minuto:

1. **cPanel → Avanzado → Cron Jobs**.
2. En "Añadir nuevo Cron Job", elige "Cada minuto" en los cinco campos
   (Minuto `*`, Hora `*`, Dia `*`, Mes `*`, Dia de la semana `*`).
3. En "Comando", usa la ruta completa al PHP de tu cuenta (puedes verla en
   **Software → Select PHP Version**, o preguntandole a soporte de tu
   hosting; suele ser algo como `/usr/local/bin/ea-php82`):
   ```
   /usr/local/bin/ea-php82 /home/TU_USUARIO/activa-erp/artisan schedule:run >> /dev/null 2>&1
   ```
   Si no encuentras la ruta del binario de PHP, usa simplemente `php` en
   su lugar; en la mayoria de las cuentas cPanel tambien funciona:
   ```
   php /home/TU_USUARIO/activa-erp/artisan schedule:run >> /dev/null 2>&1
   ```

## 10. Primer ingreso

Entra a `https://erp.e-learningvzla.com.ve/login` con el usuario master
creado en el paso 8.3. Desde ahi puedes crear usuarios adicionales
(**Usuarios**, visible solo para el master, cada uno con su propia
licencia renovable) y cada usuario registra sus empresas desde
**Empresas → Nueva empresa**.

## Respaldos: como funcionan en este esquema

Como todas las empresas comparten las mismas tablas (no hay una base de
datos por empresa), el respaldo de cada empresa se genera como un ZIP con
un JSON de sus propios datos (filtrados por `company_id`), no como un
volcado (`mysqldump`) de toda la base de datos — asi funciona igual con o
sin `exec`/`shell_exec` habilitados en el hosting. Se genera y se descarga
desde **Respaldos** dentro del sistema. Una limitacion importante: un
respaldo solo puede restaurarse sobre la **misma empresa** que lo generó
(el sistema valida el RIF antes de restaurar) — no esta pensado para
clonar los datos de una empresa dentro de otra.

## Si algo falla

- **"No se pudo conectar a la base de datos" en el paso 1 del instalador:**
  revisa que el nombre de base/usuario lleven el prefijo de tu cuenta
  (`TUUSUARIO_activaerp`, no solo `activaerp`) y que el usuario tenga
  "Todos los privilegios" asignados en el paso 2.
- **Error sobre una extension de PHP faltante en el paso 2 del
  instalador:** vuelve al paso 6 de esta guia y activa la extension que
  falte desde "Select PHP Version".
- **Pantalla en blanco o error 500 al abrir el subdominio:** normalmente
  son permisos de `storage/`/`bootstrap/cache/` (revisa el paso 7) o que
  falta el archivo `public/.htaccess` (ya viene incluido en el proyecto;
  confirma que se subio junto con el resto).
- **El ZIP con `vendor/` no carga por el Administrador de archivos:** sube
  por FTP en su lugar (ver nota al final del paso 3).

Para el resto (arquitectura, modulos incluidos en esta Fase 1 y
limitaciones fiscales/contables a validar con tu contador), consulta el
`README.md` principal.
