# API Real Rich Business — Instrucciones de Instalación y Prueba

> **Versión PHP:** Esta versión requiere **PHP 8.2 o superior**.
> **Base de datos:** `wwsist_rrb5` | **Usuario:** `wwsist_mikes`

## 1. Subir archivos al servidor

### Opción A — Administrador de Archivos de cPanel (recomendado)

1. Entra a **cPanel** → **Administrador de Archivos**
2. Navega a `public_html/`
3. Si ya existe la carpeta `app-api/`, haz clic en ella para entrar
4. Sube el archivo `rrb_api_php82.zip` usando el botón **Subir**
5. Una vez subido, selecciónalo y haz clic en **Extraer**
6. Los archivos se extraerán en una subcarpeta `rrb_api_php82/` — **mueve su contenido** directamente a `app-api/` (o renombra la carpeta)

> **Estructura final esperada en el servidor:**
> ```
> public_html/
>   app-api/
>     .htaccess
>     config.php
>     index.php
>     test-db.php
>     auth/login.php
>     dashboard/summary.php
>     profile/get.php
>     profile/update.php
>     profile/change-password.php
>     catalog/productos.php
>     purchases/list.php
>     purchases/new.php
>     network/list.php
>     network/register.php
>     assignments/list.php
>     assignments/new.php
>     earnings/list.php
>     earnings/update-method.php
> ```

---

## 2. Verificar la conexión a la base de datos

Abre en el navegador:

```
https://www.sistemarrb.com/app-api/test-db.php
```

Deberías ver una respuesta JSON con:
- `"success": true`
- `"total_usuarios"`: número de usuarios (debe ser ~44,722)
- `"cols_usuario"`: lista de columnas de la tabla usuario
- `"cols_inversionista"`: lista de columnas de la tabla inversionista

**Si aparece error de conexión**, verifica en `config.php`:
- `DB_HOST`: `localhost`
- `DB_NAME`: `wwsist_rrb5`
- `DB_USER`: `wwsist_mikes`
- `DB_PASS`: `Mikel123*`

> ⚠️ **IMPORTANTE**: Elimina `test-db.php` del servidor una vez verificada la conexión.

---

## 3. Probar el login

Usa una herramienta como **Postman**, **Insomnia**, o el comando `curl`:

```bash
curl -X POST https://www.sistemarrb.com/app-api/auth/login.php \
  -H "Content-Type: application/json" \
  -d '{"nombre_usuario":"PETM570706","password":"123456"}'
```

**Respuesta esperada (éxito):**
```json
{
  "success": true,
  "data": {
    "token": "eyJ...",
    "distribuidor": {
      "idinv": 123,
      "nombre": "...",
      "referencia": "...",
      ...
    }
  }
}
```

**Respuesta si la contraseña es incorrecta:**
```json
{
  "success": false,
  "message": "Contrasena incorrecta."
}
```

---

## 4. Probar el dashboard (requiere token)

```bash
curl -X GET https://www.sistemarrb.com/app-api/dashboard/summary.php \
  -H "Authorization: Bearer TU_TOKEN_AQUI"
```

---

## 5. Resumen de endpoints

| Método | Endpoint | Descripción |
|--------|----------|-------------|
| POST | `/auth/login.php` | Login con RFC y contraseña |
| GET | `/dashboard/summary.php` | Resumen del mes |
| GET | `/profile/get.php` | Datos del perfil |
| POST | `/profile/update.php` | Actualizar perfil |
| POST | `/profile/change-password.php` | Cambiar contraseña |
| GET | `/catalog/productos.php` | Productos y paquetes |
| GET | `/purchases/list.php` | Historial de compras |
| POST | `/purchases/new.php` | Nueva compra (tipo 10 u 11) |
| GET | `/network/list.php` | Red de distribuidores |
| POST | `/network/register.php` | Registrar nuevo distribuidor |
| GET | `/assignments/list.php` | Notas por asignar |
| POST | `/assignments/new.php` | Realizar asignación |
| GET | `/earnings/list.php` | Historial de ganancias |
| POST | `/earnings/update-method.php` | Cambiar método de cobro |

---

## 6. Mejoras PHP 8.2 aplicadas en esta versión

| Mejora | Descripción |
|--------|-------------|
| `declare(strict_types=1)` | Tipos estrictos en `config.php` |
| Tipos de retorno | `getDB(): PDO`, `jsonOk(): never`, `jsonErr(): never`, `auth(): array`, `body(): array`, etc. |
| `never` return type | Funciones que siempre terminan con `exit` ahora tienen tipo `never` (PHP 8.1+) |
| `hash_equals()` | Comparación segura de JWT (evita timing attacks) |
| `str_starts_with()` | Reemplaza `strpos() === 0` para verificar prefijo `Bearer` |
| `utf8mb4` | Charset de conexión actualizado de `utf8` a `utf8mb4` |
| `PDO::ATTR_EMULATE_PREPARES => false` | Prepared statements nativos en MySQL |
| `??` null coalescing | Reemplaza patrones `isset() ? x : default` |
| Short arrays `[]` | Reemplaza `array()` en asignaciones y retornos |
| `is_array()` en JWT | Validación robusta del payload decodificado |

## 7. Correcciones aplicadas en versiones anteriores

Los siguientes nombres de columnas fueron corregidos para coincidir con el esquema real de la base de datos:

| Columna incorrecta (anterior) | Columna correcta (actual) |
|-------------------------------|---------------------------|
| `isusuario` | `idusuario` |
| `nombre_usuario` | `nom_usr` |
| `password` | `passw` |
| `idinv_idinv` | `inversionista_id_inver` |
| `inversionista_idinv` | `inversionista_id_inver` |
| `idinv` (en inversionista) | `id_inver` |
| `fecha` (en transacciones) | `fechat` |
| `hora` (en transacciones) | `horat` |
| `estatus_entrega` | `statusentrega` |
| `nombre_usuario` (en usuario) | `nom_usr` |
| `idinv_idinv` (en regs2) | `id_inver` |
| `idregs2` | `idreg` |
| `observacion` | `observaciones` |
| `bancos` (tabla) | `banco` (tabla) |
| `productos_idproductos` (en pedido_real) | `id_prod` |
| `promod_idpromod` (en pedido_real) | `id_promo` |
| `cantidad` (en pedido_real) | `cant` |
| `transacciones_idtransacciones` (en pedido_real) | `transacciones` |
| `idinv` (en agrupa_regs) | eliminado — se usa `idprom` en inversionista |
