# Panel Multi-Negocio — API Reference

Base URL: `https://msvportal.plataformamultimedia.com/panel-negocios/api`

---

## Autenticación

Todos los endpoints protegidos requieren el header:
```
Authorization: Bearer <token>
```
El token dura **7 días** y se obtiene en `/auth.php`.

---

## POST /auth.php — Login

**Body (JSON):**
```json
{ "email": "patron@test.com", "password": "Test1234!" }
```
**Respuesta 200:**
```json
{ "token": "eyJ...", "negocio_id": 1, "nombre": "Taquería El Patrón" }
```

---

## Fotos `(requiere auth)`

| Método | URL | Descripción |
|--------|-----|-------------|
| GET | `/fotos.php` | Lista fotos del negocio |
| POST | `/fotos.php` | Sube foto. Form-data: `foto` (file) |
| PUT | `/fotos.php` | Reordenar. Body JSON: `[{id, orden}, …]` |
| DELETE | `/fotos.php?id=X` | Elimina foto y archivo |

**GET respuesta:**
```json
[{ "id": 1, "url": "https://…/fotos/1_xxx.webp", "orden": 0 }]
```
**Límite:** 10 fotos por negocio. Formatos: JPG/PNG → se convierte a WebP ≤ 1200px ancho.

---

## Horarios `(requiere auth)`

| Método | URL | Descripción |
|--------|-----|-------------|
| GET | `/horarios.php` | Devuelve los 7 días (con defaults si no existen) |
| PUT | `/horarios.php` | Guarda los 7 días. Body JSON (array de 7 objetos) |

**PUT body:**
```json
[
  { "dia_semana": 0, "hora_apertura": null, "hora_cierre": null, "cerrado": 1 },
  { "dia_semana": 1, "hora_apertura": "10:00", "hora_cierre": "22:00", "cerrado": 0 },
  ...
]
```
`dia_semana`: 0=Domingo … 6=Sábado.

---

## Promociones `(requiere auth)`

| Método | URL | Descripción |
|--------|-----|-------------|
| GET | `/promociones.php` | Lista todas |
| GET | `/promociones.php?id=X` | Detalle de una |
| POST | `/promociones.php` | Crear. Form-data: `titulo`, `descripcion`, `fecha_inicio`, `fecha_fin`, `imagen` (opcional) |
| POST | `/promociones.php?id=X` | Actualizar (mismos campos, `imagen` opcional) |
| PATCH | `/promociones.php?id=X&accion=toggle` | Activa/pausa sin borrar |
| DELETE | `/promociones.php?id=X` | Eliminar |

**Regla:** `fecha_fin >= fecha_inicio` (validado en backend).

---

## Banners `(requiere auth)`

| Método | URL | Descripción |
|--------|-----|-------------|
| GET | `/banners.php` | Lista todos |
| GET | `/banners.php?id=X` | Detalle de uno |
| POST | `/banners.php` | Crear. Form-data: `imagen` (requerida), `link_destino`, `fecha_inicio`, `fecha_fin` |
| POST | `/banners.php?id=X` | Actualizar (`imagen` opcional) |
| DELETE | `/banners.php?id=X` | Eliminar |

---

## Endpoints Públicos (sin auth — para GoodBarber)

### GET `/public.php?accion=listar`
Lista todos los negocios activos.
```json
[
  {
    "id": 1, "nombre": "Taquería El Patrón", "slug": "taqueria-el-patron",
    "categoria": "Restaurante", "direccion": "123 Main St…",
    "latitud": "35.14953000", "longitud": "-90.04898000",
    "telefono": "9015550001", "whatsapp": "9015550001", "logo_url": null
  }
]
```

### GET `/public.php?accion=perfil&slug=taqueria-el-patron`
Perfil completo con fotos, horarios, promociones vigentes y banners vigentes.
```json
{
  "id": 1,
  "nombre": "Taquería El Patrón",
  "slug": "taqueria-el-patron",
  "fotos": [
    { "url": "https://…/fotos/1_xxx.webp", "orden": 0 }
  ],
  "horarios": [
    { "dia_semana": 0, "hora_apertura": null, "hora_cierre": null, "cerrado": 1 },
    { "dia_semana": 1, "hora_apertura": "10:00:00", "hora_cierre": "22:00:00", "cerrado": 0 }
  ],
  "promociones": [
    {
      "titulo": "2x1 en Tacos los Martes",
      "descripcion": "…",
      "imagen_url": null,
      "fecha_inicio": "2026-06-24",
      "fecha_fin": "2026-07-24"
    }
  ],
  "banners": [
    {
      "imagen_url": "https://…/banners/1_xxx.webp",
      "link_destino": null,
      "fecha_inicio": "2026-06-28",
      "fecha_fin": "2026-07-29"
    }
  ]
}
```

> **Nota:** `promociones` y `banners` solo incluyen registros vigentes (`fecha_inicio <= HOY <= fecha_fin`). El filtrado se hace en SQL — GoodBarber nunca recibe items vencidos.

---

## Integración GoodBarber

En tu sección HTML/JS personalizada de GoodBarber, consumir así:

```javascript
// Listar negocios
fetch('https://msvportal.plataformamultimedia.com/panel-negocios/api/public.php?accion=listar')
  .then(r => r.json())
  .then(negocios => { /* renderizar lista */ });

// Perfil de un negocio
fetch('https://msvportal.plataformamultimedia.com/panel-negocios/api/public.php?accion=perfil&slug=taqueria-el-patron')
  .then(r => r.json())
  .then(perfil => { /* renderizar perfil, fotos, horarios, promos, banners */ });
```

---

## Setup inicial

1. Crear la base de datos en cPanel y ejecutar el schema SQL.
2. Ejecutar `seed.sql` para datos de prueba.
3. Subir la carpeta `panel-negocios/` al servidor.
4. Dar permisos de escritura a `uploads/`: `chmod 755 uploads/`.
5. En `api/config.php` cambiar `JWT_SECRET` por un valor aleatorio propio (mín. 32 chars).
6. Crear negocios reales con `password_hash()` de PHP:
   ```php
   echo password_hash('ContraseñaReal123', PASSWORD_BCRYPT);
   ```

---

## Requisitos del servidor

- PHP 8.0+ con extensiones: `pdo_mysql`, `gd` (para WebP), `fileinfo`
- MySQL 5.7+ / MariaDB 10.3+
- Apache con `mod_rewrite` y `mod_headers` habilitados
