Initialisation du projet geosector complet (web + flutter)
This commit is contained in:
356
docs/model_definitions.md
Normal file
356
docs/model_definitions.md
Normal file
@@ -0,0 +1,356 @@
|
||||
# Modèles de données GEOSECTOR
|
||||
|
||||
## Description générale
|
||||
|
||||
GEOSECTOR utilise plusieurs modèles de données pour représenter les entités principales de l'application. Ces modèles sont utilisés à la fois pour la persistance locale via Hive et pour la communication avec l'API backend. Ce document décrit en détail chaque modèle, ses propriétés et ses méthodes.
|
||||
|
||||
## Intégration avec Hive
|
||||
|
||||
Tous les modèles sont annotés pour être utilisés avec Hive, une base de données NoSQL légère:
|
||||
|
||||
- Chaque modèle a un `typeId` unique pour Hive
|
||||
- Les propriétés sont annotées avec `@HiveField` et un index unique
|
||||
- Les modèles étendent `HiveObject` pour accéder aux fonctionnalités de persistance
|
||||
|
||||
## Modèle Utilisateur (UserModel)
|
||||
|
||||
**Description**: Représente un utilisateur de l'application, avec ses informations personnelles et de session.
|
||||
|
||||
### Propriétés
|
||||
|
||||
| Propriété | Type | Description | Hive Index |
|
||||
| ------------- | --------- | ----------------------------------------- | ---------- |
|
||||
| id | int | Identifiant unique | 0 |
|
||||
| email | String | Adresse email | 1 |
|
||||
| name | String? | Nom de l'utilisateur | 2 |
|
||||
| username | String? | Nom d'utilisateur pour connexion | 11 |
|
||||
| firstName | String? | Prénom de l'utilisateur | 10 |
|
||||
| role | int | Rôle/niveau d'accès (1=user, 2/4/9=admin) | 3 |
|
||||
| createdAt | DateTime | Date de création du compte | 4 |
|
||||
| lastSyncedAt | DateTime | Dernière synchronisation avec le serveur | 5 |
|
||||
| isActive | bool | Statut actif/inactif | 6 |
|
||||
| isSynced | bool | Indique si synchronisé avec le serveur | 7 |
|
||||
| sessionId | String? | Identifiant de session pour l'API | 8 |
|
||||
| sessionExpiry | DateTime? | Date d'expiration de la session | 9 |
|
||||
| lastPath | String? | Dernier chemin visité dans l'app | 12 |
|
||||
| sectName | String? | Nom de la section/département | 13 |
|
||||
| interface | String? | Type d'interface ('admin' ou 'user') | 14 |
|
||||
|
||||
### Méthodes
|
||||
|
||||
- **fromJson**: Convertit un objet JSON en UserModel
|
||||
- **toJson**: Convertit un UserModel en objet JSON
|
||||
- **copyWith**: Crée une copie avec des valeurs modifiées
|
||||
- **hasValidSession**: Vérifie si la session est valide
|
||||
- **clearSession**: Efface les données de session
|
||||
|
||||
### Exemple d'utilisation
|
||||
|
||||
```dart
|
||||
// Créer un utilisateur
|
||||
final user = UserModel(
|
||||
id: 123,
|
||||
email: "user@example.com",
|
||||
name: "John Doe",
|
||||
username: "johndoe",
|
||||
role: 1,
|
||||
createdAt: DateTime.now(),
|
||||
lastSyncedAt: DateTime.now(),
|
||||
isActive: true,
|
||||
);
|
||||
|
||||
// Vérifier la validité de la session
|
||||
if (user.hasValidSession) {
|
||||
// Utiliser la session...
|
||||
}
|
||||
|
||||
// Créer une version modifiée
|
||||
final updatedUser = user.copyWith(
|
||||
name: "John Smith",
|
||||
isActive: false,
|
||||
);
|
||||
```
|
||||
|
||||
## Modèle Opération (OperationModel)
|
||||
|
||||
**Description**: Représente une opération de collecte avec ses dates et son statut.
|
||||
|
||||
### Propriétés
|
||||
|
||||
| Propriété | Type | Description | Hive Index |
|
||||
| ------------ | -------- | ---------------------------------------- | ---------- |
|
||||
| id | int | Identifiant unique | 0 |
|
||||
| name | String | Nom de l'opération | 1 |
|
||||
| dateDebut | DateTime | Date de début de l'opération | 2 |
|
||||
| dateFin | DateTime | Date de fin de l'opération | 3 |
|
||||
| lastSyncedAt | DateTime | Dernière synchronisation avec le serveur | 4 |
|
||||
| isActive | bool | Statut actif/inactif | 5 |
|
||||
| isSynced | bool | Indique si synchronisé avec le serveur | 6 |
|
||||
|
||||
### Méthodes
|
||||
|
||||
- **fromJson**: Convertit un objet JSON en OperationModel
|
||||
- **toJson**: Convertit un OperationModel en objet JSON
|
||||
- **copyWith**: Crée une copie avec des valeurs modifiées
|
||||
|
||||
### Exemple d'utilisation
|
||||
|
||||
```dart
|
||||
// Créer une opération
|
||||
final operation = OperationModel(
|
||||
id: 456,
|
||||
name: "Opération 2025",
|
||||
dateDebut: DateTime(2025, 1, 1),
|
||||
dateFin: DateTime(2025, 12, 31),
|
||||
lastSyncedAt: DateTime.now(),
|
||||
isActive: true,
|
||||
);
|
||||
|
||||
// Créer une version modifiée
|
||||
final updatedOperation = operation.copyWith(
|
||||
name: "Opération 2025 - Printemps",
|
||||
dateDebut: DateTime(2025, 3, 1),
|
||||
dateFin: DateTime(2025, 6, 30),
|
||||
);
|
||||
```
|
||||
|
||||
## Modèle Secteur (SectorModel)
|
||||
|
||||
**Description**: Représente un secteur géographique avec ses coordonnées et son style.
|
||||
|
||||
### Propriétés
|
||||
|
||||
| Propriété | Type | Description | Hive Index |
|
||||
| --------- | ------ | -------------------------------------------- | ---------- |
|
||||
| id | int | Identifiant unique | 0 |
|
||||
| libelle | String | Nom du secteur | 1 |
|
||||
| color | String | Couleur au format hexadécimal (#RRGGBB) | 2 |
|
||||
| sector | String | Coordonnées du polygone au format spécifique | 3 |
|
||||
|
||||
### Méthodes
|
||||
|
||||
- **fromJson**: Convertit un objet JSON en SectorModel
|
||||
- **toJson**: Convertit un SectorModel en objet JSON
|
||||
- **copyWith**: Crée une copie avec des valeurs modifiées
|
||||
- **getCoordinates**: Extrait les coordonnées du polygone sous forme de liste
|
||||
|
||||
### Format des coordonnées
|
||||
|
||||
Le champ `sector` stocke les coordonnées du polygone dans un format spécifique:
|
||||
|
||||
```
|
||||
lat1/lng1#lat2/lng2#lat3/lng3#...
|
||||
```
|
||||
|
||||
Par exemple:
|
||||
|
||||
```
|
||||
48.8566/2.3522#48.8567/2.3520#48.8565/2.3518#48.8564/2.3521#48.8566/2.3522
|
||||
```
|
||||
|
||||
### Exemple d'utilisation
|
||||
|
||||
```dart
|
||||
// Créer un secteur
|
||||
final sector = SectorModel(
|
||||
id: 789,
|
||||
libelle: "Secteur Nord",
|
||||
color: "#FF5733",
|
||||
sector: "48.8566/2.3522#48.8567/2.3520#48.8565/2.3518#48.8564/2.3521#48.8566/2.3522",
|
||||
);
|
||||
|
||||
// Obtenir les coordonnées du secteur
|
||||
final coordinates = sector.getCoordinates();
|
||||
// Résultat: [[48.8566, 2.3522], [48.8567, 2.3520], [48.8565, 2.3518], ...]
|
||||
```
|
||||
|
||||
## Modèle Membre (MembreModel)
|
||||
|
||||
**Description**: Représente un membre de l'organisation, utilisé uniquement dans l'interface admin.
|
||||
|
||||
### Propriétés
|
||||
|
||||
| Propriété | Type | Description | Hive Index |
|
||||
| ------------- | --------- | -------------------------------- | ---------- |
|
||||
| id | int | Identifiant unique | 0 |
|
||||
| fkRole | int | ID du rôle du membre | 1 |
|
||||
| fkTitre | int | ID du titre (civilité) du membre | 2 |
|
||||
| firstName | String | Prénom du membre | 3 |
|
||||
| sectName | String? | Nom de la section/département | 4 |
|
||||
| dateNaissance | DateTime? | Date de naissance | 5 |
|
||||
| dateEmbauche | DateTime? | Date d'embauche | 6 |
|
||||
| chkActive | int | Statut actif (1) ou inactif (0) | 7 |
|
||||
| name | String | Nom de famille du membre | 8 |
|
||||
| username | String | Nom d'utilisateur pour connexion | 9 |
|
||||
| email | String | Adresse email | 10 |
|
||||
|
||||
### Méthodes
|
||||
|
||||
- **fromJson**: Convertit un objet JSON en MembreModel
|
||||
- **toJson**: Convertit un MembreModel en objet JSON
|
||||
- **copyWith**: Crée une copie avec des valeurs modifiées
|
||||
|
||||
### Exemple d'utilisation
|
||||
|
||||
```dart
|
||||
// Créer un membre
|
||||
final membre = MembreModel(
|
||||
id: 9999979,
|
||||
fkRole: 1,
|
||||
fkTitre: 1,
|
||||
firstName: "Pierre",
|
||||
sectName: "",
|
||||
dateNaissance: DateTime.parse("1966-04-24"),
|
||||
dateEmbauche: DateTime.parse("2017-12-01"),
|
||||
chkActive: 0,
|
||||
name: "VAISSAIRE",
|
||||
username: "pv_mobile",
|
||||
email: "pierre.vaissaire@d6soft.fr",
|
||||
);
|
||||
|
||||
// Créer une version modifiée
|
||||
final updatedMembre = membre.copyWith(
|
||||
chkActive: 1,
|
||||
sectName: "Section A",
|
||||
);
|
||||
```
|
||||
|
||||
## Modèle Passage (PassageModel)
|
||||
|
||||
**Description**: Représente un passage effectué chez un habitant avec toutes les informations associées.
|
||||
|
||||
### Propriétés
|
||||
|
||||
| Propriété | Type | Description | Hive Index |
|
||||
| --------------- | -------- | --------------------------------------------- | ---------- |
|
||||
| id | int | Identifiant unique | 0 |
|
||||
| fkOperation | int | ID de l'opération associée | 1 |
|
||||
| fkSector | int | ID du secteur | 2 |
|
||||
| fkUser | int | ID de l'utilisateur qui a effectué le passage | 3 |
|
||||
| fkType | int | Type de passage (1-6) | 4 |
|
||||
| fkAdresse | String | Identifiant de l'adresse | 5 |
|
||||
| passedAt | DateTime | Date et heure du passage | 6 |
|
||||
| numero | String | Numéro de rue | 7 |
|
||||
| rue | String | Nom de la rue | 8 |
|
||||
| rueBis | String | Complément de rue | 9 |
|
||||
| ville | String | Ville | 10 |
|
||||
| residence | String | Nom de la résidence | 11 |
|
||||
| fkHabitat | int | Type d'habitat | 12 |
|
||||
| appt | String | Numéro d'appartement | 13 |
|
||||
| niveau | String | Niveau/étage | 14 |
|
||||
| gpsLat | String | Latitude GPS | 15 |
|
||||
| gpsLng | String | Longitude GPS | 16 |
|
||||
| nomRecu | String | Nom du fichier de reçu | 17 |
|
||||
| remarque | String | Remarques/commentaires | 18 |
|
||||
| montant | String | Montant collecté | 19 |
|
||||
| fkTypeReglement | int | Type de règlement (0-3) | 20 |
|
||||
| emailErreur | String | Message d'erreur pour l'envoi par email | 21 |
|
||||
| nbPassages | int | Nombre de passages à cette adresse | 22 |
|
||||
| name | String | Nom de l'habitant | 23 |
|
||||
| email | String | Email de l'habitant | 24 |
|
||||
| phone | String | Téléphone de l'habitant | 25 |
|
||||
| lastSyncedAt | DateTime | Dernière synchronisation avec le serveur | 26 |
|
||||
| isActive | bool | Statut actif/inactif | 27 |
|
||||
| isSynced | bool | Indique si synchronisé avec le serveur | 28 |
|
||||
|
||||
### Types de passages
|
||||
|
||||
| ID | Description | Couleur |
|
||||
| --- | ----------- | ---------- |
|
||||
| 1 | Effectué | Vert |
|
||||
| 2 | À finaliser | Orange |
|
||||
| 3 | Refusé | Rouge |
|
||||
| 4 | Don | Bleu ciel |
|
||||
| 5 | Lot | Bleu foncé |
|
||||
| 6 | Maison vide | Gris |
|
||||
|
||||
### Types de règlements
|
||||
|
||||
| ID | Description | Couleur |
|
||||
| --- | ---------------- | ------- |
|
||||
| 0 | Pas de règlement | Gris |
|
||||
| 1 | Espèce | Jaune |
|
||||
| 2 | Chèque | Vert |
|
||||
| 3 | CB | Bleu |
|
||||
|
||||
### Méthodes
|
||||
|
||||
- **fromJson**: Convertit un objet JSON en PassageModel
|
||||
- **toJson**: Convertit un PassageModel en objet JSON
|
||||
- **copyWith**: Crée une copie avec des valeurs modifiées
|
||||
- **toString**: Représentation textuelle pour débogage
|
||||
|
||||
### Exemple d'utilisation
|
||||
|
||||
```dart
|
||||
// Créer un passage
|
||||
final passage = PassageModel(
|
||||
id: 1001,
|
||||
fkOperation: 456,
|
||||
fkSector: 789,
|
||||
fkUser: 123,
|
||||
fkType: 1, // Effectué
|
||||
fkAdresse: "ADRESSE-123",
|
||||
passedAt: DateTime.now(),
|
||||
numero: "12",
|
||||
rue: "Rue des Lilas",
|
||||
ville: "Paris",
|
||||
gpsLat: "48.8566",
|
||||
gpsLng: "2.3522",
|
||||
montant: "25.50",
|
||||
fkTypeReglement: 2, // Chèque
|
||||
nbPassages: 1,
|
||||
name: "Dupont",
|
||||
lastSyncedAt: DateTime.now(),
|
||||
);
|
||||
|
||||
// Créer une version modifiée
|
||||
final updatedPassage = passage.copyWith(
|
||||
montant: "30.00",
|
||||
remarque: "Client fidèle",
|
||||
);
|
||||
```
|
||||
|
||||
## Relations entre les modèles
|
||||
|
||||
Les modèles sont reliés entre eux par des clés étrangères:
|
||||
|
||||
1. **PassageModel**:
|
||||
|
||||
- `fkOperation` → `OperationModel.id`
|
||||
- `fkSector` → `SectorModel.id`
|
||||
- `fkUser` → `UserModel.id`
|
||||
|
||||
2. **SectorModel**:
|
||||
|
||||
- Lié aux opérations via les passages
|
||||
|
||||
3. **OperationModel**:
|
||||
|
||||
- Contient des secteurs et des passages
|
||||
|
||||
4. **UserModel**:
|
||||
- Possède des passages
|
||||
|
||||
## Gestion de la synchronisation
|
||||
|
||||
Tous les modèles principaux possèdent les propriétés de synchronisation:
|
||||
|
||||
- `isSynced`: Indique si l'objet a été synchronisé avec le serveur
|
||||
- `lastSyncedAt`: Date de dernière synchronisation
|
||||
|
||||
Cette approche permet le travail hors ligne et la synchronisation ultérieure des modifications.
|
||||
|
||||
## Stockage Hive
|
||||
|
||||
Les modèles sont stockés dans des "boxes" Hive distinctes:
|
||||
|
||||
| Modèle | Nom de la box | Type ID |
|
||||
| -------------- | ------------- | ------- |
|
||||
| UserModel | users | 0 |
|
||||
| OperationModel | operations | 1 |
|
||||
| SectorModel | sectors | 3 |
|
||||
| PassageModel | passages | 4 |
|
||||
| MembreModel | membres | 5 |
|
||||
|
||||
Les boxes sont initialisées au démarrage de l'application ou lors de la connexion d'un utilisateur.
|
||||
Reference in New Issue
Block a user