# Amélioration du Suivi GPS des Techniciens

## 🎯 Problèmes résolus

### 1. **Précision GPS améliorée**
- ✅ Utilisation de `enableHighAccuracy: true` pour forcer l'utilisation du GPS au lieu du réseau
- ✅ `maximumAge: 0` pour éviter l'utilisation de positions en cache
- ✅ Filtrage des positions imprécises (> 50m de précision)
- ✅ Affichage d'un cercle de précision lors de la localisation
- ✅ Messages d'erreur détaillés selon le type de problème GPS

### 2. **Traçage des déplacements**
- ✅ Nouvelle table `technician_location_history` pour stocker l'historique
- ✅ Enregistrement automatique uniquement si déplacement > 10 mètres
- ✅ Affichage des trajectoires sur la carte avec polylines
- ✅ Flèches de direction pour visualiser le sens du déplacement
- ✅ Calcul de la distance parcourue
- ✅ Marqueurs de départ et d'arrivée

### 3. **Interface améliorée**
- ✅ Nouveau bouton "Trajectoires" pour afficher/masquer les parcours
- ✅ Feedback visuel lors de la localisation (spinner)
- ✅ Changement d'état du bouton "Suivi actif" quand activé
- ✅ Couleurs différentes pour chaque technicien
- ✅ Popups détaillées avec infos de trajet

## 📊 Architecture

```
┌──────────────────────────────────────────┐
│  Géolocalisation HTML5 (watchPosition)   │
│  Options: enableHighAccuracy, maxAge=0   │
└─────────────────┬────────────────────────┘
                  │
                  ↓
┌──────────────────────────────────────────┐
│  Filtrage: accuracy < 50m                │
│  Calcul distance depuis dernier point    │
└─────────────────┬────────────────────────┘
                  │
                  ↓
┌──────────────────────────────────────────┐
│  Table: technician_locations             │
│  (position actuelle)                     │
│  UPDATE si existe, INSERT sinon          │
└─────────────────┬────────────────────────┘
                  │
                  ↓ (si mouvement > 10m)
┌──────────────────────────────────────────┐
│  Table: technician_location_history      │
│  INSERT nouveau point                    │
│  Stockage: lat, lng, speed, heading      │
└─────────────────┬────────────────────────┘
                  │
                  ↓
┌──────────────────────────────────────────┐
│  API: /cartography/trajectories          │
│  Récupération des N dernières heures     │
└─────────────────┬────────────────────────┘
                  │
                  ↓
┌──────────────────────────────────────────┐
│  Leaflet: Polylines + Decorators         │
│  Affichage avec flèches directionnelles  │
└──────────────────────────────────────────┘
```

## 🚀 Utilisation

### Étape 1 : Migration SQL
Exécutez le script de migration :
```bash
mysql -u root -p bd_insuite_backbone < database/add_technician_trajectories.sql
```

Ou dans phpMyAdmin :
```sql
SOURCE c:\laragon\www\Insuite_backbones\database\add_technician_trajectories.sql;
```

