# API React — backend.visioryx.com / app.visioryx.com

Cette livraison **ajoute** une API pour le back-office React. Rien d'existant n'est modifié :
`routes/api.php` (mobile), `routes/web.php` (Blade), contrôleurs, modèles, migrations et données restent identiques.

## 1. Fichiers ajoutés (copier dans le projet Laravel, mêmes chemins)

| Chemin | Rôle |
|---|---|
| `routes/react.php` | Toutes les routes React (préfixe `/api/react`) |
| `app/Providers/ReactApiServiceProvider.php` | Charge `routes/react.php` |
| `app/Http/Controllers/React/*` | 15 contrôleurs dédiés |
| `app/Http/Middleware/React/EnsureReactAdmin.php` | Réserve l'API aux rôles `admin` / `manager` actifs |
| `app/Support/React/{Mapper,Cols}.php` | Traduction base → contrat React |
| `app/Models/React/*` | Modèles des 4 nouvelles tables |
| `database/migrations/2026_10_14_000001_…` / `…000002_…` | Migrations **additives** (voir §3) |
| `config/cors.php` | CORS pour `https://app.visioryx.com` |

## 2. Branchement (déjà fait dans cette version complète)

Le projet complet livré enregistre déjà le provider dans `AppServiceProvider::register()` (seule ligne ajoutée à un fichier existant). Sinon, dans `bootstrap/providers.php` (Laravel 11/12), ajouter le provider :

```php
return [
    App\Providers\AppServiceProvider::class,
    App\Providers\ReactApiServiceProvider::class, // ← ajouter
];
```

(Laravel 10 ou antérieur : l'ajouter au tableau `providers` de `config/app.php`.)

## 3. Base de données

`php artisan migrate` n'exécute que les 2 nouvelles migrations :

* `…000001` : colonnes **optionnelles** `cities.is_active` (défaut 1), `listings.is_active` (défaut 1), `deplacements.motif` (nullable). Les lignes existantes ne changent pas.
* `…000002` : **nouvelles** tables `react_sectors`, `react_sector_listing`, `react_sector_slots`, `react_planned_visits` (planification).

Aucune colonne existante n'est modifiée ni supprimée. Les deux migrations testent l'existence avant de créer (rejouables sans risque).
Sauvegardez quand même la base avant le premier `migrate` (bonne pratique de production).

## 4. Configuration `.env` du backend

```
APP_URL=https://backend.visioryx.com
CORS_ALLOWED_ORIGINS=https://app.visioryx.com
JWT_SECRET=…            # déjà défini pour le mobile : ne pas le changer (les jetons mobiles restent valides)
```

Puis : `php artisan config:clear && php artisan route:clear && php artisan storage:link` (images de visites).

L'authentification réutilise le **même JWT (guard `api`)** que le mobile : `POST /api/react/auth/login` → `{ data: { token, user } }`, puis `Authorization: Bearer <token>`. Seuls les comptes `admin` et `manager` actifs sont acceptés.

## 5. Nginx (exemples)

```nginx
# backend.visioryx.com
server {
    server_name backend.visioryx.com;
    root /var/www/glopharma/public;
    index index.php;
    location / { try_files $uri $uri/ /index.php?$query_string; }
    location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php8.3-fpm.sock;
                        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; }
    # HTTPS : certbot --nginx -d backend.visioryx.com
}

# app.visioryx.com  (build du front : npm run build → dist/)
server {
    server_name app.visioryx.com;
    root /var/www/visioryx-admin/dist;
    index index.html;
    location / { try_files $uri /index.html; }   # routes React (SPA)
    location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; }
    # HTTPS : certbot --nginx -d app.visioryx.com
}
```

## 6. Front React

```
VITE_DATA_SOURCE=api
VITE_API_BASE_URL=https://backend.visioryx.com/api/react
```

`npm ci && npm run build`, puis publier `dist/` sur `app.visioryx.com`. `VITE_DATA_SOURCE=mock` rétablit la démonstration locale.

## 7. Routes (toutes sous `/api/react`, JSON `{ data: … }`)

`POST auth/login` · `GET auth/me` · `POST auth/logout|refresh` — `GET dashboard`, `dashboard/metrics` —
`users` (CRUD + `POST users/{id}/reset-password`) — `delegates/{id}/analysis|report|duplicates|tracking` —
`cities` (CRUD + `PUT cities/{id}/delegues`) — `listings` (CRUD) — `visits`, `visits/progress`, `visits/{id}`, `PUT visits/{id}/status` —
`tickets`, `PUT tickets/{visitId}` — `deplacements` (CRUD) — `permissions`, `PUT permissions/{id}/status` — `cycles`, `cycles/current` —
`salaries`, `salaries/{id}`, `PUT salaries/{id}/base`, `GET|PUT salaries/prime`, `salaries/report` —
`analytics/overview|leaderboard|trend|alerts`, `analytics/delegues/{id}` —
`planning` (CRUD + `planning/bulk`, `planning/delegates`) — `sectors` (CRUD), `GET|PUT sectors/slots`.

Test rapide :

```bash
TOKEN=$(curl -s -X POST https://backend.visioryx.com/api/react/auth/login \
  -H 'Content-Type: application/json' -d '{"email":"admin@…","password":"…"}' | jq -r .data.token)
curl -s https://backend.visioryx.com/api/react/dashboard -H "Authorization: Bearer $TOKEN" | jq
```

## 8. Points d'attention

* Suppression d'un utilisateur = *soft delete* (historique conservé) ; une ville ou un établissement ayant des données liées ne peut pas être supprimé (message explicite).
* Les types d'établissement sont renvoyés tels qu'enregistrés par le mobile (ex. `pharmacie`) ; aucune valeur n'est réécrite.
* Modules « plateforme SaaS » du front (entreprises, plans, abonnements, journaux, monitoring, support) : sans équivalent Laravel (application mono-entreprise), ils restent en démonstration, accessibles uniquement au rôle `super_admin` du mock — un compte réel n'y accède pas.
* La réinitialisation de mot de passe par e-mail n'existe pas côté Laravel : l'administrateur génère un mot de passe provisoire depuis la fiche utilisateur.
* Colonnes audio/GPS du contrôleur mobile proposé plus tôt : l'API React les expose automatiquement (`image`, `audio`) si elles existent, sans les exiger.
