# Déploiement

Prérequis serveur : PHP ≥ 8.2 (extensions mbstring, xml, gd/zip pour Excel, pdo_mysql), MySQL, Composer, Node ≥ 20, nginx.

## 1. Récupérer le code

```bash
cd /var/www && git clone <votre-depot> glopharma && cd glopharma
```

## 2. Backend (backend.visioryx.com)

**Base existante (mobile déjà en production)** : réutiliser l'ancien `.env` (mêmes `DB_*`, `APP_KEY`, `JWT_SECRET`).

```bash
cp /chemin/ancien/.env .env
composer install --no-dev --optimize-autoloader
php artisan migrate --force      # exécute uniquement les migrations non encore passées (2 nouvelles)
php artisan storage:link
npm ci && npm run build          # assets Blade
```

**Nouvelle installation** : `composer setup` (génère `APP_KEY` et `JWT_SECRET`), puis renseigner `DB_*` dans `.env` avant `migrate`.

Compléter `.env` : `APP_URL=https://backend.visioryx.com` et `CORS_ALLOWED_ORIGINS=https://app.visioryx.com`.
Droits : `chown -R www-data:www-data storage bootstrap/cache`.

> Sauvegarder la base avant le premier `migrate` (bonne pratique). Les nouvelles migrations n'ajoutent que des colonnes optionnelles et des tables `react_*`.

## 3. Front React (app.visioryx.com)

```bash
cd frontend/admin
npm ci && npm run build          # lit .env.production → API https://backend.visioryx.com/api/react
```

nginx sert `frontend/admin/dist` (voir `deploy/nginx/`). HTTPS : `certbot --nginx -d backend.visioryx.com -d app.visioryx.com`.

## 4. Mises à jour

`./deploy/deploy.sh`

## 5. Vérifications

```bash
php artisan route:list --path=api/react      # routes React présentes (voir docs/ARCHITECTURE.md si une erreur « Target class » apparaît sur /api)
curl https://backend.visioryx.com/api/version          # API mobile (inchangée)
curl https://backend.visioryx.com/api/react/version    # API React

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

## 6. Routes de l'API React (préfixe `/api/react`)

`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`.

## 7. Limites connues

* Suppression d'un utilisateur = *soft delete* ; une ville/un établissement ayant des données liées ne peut pas être supprimé.
* Types d'établissement renvoyés tels qu'enregistrés par le mobile (ex. `pharmacie`).
* Pas de réinitialisation de mot de passe par e-mail : l'administrateur génère un mot de passe provisoire depuis la fiche utilisateur.