### Étape 2 : Activer le suivi
1. Accédez à [http://localhost/Insuite_backbones/public/cartographie](http://localhost/Insuite_backbones/public/cartographie)
2. Cliquez sur **"Suivi en temps réel"**
3. Autorisez l'accès à votre position GPS
4. Le bouton devient bleu "Suivi actif"
5. Votre position est envoyée automatiquement toutes les ~10-30 secondes (selon mouvement)

### Étape 3 : Visualiser les trajectoires
1. Cliquez sur **"Trajectoires"** 
2. Les parcours des 2 dernières heures s'affichent
3. Chaque technicien a une couleur différente
4. Cliquez sur une ligne pour voir les détails (distance, durée, points)

## 📱 Précision GPS

### Facteurs affectant la précision

| Situation | Précision typique | Solution |
|-----------|-------------------|----------|
| 🏢 Intérieur bâtiment | 50-200m | Activer WiFi + GPS |
| 🌳 Extérieur avec obstacles | 20-50m | Dégager la vue du ciel |
| 🛰️ Extérieur dégagé | 5-10m | ✅ Optimal |
| 📡 Réseau uniquement | 100-1000m | Activer GPS |

### Paramètres de précision

```javascript
const geoOptions = {
  enableHighAccuracy: true,  // Force GPS (batterie++)
  maximumAge: 0,             // Pas de cache
  timeout: 15000             // 15 secondes max
};
```

### Filtrage des positions

```javascript
// Ignorer si précision > 50m
if (pos.coords.accuracy > 50) {
  console.log('Position ignorée (imprécise)');
  return;
}
```

## 🔧 Configuration

### Modifier le seuil de mouvement

Dans `CartographyController.php`, ligne ~157 :
```php
// Ne stocker que si déplacement > 10 mètres
$needsHistory = $distance > 10;
```

Ajustez la valeur (en mètres) selon vos besoins :
- **5m** : Traçage très détaillé (+ de points en BDD)
- **10m** : Équilibre recommandé
- **20m** : Traçage grossier (- de points)

### Modifier la durée d'historique affichée

Dans `index.php`, route trajectories :
```javascript
const res = await fetch(BASE + '/cartography/trajectories?hours=2');
```

Paramètre `hours` :
- **1** : Dernière heure
- **2** : 2 dernières heures (défaut)
- **24** : Dernière journée

### Modifier la fréquence de rafraîchissement

Dans `index.php` :
```javascript
setInterval(loadTechnicians, 15000); // 15 secondes
```

Ajustez selon le compromis performance/temps réel :
- **5000** : 5 secondes (temps réel, charge serveur++)
- **15000** : 15 secondes (recommandé)
- **30000** : 30 secondes (économie ressources)

## 🗄️ Structure des tables

### `technician_locations` (position actuelle)
```sql
user_id     INT          -- ID utilisateur
latitude    DECIMAL(10,8) -- Latitude GPS
longitude   DECIMAL(11,8) -- Longitude GPS
accuracy    FLOAT        -- Précision en mètres
heading     FLOAT        -- Direction 0-360°
speed       FLOAT        -- Vitesse en m/s
updated_at  TIMESTAMP    -- Dernière mise à jour
```

### `technician_location_history` (trajectoires)
```sql
id          INT AUTO_INCREMENT
user_id     INT
latitude    DECIMAL(10,8)
longitude   DECIMAL(11,8)
accuracy    FLOAT
heading     FLOAT
speed       FLOAT
recorded_at TIMESTAMP    -- Horodatage du point
```

## 📈 Optimisations

### Nettoyage automatique

Un événement MySQL supprime automatiquement l'historique > 7 jours :
```sql
CREATE EVENT cleanup_old_location_history
ON SCHEDULE EVERY 1 DAY
DO DELETE FROM technician_location_history 
   WHERE recorded_at < DATE_SUB(NOW(), INTERVAL 7 DAY);
```

### Index pour performance
```sql
INDEX idx_user_time (user_id, recorded_at)  -- Requêtes par technicien
INDEX idx_recorded_at (recorded_at)          -- Nettoyage par date
```

## 🎨 Personnalisation

### Couleurs des trajectoires

Dans `index.php`, ligne ~197 :
```javascript
const colors = ['#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6', '#ec4899'];
```

Modifiez avec vos couleurs préférées (format hexadécimal).

### Style des lignes

```javascript
const polyline = L.polyline(latlngs, {
  color: color,      // Couleur
  weight: 3,         // Épaisseur (px)
  opacity: 0.7,      // Transparence (0-1)
  smoothFactor: 1    // Lissage (0-3)
});
```

### Flèches de direction

```javascript
const decorator = L.polylineDecorator(polyline, {
  patterns: [{
    offset: '50%',     // Position sur la ligne
    repeat: 100,       // Espacement (pixels)
    symbol: L.Symbol.arrowHead({
      pixelSize: 8,    // Taille de la flèche
      polygon: false,
      pathOptions: { stroke: true, color: color, weight: 2 }
    })
  }]
});
```

## 🐛 Dépannage

### Problème : Position pas enregistrée

1. Vérifier les logs navigateur (F12 → Console)
2. Vérifier que la table existe :
   ```sql
   SHOW TABLES LIKE 'technician_location%';
   ```
3. Vérifier les permissions GPS du navigateur
4. Tester avec `console.log` dans `sendLocation()`

### Problème : Trajectoires vides

1. Vérifier qu'il y a des données :
   ```sql
   SELECT COUNT(*) FROM technician_location_history;
   ```
2. Vérifier le paramètre `hours` (peut-être trop court)
3. Vérifier que le seuil de mouvement (10m) est atteint

### Problème : Précision insuffisante

1. Activer le GPS du smartphone (pas juste WiFi)
2. Autoriser l'accès à la position précise (pas approximative)
3. Se placer en extérieur avec vue dégagée du ciel
4. Vérifier `enableHighAccuracy: true` dans le code

### Problème : Batterie se vide rapidement

1. Désactiver le suivi temps réel quand non utilisé
2. Augmenter `maximumAge` (ex: 5000 au lieu de 0)
3. Réduire la fréquence de watchPosition
4. Utiliser réseau au lieu de GPS (moins précis mais économe)

## 📊 Métriques

Données stockées par technicien actif (suivi 8h/jour) :
- **Position actuelle** : 1 ligne (mise à jour)
- **Historique** : ~200-500 points/jour (selon mobilité)
- **Espace disque** : ~50 Ko/technicien/jour
- **Rétention** : 7 jours (nettoyage auto)

## 🔐 Sécurité & Confidentialité

- ✅ Authentification requise pour accéder aux positions
- ✅ Seuls les utilisateurs connectés peuvent partager leur position
- ✅ Suppression automatique après 7 jours
- ✅ Pas de partage avec tiers
- ⚠️ Informer les techniciens du suivi GPS (conformité RGPD)

## 📚 Ressources

- [Geolocation API (MDN)](https://developer.mozilla.org/fr/docs/Web/API/Geolocation_API)
- [Leaflet Documentation](https://leafletjs.com/)
- [Leaflet Polyline Decorator](https://github.com/bbecquet/Leaflet.PolylineDecorator)
- [Formule de Haversine](https://fr.wikipedia.org/wiki/Formule_de_haversine)
