- Ajout système complet de gestion des secteurs avec contours géographiques - Import des contours départementaux depuis GeoJSON - API REST pour la gestion des secteurs (/api/sectors) - Service de géolocalisation pour déterminer les secteurs - Migration base de données avec tables x_departements_contours et sectors_adresses - Interface Flutter pour visualisation et gestion des secteurs - Ajout thème sombre dans l'application - Corrections diverses et optimisations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
277 lines
6.5 KiB
Markdown
Executable File
277 lines
6.5 KiB
Markdown
Executable File
# Système d'Export/Import d'Opérations - Geosector API
|
|
|
|
## Vue d'ensemble
|
|
|
|
Le système d'export/import permet de sauvegarder et restaurer des opérations complètes avec toutes leurs données associées (passages, utilisateurs, secteurs, relations).
|
|
|
|
## Architecture
|
|
|
|
### Routes API
|
|
|
|
#### Exports
|
|
|
|
- `GET /api/operations/{id}/export/excel` - Export Excel (consultation)
|
|
- `GET /api/operations/{id}/export/json` - Export JSON (sauvegarde)
|
|
- `GET /api/operations/{id}/export/full` - Export combiné (Excel + JSON)
|
|
|
|
#### Gestion des sauvegardes
|
|
|
|
- `GET /api/operations/{id}/backups` - Liste des sauvegardes
|
|
- `GET /api/operations/{id}/backups/{backup_id}` - Télécharger une sauvegarde
|
|
- `DELETE /api/operations/{id}/backups/{backup_id}` - Supprimer une sauvegarde
|
|
|
|
### Structure des fichiers
|
|
|
|
```
|
|
uploads/entites/{entite_id}/operations/{operation_id}/documents/exports/
|
|
├── excel/
|
|
│ └── geosector-export-{operation_id}-{timestamp}.xlsx
|
|
└── json/
|
|
└── geosector-backup-{operation_id}-{type}-{timestamp}.json
|
|
```
|
|
|
|
## Export Excel
|
|
|
|
### Contenu
|
|
|
|
Le fichier Excel contient 4 feuilles :
|
|
|
|
#### 1. Feuille "Passages"
|
|
|
|
- **Colonnes** : ID_Passage, Date, Heure, Prénom, Nom, Tournée, Type, N°, Rue, Ville, Habitat, Donateur, Email, Tél, Montant, Règlement, Remarque, FK_User, FK_Sector, FK_Operation
|
|
- **Données déchiffrées** : Noms, emails, téléphones
|
|
- **Formatage** : Dates françaises (dd/mm/yyyy), types traduits
|
|
|
|
#### 2. Feuille "Utilisateurs"
|
|
|
|
- **Colonnes** : ID_User, Nom, Prénom, Email, Téléphone, Mobile, Rôle, Date_création, Actif, FK_Entite
|
|
- **Données déchiffrées** : Informations personnelles
|
|
|
|
#### 3. Feuille "Secteurs"
|
|
|
|
- **Colonnes** : ID_Sector, Libellé, Couleur, Date_création, Actif, FK_Operation
|
|
|
|
#### 4. Feuille "Secteurs-Utilisateurs"
|
|
|
|
- **Colonnes** : ID_Relation, FK_Sector, Nom_Secteur, FK_User, Nom_Utilisateur, Date_assignation, FK_Operation
|
|
|
|
### Paramètres optionnels
|
|
|
|
- `?user_id={id}` - Filtrer les passages par utilisateur
|
|
|
|
### Exemple d'utilisation
|
|
|
|
```bash
|
|
# Export complet
|
|
GET /api/operations/2644/export/excel
|
|
|
|
# Export filtré par utilisateur
|
|
GET /api/operations/2644/export/excel?user_id=123
|
|
```
|
|
|
|
## Export JSON
|
|
|
|
### Structure du fichier JSON
|
|
|
|
```json
|
|
{
|
|
"export_metadata": {
|
|
"version": "1.0",
|
|
"export_date": "2025-06-21T16:19:23Z",
|
|
"source_entite_id": 5,
|
|
"export_type": "full_operation"
|
|
},
|
|
"operation": {
|
|
"id": 2644,
|
|
"libelle": "OPE 2024-25",
|
|
"date_deb": "2024-09-01",
|
|
"date_fin": "2025-05-30",
|
|
"fk_entite": 5,
|
|
"chk_distinct_sectors": 1,
|
|
"created_at": "2024-08-15T10:00:00Z"
|
|
},
|
|
"users": [...],
|
|
"sectors": [...],
|
|
"passages": [...],
|
|
"user_sectors": [...]
|
|
}
|
|
```
|
|
|
|
### Types d'export JSON
|
|
|
|
- **manual** : Export à la demande (par défaut)
|
|
- **auto** : Sauvegarde automatique (avant modifications importantes)
|
|
|
|
### Paramètres
|
|
|
|
- `?type=manual|auto` - Type d'export
|
|
|
|
## Sécurité
|
|
|
|
### Contrôles d'accès
|
|
|
|
- ✅ Authentification obligatoire
|
|
- ✅ Vérification d'appartenance à l'entité
|
|
- ✅ Isolation des données par entité
|
|
- ✅ Logs détaillés de toutes les opérations
|
|
|
|
### Données sensibles
|
|
|
|
- ✅ Chiffrement/déchiffrement automatique
|
|
- ✅ Données personnelles protégées
|
|
- ✅ Pas d'exposition des clés de chiffrement
|
|
|
|
## Stockage et organisation
|
|
|
|
### Enregistrement en base
|
|
|
|
Tous les fichiers sont enregistrés dans la table `medias` :
|
|
|
|
```sql
|
|
support = 'operation'
|
|
support_id = {operation_id}
|
|
file_type = 'xlsx' | 'json'
|
|
description = 'Export Excel opération - {libelle}'
|
|
```
|
|
|
|
### Métadonnées des fichiers
|
|
|
|
- **ID** : Identifiant unique en base
|
|
- **Filename** : Nom du fichier généré
|
|
- **Path** : Chemin relatif depuis la racine
|
|
- **Size** : Taille en octets
|
|
- **Type** : excel | json
|
|
|
|
## Exemples de réponses API
|
|
|
|
### Export Excel réussi
|
|
|
|
```json
|
|
{
|
|
"status": "success",
|
|
"message": "Export Excel généré avec succès",
|
|
"file": {
|
|
"id": 123,
|
|
"filename": "geosector-export-2644-20250621-161923.xlsx",
|
|
"path": "uploads/entites/5/operations/2644/documents/exports/excel/geosector-export-2644-20250621-161923.xlsx",
|
|
"size": 45678,
|
|
"type": "excel"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Export complet réussi
|
|
|
|
```json
|
|
{
|
|
"status": "success",
|
|
"message": "Export complet généré avec succès",
|
|
"files": {
|
|
"excel": {
|
|
"id": 123,
|
|
"filename": "geosector-export-2644-20250621-161923.xlsx",
|
|
"path": "uploads/entites/5/operations/2644/documents/exports/excel/geosector-export-2644-20250621-161923.xlsx",
|
|
"size": 45678,
|
|
"type": "excel"
|
|
},
|
|
"json": {
|
|
"id": 124,
|
|
"filename": "geosector-backup-2644-manual-20250621-161923.json",
|
|
"path": "uploads/entites/5/operations/2644/documents/exports/json/geosector-backup-2644-manual-20250621-161923.json",
|
|
"size": 12345,
|
|
"type": "json"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Liste des sauvegardes
|
|
|
|
```json
|
|
{
|
|
"status": "success",
|
|
"backups": [
|
|
{
|
|
"id": 124,
|
|
"fichier": "geosector-backup-2644-manual-20250621-161923.json",
|
|
"file_type": "json",
|
|
"file_size": 12345,
|
|
"description": "Sauvegarde JSON opération - manual - OPE 2024-25",
|
|
"created_at": "2025-06-21 16:19:23",
|
|
"fk_user_creat": 1
|
|
},
|
|
{
|
|
"id": 123,
|
|
"fichier": "geosector-export-2644-20250621-161923.xlsx",
|
|
"file_type": "xlsx",
|
|
"file_size": 45678,
|
|
"description": "Export Excel opération - OPE 2024-25",
|
|
"created_at": "2025-06-21 16:19:23",
|
|
"fk_user_creat": 1
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Installation et dépendances
|
|
|
|
### PhpSpreadsheet
|
|
|
|
```bash
|
|
composer require phpoffice/phpspreadsheet
|
|
```
|
|
|
|
### Permissions de dossiers
|
|
|
|
```bash
|
|
chmod 755 uploads/
|
|
chmod 755 uploads/entites/
|
|
```
|
|
|
|
## Gestion des erreurs
|
|
|
|
### Erreurs courantes
|
|
|
|
- **401** : Non authentifié
|
|
- **403** : Pas d'accès à l'entité
|
|
- **404** : Opération non trouvée
|
|
- **500** : Erreur de génération
|
|
|
|
### Logs
|
|
|
|
Tous les événements sont loggés via `LogService` :
|
|
|
|
- Exports réussis (level: info)
|
|
- Erreurs de génération (level: error)
|
|
- Tentatives d'accès non autorisées (level: warning)
|
|
|
|
## Maintenance
|
|
|
|
### Nettoyage automatique (à implémenter)
|
|
|
|
- Sauvegardes auto > 30 jours
|
|
- Fichiers temporaires > 24h
|
|
- Vérification cohérence base/fichiers
|
|
|
|
### Monitoring
|
|
|
|
- Espace disque utilisé
|
|
- Nombre de fichiers par entité
|
|
- Fréquence des exports
|
|
|
|
## Évolutions futures
|
|
|
|
### Import/Restauration
|
|
|
|
- Validation des fichiers JSON
|
|
- Import transactionnel
|
|
- Gestion des conflits d'IDs
|
|
- Mapping entités source/cible
|
|
|
|
### Optimisations
|
|
|
|
- Compression des fichiers
|
|
- Export asynchrone pour gros volumes
|
|
- Cache des exports fréquents
|
|
- API de streaming pour téléchargements
|