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