feat: Gestion des secteurs et migration v3.0.4+304
- 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>
This commit is contained in:
455
app/docs/GESTION-API-SECTORS.md
Normal file
455
app/docs/GESTION-API-SECTORS.md
Normal file
@@ -0,0 +1,455 @@
|
||||
# GESTION-SECTORS.md
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Ce document décrit le système de gestion des secteurs dans l'API Geosector, incluant la connexion aux bases de données d'adresses externes, la validation des limites départementales, et le processus complet de création de secteurs avec génération automatique des passages.
|
||||
|
||||
## Évolutions récentes
|
||||
|
||||
### Gestion des sessions
|
||||
|
||||
- La session stocke maintenant `entity_id` depuis `fk_entite` lors du login
|
||||
- Méthode `Session::getEntityId()` disponible pour récupérer l'ID de l'entité
|
||||
- Utilisation cohérente de l'entity_id dans toutes les opérations
|
||||
|
||||
### Gestion des passages orphelins
|
||||
|
||||
- Les passages avec `fk_sector = 0` sont automatiquement intégrés au nouveau secteur
|
||||
- Évite les doublons pour les passages ayant déjà une `fk_adresse`
|
||||
- Mise à jour atomique dans la transaction de création du secteur
|
||||
|
||||
## Architecture multi-bases
|
||||
|
||||
### Bases de données principales
|
||||
|
||||
1. **Base principale** (`geosector_app`)
|
||||
|
||||
- Contient toutes les tables de l'application
|
||||
- Tables concernées : `ope_sectors`, `sectors_adresses`, `ope_pass`, `ope_users_sectors`, `x_departements_contours`
|
||||
|
||||
2. **Base adresses** (dans conteneurs Incus séparés)
|
||||
- DVA : `dva-maria` (13.23.33.46) - base `adresses`
|
||||
- RCA : `rca-maria` (13.23.33.36) - base `adresses`
|
||||
- PRA : `pra-maria` (13.23.33.26) - base `adresses`
|
||||
- Credentials : `adr_geo_user` / `d66,AdrGeoDev.User`
|
||||
- Tables par département : `cp22`, `cp23`, etc.
|
||||
|
||||
### Configuration
|
||||
|
||||
Dans `src/Config/AppConfig.php` :
|
||||
|
||||
```php
|
||||
'addresses_database' => [
|
||||
'host' => '13.23.33.46', // Varie selon l'environnement
|
||||
'name' => 'adresses',
|
||||
'username' => 'adr_geo_user',
|
||||
'password' => 'd66,AdrGeoDev.User',
|
||||
],
|
||||
```
|
||||
|
||||
## Gestion des contours départementaux
|
||||
|
||||
### Table x_departements_contours
|
||||
|
||||
Création manuelle de la table (sans DROP permissions) :
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS `x_departements_contours` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`code_dept` varchar(3) NOT NULL,
|
||||
`nom_dept` varchar(100) NOT NULL,
|
||||
`contour` GEOMETRY NOT NULL,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_code_dept` (`code_dept`),
|
||||
SPATIAL KEY `idx_contour` (`contour`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
|
||||
COMMENT='Contours géographiques des départements français';
|
||||
```
|
||||
|
||||
### Import des contours
|
||||
|
||||
1. **Fichier source** : `docs/contour-des-departements.geojson` (depuis data.gouv.fr)
|
||||
2. **Import automatique** : Uniquement lors de la connexion de l'admin `d6soft`
|
||||
3. **Script** : `scripts/init_departements_contours.php`
|
||||
4. **Résultat** : 96 départements importés avec support Polygon et MultiPolygon
|
||||
|
||||
## Services principaux
|
||||
|
||||
### AddressService
|
||||
|
||||
Gère la récupération des adresses depuis la base externe :
|
||||
|
||||
```php
|
||||
class AddressService {
|
||||
// Récupère toutes les adresses dans un polygone
|
||||
public function getAddressesInPolygon(array $coordinates, ?int $entityId = null): array
|
||||
|
||||
// Compte les adresses dans un polygone
|
||||
public function countAddressesInPolygon(array $coordinates, ?int $entityId = null): int
|
||||
}
|
||||
```
|
||||
|
||||
**Caractéristiques** :
|
||||
|
||||
- Détection automatique des départements touchés par le secteur
|
||||
- Interrogation de toutes les tables cp{dept} concernées
|
||||
- Gestion des secteurs multi-départements
|
||||
|
||||
### DepartmentBoundaryService
|
||||
|
||||
Vérifie les limites départementales des secteurs :
|
||||
|
||||
```php
|
||||
class DepartmentBoundaryService {
|
||||
// Vérifie si un secteur est contenu dans un département
|
||||
public function checkSectorInDepartment(array $sectorCoordinates, string $departmentCode): array
|
||||
|
||||
// Liste tous les départements touchés par un secteur
|
||||
public function getDepartmentsForSector(array $sectorCoordinates): array
|
||||
}
|
||||
```
|
||||
|
||||
**Retour type** :
|
||||
|
||||
```php
|
||||
[
|
||||
'is_contained' => bool,
|
||||
'message' => string,
|
||||
'intersecting_departments' => [
|
||||
['code_dept' => '22', 'nom_dept' => 'Côtes-d\'Armor', 'percentage_overlap' => 75.5],
|
||||
['code_dept' => '29', 'nom_dept' => 'Finistère', 'percentage_overlap' => 24.5]
|
||||
]
|
||||
]
|
||||
```
|
||||
|
||||
## Processus de création de secteur
|
||||
|
||||
### 1. Structure du payload
|
||||
|
||||
```json
|
||||
{
|
||||
"user_id": 123,
|
||||
"fk_entite": 45,
|
||||
"operation_id": 789,
|
||||
"sector": {
|
||||
"id": 0,
|
||||
"libelle": "Secteur Centre-Ville",
|
||||
"color": "#FF5733",
|
||||
"sector": "48.117266/-1.6777926#48.118500/-1.6750000#..."
|
||||
},
|
||||
"users": [12, 34, 56, 78]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Étapes de création
|
||||
|
||||
1. **Validation** des données et de l'opération
|
||||
2. **Vérification** des limites départementales (warning si débordement)
|
||||
3. **Début de transaction** pour garantir la cohérence des données
|
||||
4. **Insertion** du secteur dans `ope_sectors`
|
||||
5. **Affectation** des utilisateurs dans `ope_users_sectors` avec :
|
||||
- `fk_operation`, `fk_user`, `fk_sector`
|
||||
- `created_at`, `fk_user_creat`, `chk_active = 1`
|
||||
6. **Intégration des passages orphelins** :
|
||||
- Recherche des passages avec `fk_sector = 0` dans le polygone
|
||||
- Mise à jour de leur `fk_sector` vers le nouveau secteur
|
||||
- Exclusion des passages ayant déjà une `fk_adresse`
|
||||
7. **Récupération** des adresses via `AddressService`
|
||||
8. **Stockage** des adresses dans `sectors_adresses`
|
||||
9. **Création** des passages dans `ope_pass` pour chaque adresse :
|
||||
- Affectés au premier utilisateur de la liste
|
||||
- Avec toutes les FK nécessaires (entité, opération, secteur, user)
|
||||
- Données d'adresse complètes
|
||||
10. **Commit** de la transaction ou **rollback** en cas d'erreur
|
||||
|
||||
### 3. Réponse API pour CREATE
|
||||
|
||||
**Format standardisé** : Les données sont placées à la racine, sans groupe "data" intermédiaire.
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"message": "Secteur créé avec succès",
|
||||
"sector": {
|
||||
"id": 123,
|
||||
"libelle": "Secteur Centre-Ville",
|
||||
"color": "#FF5733",
|
||||
"sector": "48.117266/-1.6777926#48.118500/-1.6750000#..."
|
||||
},
|
||||
"passages_sector": [
|
||||
{
|
||||
"id": 456,
|
||||
"fk_operation": 789,
|
||||
"fk_sector": 123,
|
||||
"fk_user": 12,
|
||||
"fk_type": 2,
|
||||
"fk_adresse": "cp22.12345",
|
||||
"passed_at": null,
|
||||
"numero": "10",
|
||||
"rue": "Rue de la Paix",
|
||||
"rue_bis": "",
|
||||
"ville": "Saint-Brieuc",
|
||||
"residence": null,
|
||||
"fk_habitat": null,
|
||||
"appt": null,
|
||||
"niveau": null,
|
||||
"gps_lat": "48.117266",
|
||||
"gps_lng": "-1.6777926",
|
||||
"nom_recu": null,
|
||||
"name": "", // Décrypté depuis encrypted_name
|
||||
"remarque": null,
|
||||
"email": "", // Décrypté depuis encrypted_email
|
||||
"phone": "", // Décrypté depuis encrypted_phone
|
||||
"montant": null,
|
||||
"fk_type_reglement": null,
|
||||
"email_erreur": null,
|
||||
"nb_passages": null
|
||||
}
|
||||
],
|
||||
"passages_integrated": 5, // Passages orphelins intégrés
|
||||
"passages_created": 10, // Nouveaux passages créés
|
||||
"users_sectors": [
|
||||
{
|
||||
"id": 12,
|
||||
"first_name": "Jean",
|
||||
"sect_name": "JDU",
|
||||
"fk_sector": 123,
|
||||
"name": "Dupont" // Décrypté depuis encrypted_name
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Réponse API pour UPDATE
|
||||
|
||||
La réponse est identique à CREATE avec des compteurs supplémentaires :
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"message": "Secteur modifié avec succès",
|
||||
"sector": {
|
||||
"id": 123,
|
||||
"libelle": "Secteur Centre-Ville Modifié",
|
||||
"color": "#FF5733",
|
||||
"sector": "48.117266/-1.6777926#48.118500/-1.6750000#..."
|
||||
},
|
||||
"passages_sector": [
|
||||
// Liste complète de TOUS les passages actuels du secteur
|
||||
],
|
||||
"passages_orphaned": 3, // Passages mis en orphelin (hors polygone)
|
||||
"passages_updated": 5, // Passages mis à jour avec fk_adresse
|
||||
"passages_created": 10, // Nouveaux passages créés
|
||||
"passages_total": 25, // Nombre total de passages dans le secteur
|
||||
"users_sectors": [
|
||||
// Liste des utilisateurs affectés
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Notes importantes** :
|
||||
|
||||
- Les champs sensibles (name, email, phone) sont stockés cryptés et décryptés à la volée
|
||||
- La structure est identique entre CREATE et UPDATE pour faciliter l'intégration
|
||||
- Tous les champs sont retournés, même s'ils sont null
|
||||
- Code HTTP : 201 pour CREATE, 200 pour UPDATE
|
||||
|
||||
## Gestion des secteurs multi-départements
|
||||
|
||||
### Détection automatique
|
||||
|
||||
Le système détecte automatiquement quand un secteur touche plusieurs départements :
|
||||
|
||||
1. **Analyse spatiale** : Utilisation de `ST_Intersects` pour identifier tous les départements touchés
|
||||
2. **Calcul de pourcentage** : `ST_Area(ST_Intersection)` pour calculer le % de recouvrement
|
||||
3. **Interrogation multi-tables** : Requête sur toutes les tables cp{dept} concernées
|
||||
|
||||
### Exemple de secteur multi-départements
|
||||
|
||||
```php
|
||||
// Secteur à cheval sur 22 (Côtes-d'Armor) et 29 (Finistère)
|
||||
$coordinates = [
|
||||
[48.5778, -3.8280], // Morlaix (29)
|
||||
[48.5778, -3.7280], // Vers l'est (22)
|
||||
[48.4778, -3.7280],
|
||||
[48.4778, -3.8280]
|
||||
];
|
||||
|
||||
// Le système va automatiquement :
|
||||
// 1. Détecter que le secteur touche 22 et 29
|
||||
// 2. Interroger cp22 et cp29 pour les adresses
|
||||
// 3. Créer les passages pour toutes les adresses trouvées
|
||||
```
|
||||
|
||||
## Tables de données
|
||||
|
||||
### ope_sectors
|
||||
|
||||
- `id` : Identifiant unique
|
||||
- `libelle` : Nom du secteur
|
||||
- `color` : Couleur d'affichage
|
||||
- `sector` : Coordonnées (format lat/lng#lat/lng#...)
|
||||
- `fk_entite` : Lien vers l'entité
|
||||
|
||||
### sectors_adresses
|
||||
|
||||
- `fk_sector` : Lien vers le secteur
|
||||
- `fk_address` : ID de l'adresse dans la base externe
|
||||
- `numero`, `voie`, `code_postal`, `commune`
|
||||
- `latitude`, `longitude`
|
||||
|
||||
### ope_pass (passages)
|
||||
|
||||
- `fk_entite`, `fk_operation`, `fk_sector`, `fk_user`
|
||||
- `numero`, `voie`, `code_postal`, `commune`
|
||||
- `latitude`, `longitude`
|
||||
- `created_at`, `fk_user_creat`, `chk_active`
|
||||
|
||||
### ope_users_sectors
|
||||
|
||||
- `fk_operation` : Lien vers l'opération
|
||||
- `fk_user` : Lien vers l'utilisateur (ope_users)
|
||||
- `fk_sector` : Lien vers le secteur
|
||||
- `created_at`, `fk_user_creat`, `chk_active`
|
||||
|
||||
## Logs et monitoring
|
||||
|
||||
Le système génère des logs détaillés pour :
|
||||
|
||||
- Nombre d'adresses trouvées par département
|
||||
- Secteurs hors limites départementales
|
||||
- Passages créés avec succès
|
||||
- Erreurs de connexion aux bases d'adresses
|
||||
- Performance des requêtes spatiales
|
||||
|
||||
## Scripts de test
|
||||
|
||||
- `test_sector_departments.php` : Test des limites départementales
|
||||
- `test_addresses_connection.php` : Test de connexion à la base d'adresses
|
||||
|
||||
## Notes importantes
|
||||
|
||||
1. **Fail-safe** : La création de secteur continue même si la base d'adresses est inaccessible
|
||||
2. **Transactions** :
|
||||
- Toute la création est dans une transaction pour garantir la cohérence
|
||||
- Toujours vérifier `inTransaction()` avant d'appeler `rollBack()`
|
||||
- Gestion correcte des erreurs PDO avec try/catch
|
||||
3. **Performance** : Les requêtes spatiales utilisent des index spatiaux pour optimiser les performances
|
||||
4. **Modification de secteur** : Plus complexe car nécessite de gérer les passages existants (non implémenté)
|
||||
5. **Paramètres SQL** : Utiliser des noms uniques pour éviter l'erreur "Invalid parameter number"
|
||||
6. **Jointures** : Les données utilisateur viennent de la table `users`, pas `ope_users` (qui n'a pas nom/prenom)
|
||||
|
||||
## Bilan de la gestion des adresses et passages
|
||||
|
||||
### Vue d'ensemble du cycle de vie
|
||||
|
||||
```
|
||||
Base Adresses (cp22, cp23...) → sectors_adresses → ope_pass
|
||||
```
|
||||
|
||||
### 1. CRÉATION D'UN SECTEUR
|
||||
|
||||
#### Flux des données :
|
||||
|
||||
1. **Récupération des adresses** depuis la base externe (`AddressService`)
|
||||
2. **Intégration des passages orphelins** (`fk_sector = NULL`) situés dans le polygone
|
||||
3. **Stockage dans `sectors_adresses`** de toutes les adresses du polygone
|
||||
4. **Création automatique de passages** (`ope_pass`) pour chaque adresse SAUF celles déjà utilisées par les passages orphelins
|
||||
|
||||
#### Détails :
|
||||
|
||||
- **Passages créés** : `fk_type = 2`, `encrypted_name = ''` (vide), affectés au premier utilisateur
|
||||
- **Passages orphelins** : mis à jour avec le nouveau `fk_sector`
|
||||
- **Évite les doublons** : les adresses déjà utilisées par des passages orphelins ne génèrent pas de nouveau passage
|
||||
|
||||
### 2. MISE À JOUR D'UN SECTEUR
|
||||
|
||||
#### Processus de mise à jour :
|
||||
|
||||
1. **Mise à jour des attributs** (libelle, color, sector)
|
||||
2. **Mise à jour des membres affectés**
|
||||
3. **Suppression/recréation des adresses** dans `sectors_adresses`
|
||||
4. **Gestion intelligente des passages** via `updatePassagesForSector` :
|
||||
|
||||
#### Gestion des passages lors de l'UPDATE :
|
||||
|
||||
##### a) Vérification géographique des passages existants
|
||||
|
||||
- Pour chaque passage du secteur, vérification si ses coordonnées GPS sont dans le nouveau polygone
|
||||
- **Si DANS le polygone** : Conservation du passage
|
||||
- **Si HORS du polygone** : Mise en orphelin (`fk_sector = NULL`)
|
||||
|
||||
##### b) Traitement des nouvelles adresses
|
||||
|
||||
Pour chaque adresse dans `sectors_adresses` :
|
||||
|
||||
1. **Vérification primaire** : Recherche par `fk_adresse`
|
||||
2. **Vérification secondaire** : Si pas trouvé, recherche par `numero`, `rue_bis`, `rue`, `ville`
|
||||
- Si trouvé → Mise à jour du `fk_adresse` dans le(s) passage(s)
|
||||
3. **Création** : Si aucun passage existant, création avec :
|
||||
- `fk_type = 2`, `encrypted_name = ''`
|
||||
- Affecté au premier utilisateur du secteur
|
||||
- Toutes les données de l'adresse
|
||||
|
||||
### 3. SUPPRESSION D'UN SECTEUR
|
||||
|
||||
#### Traitement différencié des passages :
|
||||
|
||||
1. **Passages "non visités"** (`fk_type = 2` ET `encrypted_name` vide) :
|
||||
|
||||
- Suppression définitive de la base
|
||||
- Ces passages correspondent aux adresses non visitées
|
||||
|
||||
2. **Passages "visités"** (tous les autres) :
|
||||
- Mise à jour : `fk_sector = NULL`
|
||||
- Deviennent des passages orphelins
|
||||
- Conservent toutes leurs données (contact, montant, etc.)
|
||||
|
||||
#### Autres suppressions :
|
||||
|
||||
- Suppression des affectations membres (`ope_users_sectors`)
|
||||
- Suppression des adresses (`sectors_adresses`)
|
||||
- Suppression du secteur lui-même
|
||||
|
||||
### Tableau récapitulatif
|
||||
|
||||
| Action | sectors_adresses | ope_pass dans polygone | ope_pass hors polygone | Nouvelles adresses |
|
||||
| ------ | ----------------------------- | ------------------------------------------------ | ------------------------ | ----------------------------------- |
|
||||
| CREATE | Insertion depuis base externe | - | Intégration si orphelins | Création automatique de passages |
|
||||
| UPDATE | Suppression/recréation | Conservation | Mise en orphelin | Création si pas de passage existant |
|
||||
| DELETE | Suppression totale | Suppression si non visités / Orphelin si visités | - | - |
|
||||
|
||||
### Points d'attention
|
||||
|
||||
1. **Cohérence géographique** : Lors d'un UPDATE, le système vérifie automatiquement et met en orphelin les passages hors du nouveau périmètre
|
||||
2. **Passages orphelins** : Peuvent être réintégrés lors de la création d'un nouveau secteur englobant
|
||||
3. **Mise à jour du fk_adresse** : Lors d'un UPDATE, les passages existants peuvent recevoir leur `fk_adresse` s'ils correspondent à une adresse
|
||||
4. **Performance** : La création/mise à jour génère potentiellement des milliers de passages selon la densité d'adresses
|
||||
|
||||
## Erreurs communes et solutions
|
||||
|
||||
### "There is no active transaction"
|
||||
|
||||
- **Cause** : Appel à `rollBack()` sans transaction active
|
||||
- **Solution** : Vérifier `$db->inTransaction()` avant rollback
|
||||
|
||||
### "Column not found: fk_address"
|
||||
|
||||
- **Cause** : La colonne s'appelle `fk_adresse` (avec 'e')
|
||||
- **Solution** : Corriger les noms de colonnes dans les requêtes
|
||||
|
||||
### "Invalid parameter number"
|
||||
|
||||
- **Cause** : Réutilisation du même nom de paramètre dans une requête
|
||||
- **Solution** : Utiliser des noms uniques (`:param1`, `:param2`, etc.)
|
||||
|
||||
### "Unknown column 'ou.nom'"
|
||||
|
||||
- **Cause** : La table `ope_users` n'a pas de colonnes nom/prenom
|
||||
- **Solution** : Joindre avec la table `users` qui contient `encrypted_name` et `first_name`
|
||||
|
||||
### "Class 'ApiService' not found"
|
||||
|
||||
- **Cause** : Import manquant dans le controller
|
||||
- **Solution** : Ajouter `use App\Services\ApiService;` et `require_once`
|
||||
453
app/docs/GESTION-SECTEURS.md
Normal file
453
app/docs/GESTION-SECTEURS.md
Normal file
@@ -0,0 +1,453 @@
|
||||
# Gestion des Secteurs et de la Carte
|
||||
|
||||
Ce document centralise toutes les règles de gestion des secteurs et de la carte dans l'application Geosector.
|
||||
|
||||
**Dernière mise à jour** : Décembre 2024 - Améliorations de la détection d'adjacence et de l'ergonomie du drag
|
||||
|
||||
## Table des matières
|
||||
|
||||
1. [Vue d'ensemble](#vue-densemble)
|
||||
2. [Structure des données](#structure-des-données)
|
||||
3. [Modes de la carte](#modes-de-la-carte)
|
||||
4. [Création d'un secteur](#création-dun-secteur)
|
||||
5. [Gestion des secteurs adjacents](#gestion-des-secteurs-adjacents)
|
||||
6. [Modification d'un secteur](#modification-dun-secteur)
|
||||
7. [Suppression d'un secteur](#suppression-dun-secteur)
|
||||
8. [Affichage des secteurs](#affichage-des-secteurs)
|
||||
9. [Affichage des passages](#affichage-des-passages)
|
||||
10. [Permissions et rôles](#permissions-et-rôles)
|
||||
11. [Synchronisation API/Hive](#synchronisation-apihive)
|
||||
12. [Interactions utilisateur](#interactions-utilisateur)
|
||||
13. [Bonnes pratiques](#bonnes-pratiques)
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
La carte administrative (`AdminMapPage`) permet aux administrateurs de gérer les secteurs géographiques d'une opération. Chaque secteur est un polygone défini par des coordonnées GPS et peut contenir des passages (adresses à visiter).
|
||||
|
||||
### Technologies utilisées
|
||||
- **flutter_map** avec **MapBox** pour l'affichage de la carte
|
||||
- **Hive** pour le stockage local des données
|
||||
- **ValueListenableBuilder** pour la mise à jour réactive de l'interface
|
||||
|
||||
## Structure des données
|
||||
|
||||
### SectorModel
|
||||
```dart
|
||||
{
|
||||
id: int, // Identifiant unique
|
||||
libelle: String, // Nom du secteur
|
||||
color: String, // Couleur hexadécimale (#RRGGBB)
|
||||
sector: String // Coordonnées "lat/lng#lat/lng#..."
|
||||
}
|
||||
```
|
||||
|
||||
### PassageModel
|
||||
```dart
|
||||
{
|
||||
id: int,
|
||||
fk_sector: int, // ID du secteur
|
||||
fk_user: int, // ID de l'utilisateur assigné
|
||||
fk_type: int, // Type de passage (1-6)
|
||||
gps_lat: String, // Latitude
|
||||
gps_lng: String, // Longitude
|
||||
numero: String, // Numéro de rue
|
||||
rue: String, // Nom de la rue
|
||||
ville: String, // Ville
|
||||
// ... autres champs
|
||||
}
|
||||
```
|
||||
|
||||
### Types de passages
|
||||
- **1** : Effectué (vert)
|
||||
- **2** : À finaliser (orange)
|
||||
- **3** : Refusé (rouge)
|
||||
- **4** : Don (bleu)
|
||||
- **5** : Lot (violet)
|
||||
- **6** : Maison vide (gris)
|
||||
|
||||
## Modes de la carte
|
||||
|
||||
La carte peut être dans l'un des modes suivants :
|
||||
|
||||
### MapMode.view (Mode visualisation)
|
||||
- Mode par défaut
|
||||
- Permet de naviguer sur la carte
|
||||
- Affiche les secteurs et passages
|
||||
- Permet la sélection d'un secteur via la combobox
|
||||
|
||||
### MapMode.drawing (Mode création)
|
||||
- Activé par le bouton "Créer un secteur"
|
||||
- Affiche une carte d'aide explicative
|
||||
- Permet de dessiner un nouveau secteur en cliquant sur la carte
|
||||
- Points verts pour le premier point, bleus pour les suivants
|
||||
- Fermeture du polygone en cliquant sur le premier point
|
||||
|
||||
### MapMode.editing (Mode édition)
|
||||
- Activé par le bouton "Modifier un secteur"
|
||||
- Permet de modifier les contours d'un secteur existant
|
||||
- Sélectionner un secteur par clic ou via la combobox puis cliquer "Modifier"
|
||||
- Points orange draggables avec magnétisme automatique
|
||||
- Ajout de points via les points intermédiaires gris
|
||||
- Suppression de points avec clic droit ou Ctrl+clic
|
||||
|
||||
### MapMode.deleting (Mode suppression)
|
||||
- Activé par le bouton "Supprimer un secteur"
|
||||
- Affiche une carte d'aide avec avertissements
|
||||
- Permet de sélectionner un secteur à supprimer en cliquant dessus
|
||||
- Le secteur sélectionné apparaît en rouge
|
||||
|
||||
## Création d'un secteur
|
||||
|
||||
### Processus de création
|
||||
|
||||
1. **Dessin du secteur**
|
||||
- L'administrateur clique sur le bouton "Créer un secteur"
|
||||
- Il dessine le contour en cliquant sur la carte (minimum 3 points)
|
||||
- Il ferme le polygone en cliquant sur le premier point
|
||||
|
||||
2. **Dialog de création**
|
||||
- Nom du secteur (obligatoire)
|
||||
- Couleur du secteur (sélection dans une palette)
|
||||
- Sélection des membres assignés (au moins un obligatoire)
|
||||
|
||||
3. **Envoi à l'API**
|
||||
```json
|
||||
{
|
||||
"id": 0,
|
||||
"libelle": "Nom du secteur",
|
||||
"color": "#2196F3",
|
||||
"sector": "lat/lng#lat/lng#...",
|
||||
"operation_id": 3124,
|
||||
"fk_entite": 5,
|
||||
"users": [9999980, 9999985]
|
||||
}
|
||||
```
|
||||
|
||||
4. **Réponse de l'API**
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"sector": { /* ou sector_id */ },
|
||||
"passages_sector": [...],
|
||||
"passages_created": 86,
|
||||
"passages_integrated": 0,
|
||||
"users_sectors": [...],
|
||||
"warning": "Avertissement si débordement départemental",
|
||||
"intersecting_departments": [
|
||||
{
|
||||
"code_dept": "35",
|
||||
"nom_dept": "Ille-et-Vilaine",
|
||||
"percentage_overlap": 85.2
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
5. **Traitement de la réponse**
|
||||
- Le secteur est sauvegardé dans Hive
|
||||
- Les passages sont créés avec les coordonnées GPS
|
||||
- Les associations utilisateur-secteur sont traitées
|
||||
- La carte se centre sur le nouveau secteur
|
||||
|
||||
### Règles de création
|
||||
- Un secteur doit avoir au moins 3 points
|
||||
- Le nom est obligatoire
|
||||
- Au moins un membre doit être assigné
|
||||
- Les coordonnées sont au format "latitude/longitude"
|
||||
- Le dernier point doit fermer le polygone
|
||||
- Les secteurs adjacents sont automatiquement corrigés (voir section dédiée)
|
||||
|
||||
## Gestion des secteurs adjacents
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
L'application gère automatiquement la création de secteurs adjacents (partageant une bordure commune) sans générer d'erreur de chevauchement. Cette fonctionnalité est cruciale pour permettre un découpage précis du territoire.
|
||||
|
||||
### Correction automatique des points
|
||||
|
||||
#### Méthode `_correctPointsForAdjacency`
|
||||
|
||||
Cette méthode est appelée automatiquement lors de :
|
||||
- La validation d'un nouveau secteur (création)
|
||||
- La validation d'un secteur modifié (modification)
|
||||
|
||||
**Paramètres de correction :**
|
||||
- **Distance de détection** : 10 mètres
|
||||
- **Décalage de correction** : 2 mètres vers l'intérieur
|
||||
- **Décalage fort** : 5 mètres (si chevauchement persistant)
|
||||
|
||||
**Processus en deux passes :**
|
||||
|
||||
1. **Première passe - Détection et correction des segments adjacents**
|
||||
```dart
|
||||
// Pour chaque segment du nouveau secteur
|
||||
// Vérifier s'il est proche d'un segment existant
|
||||
// Si oui, corriger les deux points du segment
|
||||
```
|
||||
|
||||
2. **Deuxième passe - Vérification et correction forte**
|
||||
```dart
|
||||
// Appel à _ensureNoIntersection
|
||||
// Si chevauchement détecté → _applyStrongerCorrection
|
||||
```
|
||||
|
||||
### Calcul du décalage vers l'intérieur
|
||||
|
||||
#### Méthode `_offsetPointInward`
|
||||
|
||||
**Principe :**
|
||||
- Calcule la bissectrice des segments adjacents
|
||||
- Utilise le produit vectoriel pour déterminer la direction intérieure
|
||||
- Applique un décalage en tenant compte de la latitude
|
||||
|
||||
**Formule de conversion :**
|
||||
```dart
|
||||
offsetDegreesLat = offsetMeters / 111320.0
|
||||
offsetDegreesLng = offsetMeters / (111320.0 * cos(latitude))
|
||||
```
|
||||
|
||||
### Détection intelligente des chevauchements
|
||||
|
||||
#### Méthode `_doPolygonsOverlap`
|
||||
|
||||
**Tolérance d'adjacence** : 2 mètres
|
||||
|
||||
**Règles de détection améliorées :**
|
||||
1. **Points intérieurs** : Un point est considéré à l'intérieur seulement s'il est à plus de 2m du bord
|
||||
2. **Vertices partagés** : Les vertices à moins de 5m de distance sont considérés comme partagés et ignorés
|
||||
3. **Segments adjacents** : Deux segments alignés et proches ne sont pas considérés comme un chevauchement
|
||||
4. **Seuil de détection** : Il faut au moins 3 points intérieurs ou 3 intersections pour détecter un chevauchement réel
|
||||
5. **Exclusion du secteur en cours** : Lors de la modification, le secteur lui-même est exclu de la détection
|
||||
|
||||
#### Méthode `_areSegmentsAdjacent`
|
||||
|
||||
Détermine si deux segments sont adjacents (partagent une partie commune) :
|
||||
- Vérifie l'alignement des segments
|
||||
- Vérifie la proximité des points aux lignes opposées
|
||||
- Retourne `true` si les segments sont sur la même ligne
|
||||
|
||||
### Magnétisme automatique
|
||||
|
||||
Lors de la sélection d'un secteur pour modification :
|
||||
- Application automatique du magnétisme aux points proches
|
||||
- Visualisation immédiate des ajustements
|
||||
- Message d'information si des points ont été magnétisés
|
||||
|
||||
### Exemple de création de secteurs adjacents
|
||||
|
||||
```
|
||||
Secteur A (existant) : Nouveau secteur B :
|
||||
+--------+ +--------+
|
||||
| | | |
|
||||
| A | <-- bordure --> | B |
|
||||
| | commune | |
|
||||
+--------+ +--------+
|
||||
```
|
||||
|
||||
**Résultat après correction automatique :**
|
||||
- Les points de B sur la bordure commune sont décalés de 2m vers l'intérieur
|
||||
- Aucune erreur de chevauchement
|
||||
- Les secteurs restent visuellement adjacents
|
||||
|
||||
### Messages utilisateur
|
||||
|
||||
- **Correction appliquée** : "Les points ont été ajustés automatiquement pour éviter les chevauchements" (bleu)
|
||||
- **Chevauchement détecté** : "Le nouveau secteur chevauche avec le secteur [nom]" (rouge)
|
||||
- **Logging détaillé** : En cas de chevauchement détecté, les coordonnées des zones problématiques sont loggées
|
||||
|
||||
## Modification d'un secteur
|
||||
|
||||
### Processus de modification
|
||||
|
||||
1. **Sélection du secteur**
|
||||
- Via la combobox ou clic sur la carte
|
||||
- Bouton "Modifier" dans la barre d'outils
|
||||
|
||||
2. **Mode édition**
|
||||
- Application automatique du magnétisme dès la sélection
|
||||
- Points draggables instantanément (clic et drag immédiat)
|
||||
- Points orange avec zone de détection élargie (50x50px)
|
||||
- Ajout de points via les points intermédiaires gris
|
||||
- Suppression avec clic droit ou Ctrl+clic
|
||||
- Désactivation du drag de la carte pendant le déplacement d'un point
|
||||
|
||||
3. **Validation**
|
||||
- Mêmes vérifications que pour la création
|
||||
- Application de `_correctPointsForAdjacency` avec exclusion du secteur en cours
|
||||
- Dialog pour modifier nom, couleur et membres
|
||||
- Les membres déjà affectés sont automatiquement présélectionnés
|
||||
- Affichage d'un dialog récapitulatif avec statistiques
|
||||
|
||||
### Règles de modification
|
||||
- Minimum 3 points maintenu
|
||||
- Correction automatique des adjacences
|
||||
- Même processus de validation que la création
|
||||
- Les passages sont automatiquement réaffectés selon le nouveau contour
|
||||
|
||||
## Suppression d'un secteur
|
||||
|
||||
### Processus de suppression
|
||||
|
||||
1. **Sélection du secteur**
|
||||
- L'administrateur clique sur "Supprimer un secteur"
|
||||
- Il clique sur le secteur à supprimer (surbrillance rouge)
|
||||
|
||||
2. **Dialog de confirmation**
|
||||
- Affichage du nom du secteur
|
||||
- Avertissements sur les conséquences
|
||||
|
||||
3. **Règles de suppression des passages**
|
||||
- Passages "à finaliser" (type 2) sans nom d'habitant → **supprimés**
|
||||
- Autres passages → **conservés mais réassignés au secteur 0**
|
||||
|
||||
4. **Réponse de l'API**
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"passages_deleted": 45,
|
||||
"passages_reassigned": 125
|
||||
}
|
||||
```
|
||||
|
||||
5. **Mise à jour locale**
|
||||
- Suppression du secteur de Hive
|
||||
- Mise à jour des passages selon les règles
|
||||
- Actualisation automatique de la carte
|
||||
|
||||
## Affichage des secteurs
|
||||
|
||||
### Représentation visuelle
|
||||
- **Polygones colorés** avec transparence (30% en normal, 50% si sélectionné)
|
||||
- **Bordure** de la couleur du secteur (épaisseur 2px, 3px si sélectionné)
|
||||
- **Mode suppression** : secteur en rouge avec bordure épaisse (4px)
|
||||
|
||||
### Filtrage par secteur
|
||||
- Combobox en haut à gauche
|
||||
- "Tous les secteurs" par défaut
|
||||
- Sélection d'un secteur → zoom et centrage automatique
|
||||
- Filtrage des passages affichés
|
||||
|
||||
## Affichage des passages
|
||||
|
||||
### Représentation visuelle
|
||||
- **Marqueurs circulaires** de 14x14 pixels
|
||||
- **Couleur principale** selon le type de passage
|
||||
- **Bordure blanche** de 1px
|
||||
- **Cliquables** pour afficher les détails
|
||||
|
||||
### Conditions d'affichage
|
||||
- Coordonnées GPS valides (gps_lat et gps_lng)
|
||||
- Type de passage reconnu (1-6)
|
||||
- Appartenance au secteur sélectionné (si filtre actif)
|
||||
|
||||
### Informations au clic
|
||||
- Adresse complète
|
||||
- Nom de l'habitant (si disponible)
|
||||
- Type de passage
|
||||
- Informations de règlement (si applicable)
|
||||
- Boutons d'édition/suppression
|
||||
|
||||
## Permissions et rôles
|
||||
|
||||
### Accès à la carte administrative
|
||||
- **Rôle minimum requis** : Admin Amicale (rôle > 1)
|
||||
- **Rôle 1 (Membre)** : Pas d'accès à la carte admin
|
||||
- **Rôle 2+ (Admin)** : Accès complet aux fonctionnalités
|
||||
|
||||
### Actions autorisées
|
||||
- **Création de secteur** : Admin+
|
||||
- **Modification de secteur** : Admin+
|
||||
- **Suppression de secteur** : Admin+
|
||||
- **Visualisation** : Admin+
|
||||
|
||||
## Synchronisation API/Hive
|
||||
|
||||
### Principe "API First"
|
||||
1. Toute modification passe d'abord par l'API
|
||||
2. En cas de succès, mise à jour de Hive
|
||||
3. En cas d'échec, aucune modification locale
|
||||
|
||||
### Flux de données
|
||||
|
||||
#### Chargement initial
|
||||
```
|
||||
API (login) → Secteurs/Passages → Hive → ValueListenableBuilder → UI
|
||||
```
|
||||
|
||||
#### Création de secteur
|
||||
```
|
||||
UI → API → Réponse (secteur + passages) → Hive → Auto-refresh UI
|
||||
```
|
||||
|
||||
#### Suppression de secteur
|
||||
```
|
||||
UI → API → Réponse (stats) → Mise à jour Hive → Auto-refresh UI
|
||||
```
|
||||
|
||||
### Gestion des erreurs
|
||||
- Affichage de SnackBar avec message d'erreur
|
||||
- Pas de modification locale en cas d'échec API
|
||||
- Log des erreurs pour debug
|
||||
|
||||
### Performance
|
||||
- Utilisation de box caching dans les repositories
|
||||
- ValueListenableBuilder pour éviter les rebuilds inutiles
|
||||
- Chargement asynchrone des données
|
||||
|
||||
## Interactions utilisateur
|
||||
|
||||
### Gestion du drag des points
|
||||
|
||||
**Technologie utilisée** : `Listener` avec `onPointerDown`/`onPointerMove`/`onPointerUp`
|
||||
|
||||
**Avantages :**
|
||||
- Démarrage instantané du drag au clic (onPointerDown)
|
||||
- Pas de conflit avec les gestes de la carte
|
||||
- Conversion directe des coordonnées écran en coordonnées géographiques
|
||||
|
||||
**Interactions supportées :**
|
||||
- **Clic gauche** : Démarre le drag immédiatement
|
||||
- **Clic droit / Ctrl+clic** : Supprime le point
|
||||
- **Clic sur premier point (mode dessin)** : Ferme le polygone si 3+ points
|
||||
- **Drag** : Déplace le point avec magnétisme en temps réel
|
||||
|
||||
### Dialog récapitulatif
|
||||
|
||||
Après chaque opération (création/modification/suppression), un dialog affiche :
|
||||
- **Statistiques des passages** : créés, mis à jour, orphelins, total
|
||||
- **Avertissements départementaux** : si le secteur est à cheval sur plusieurs départements
|
||||
- **Icônes et couleurs** adaptées selon le type d'opération
|
||||
|
||||
## Bonnes pratiques
|
||||
|
||||
### Pour les développeurs
|
||||
|
||||
1. **Toujours passer par l'API** pour les modifications
|
||||
2. **Utiliser les repositories** pour l'accès aux données
|
||||
3. **Ne pas faire de setState** dans les ValueListenableBuilder
|
||||
4. **Gérer les erreurs** avec ApiException
|
||||
5. **Valider les données** avant envoi à l'API
|
||||
6. **Logger les actions importantes** pour le debug
|
||||
7. **Utiliser les mêmes méthodes de validation** pour création et modification :
|
||||
- `_correctPointsForAdjacency` pour la correction automatique
|
||||
- `_doPolygonsOverlap` pour la détection de chevauchement
|
||||
- `_isValidPolygon` pour la validation de base
|
||||
8. **Sauvegarder le contexte parent** avant d'ouvrir des dialogs pour éviter les erreurs de contexte
|
||||
9. **Implémenter le chargement des associations** (ex: UserSectorModel) pour présélectionner les données
|
||||
|
||||
### Pour les utilisateurs
|
||||
|
||||
1. **Dessiner des secteurs cohérents** (pas de croisements)
|
||||
2. **Nommer clairement** les secteurs
|
||||
3. **Assigner les bons membres** dès la création
|
||||
4. **Vérifier avant suppression** (action irréversible)
|
||||
5. **Utiliser des couleurs distinctes** pour différencier les secteurs
|
||||
6. **Pour les secteurs adjacents** :
|
||||
- Dessiner normalement sans se soucier de la précision
|
||||
- Le système ajuste automatiquement les bordures
|
||||
- Vérifier le résultat après la correction automatique
|
||||
7. **Pour la modification des secteurs** :
|
||||
- Cliquer directement sur un point pour le déplacer (pas besoin de maintenir)
|
||||
- Utiliser les points gris intermédiaires pour ajouter des sommets
|
||||
- Clic droit ou Ctrl+clic pour supprimer un point
|
||||
- Le magnétisme s'applique automatiquement aux bordures adjacentes
|
||||
0
app/docs/chat.md
Normal file → Executable file
0
app/docs/chat.md
Normal file → Executable file
63
app/docs/emails.txt
Normal file
63
app/docs/emails.txt
Normal file
@@ -0,0 +1,63 @@
|
||||
+---------+----------+------------------------------------+---------------------+
|
||||
| rowid | fk_user | email | recu |
|
||||
+---------+----------+------------------------------------+---------------------+
|
||||
| 6407027 | 10025567 | lopes.s@me.com | recu_1961122993.pdf |
|
||||
| 6407032 | 10025567 | nathmaussion@yahoo.fr | recu_1520436311.pdf |
|
||||
| 6407033 | 10025567 | gaujardr@yahoo.com | recu_880454635.pdf |
|
||||
| 6407037 | 10025567 | enzobauffe45@gmail.com | recu_1424145356.pdf |
|
||||
| 6407039 | 10025567 | marcotte.franck@orange.fr | recu_630138405.pdf |
|
||||
| 6407052 | 10025567 | philippecharpenel@sfr.fr | recu_2019480885.pdf |
|
||||
| 6407060 | 10025567 | christinelaure.perdereau@gmail.com | recu_2049718423.pdf |
|
||||
| 6407063 | 10025567 | sceamillet28@gmail.com | recu_1112859458.pdf |
|
||||
| 6407085 | 10025567 | cottin.f@orange.fr | recu_11440760.pdf |
|
||||
| 6407117 | 10025567 | mahuet.joelle@gmail.com | recu_1663442225.pdf |
|
||||
| 6407124 | 10025567 | jfamigo1@gmail.com | recu_1643799220.pdf |
|
||||
| 6407125 | 10025567 | starwear28@orange.fr | recu_765942956.pdf |
|
||||
| 6407129 | 10025567 | romain-hardy@orange.fr | recu_199374960.pdf |
|
||||
| 6407150 | 10025567 | marylinou@sfr.fr | recu_878461480.pdf |
|
||||
| 6411385 | 10025563 | nicole.seuge@wanadoo.fr | recu_1107514748.pdf |
|
||||
| 6411396 | 10025563 | earlboizardmartin@gmail.com | recu_1783157368.pdf |
|
||||
| 6411602 | 10025562 | perrin91660@gmail.com | recu_698632202.pdf |
|
||||
| 6411618 | 10025562 | patriciasicot2970@gmail.com | recu_656637288.pdf |
|
||||
| 6411622 | 10025562 | jol.larche@sfr.fr | recu_808516216.pdf |
|
||||
| 6411635 | 10025562 | ets.rjr@gmail.com | recu_701333380.pdf |
|
||||
| 6411640 | 10025562 | audebrillard1990@gmail.com | recu_559744942.pdf |
|
||||
| 6411692 | 10025562 | 95320ft@gmail.com | recu_1852650793.pdf |
|
||||
| 6412659 | 10024417 | florence.guesnet@hotmail.fr | recu_914726704.pdf |
|
||||
| 6412675 | 10024417 | sebastien.lhoste@outlook.fr | recu_1201482810.pdf |
|
||||
| 6412702 | 10024417 | vincent.salembier4@orange.fr | recu_832320715.pdf |
|
||||
| 6412726 | 10024417 | gvinchon@yahoo.fr | recu_802866587.pdf |
|
||||
| 6412769 | 10024417 | coralie.jaulneau.28098@notaires.fr | recu_273757044.pdf |
|
||||
| 6412798 | 10025564 | jcam.bigot@sfr.fr | recu_1023255181.pdf |
|
||||
| 6412801 | 10025564 | lacreative_28140@yahoo.fr | recu_557356893.pdf |
|
||||
| 6412805 | 10025564 | karine-mallet@wanadoo.fr | recu_1184138598.pdf |
|
||||
| 6412810 | 10025564 | boizard. claude@orange.fr | recu_1383142300.pdf |
|
||||
| 6412816 | 10025564 | mod.morin@orange.fr | recu_46047865.pdf |
|
||||
| 6412819 | 10025564 | mmichelefauconnier@wanadoo.fr | recu_1208420015.pdf |
|
||||
| 6412829 | 10025564 | beryle.chausson@ca-valfrance.fr | recu_409271393.pdf |
|
||||
| 6412836 | 10025564 | sevin28@orange.fr | recu_443542077.pdf |
|
||||
| 6412837 | 10025564 | mickael.chambon@wanadoo.fr | recu_1237649662.pdf |
|
||||
| 6412838 | 10025564 | a_lenormand@yahoo.fr | recu_1046435244.pdf |
|
||||
| 6412843 | 10025564 | Bastien.venot@gmail.com | recu_1633785428.pdf |
|
||||
| 6412844 | 10025564 | loicplomberiechauffage@gmail.com | recu_262412783.pdf |
|
||||
| 6412848 | 10025564 | martine.cornet@wanadoo.fr | recu_1659634096.pdf |
|
||||
| 6412855 | 10025564 | bruneaun@orange.fr | recu_1276046605.pdf |
|
||||
| 6412863 | 10025564 | ag.orgeresenbeauce@areas.fr | recu_1231444646.pdf |
|
||||
| 6412868 | 10025564 | bourdoneric@free.fr | recu_1558068939.pdf |
|
||||
| 6412886 | 10025564 | nicolas.grue@gmail.com | recu_1167986788.pdf |
|
||||
| 6412887 | 10025564 | sarl-r.e-autorestor@hotmail.com | recu_1848119107.pdf |
|
||||
| 6412889 | 10025564 | matar_rodolph@hotmail.com | recu_797145793.pdf |
|
||||
| 6412897 | 10025564 | karan05021977@gmail.com | recu_120412376.pdf |
|
||||
| 6412908 | 10025566 | Didier.grandvilain@wanadoo.fr | recu_134916009.pdf |
|
||||
| 6412938 | 10025566 | heleneferreira@laposte.net | recu_1258533295.pdf |
|
||||
| 6412945 | 10025566 | Ivan.bezpalko@gmail.com | recu_991617966.pdf |
|
||||
| 6413610 | 10025565 | sourdin.venard@neuf.fr | recu_561743640.pdf |
|
||||
| 6413617 | 10025565 | kareenloury@gmail.com | recu_1475235721.pdf |
|
||||
| 6413656 | 10025565 | solinephilippe@orange.fr | recu_552733221.pdf |
|
||||
| 6413658 | 10025565 | reine.grandvillain@sfr.fr | recu_1778509072.pdf |
|
||||
| 6413672 | 10025565 | elenyegmrd@gmail.com | recu_434333603.pdf |
|
||||
| 6413675 | 10025565 | cindygoulhot91@gmail.com | recu_1897258430.pdf |
|
||||
| 7881311 | 10025564 | c.goix@ersmaine.fayat.com | recu_1335145719.pdf |
|
||||
| 7887546 | 10025564 | floaxe.environnement@orange.fr | recu_1008869336.pdf |
|
||||
| 7887551 | 10025564 | comptabilite@negobeauce.fr | recu_475418350.pdf |
|
||||
+---------+----------+------------------------------------+---------------------+
|
||||
602
app/docs/geo_app.sql
Executable file
602
app/docs/geo_app.sql
Executable file
@@ -0,0 +1,602 @@
|
||||
-- -------------------------------------------------------------
|
||||
-- TablePlus 6.4.8(608)
|
||||
--
|
||||
-- https://tableplus.com/
|
||||
--
|
||||
-- Database: geo_app
|
||||
-- Generation Time: 2025-06-09 18:03:43.5140
|
||||
-- -------------------------------------------------------------
|
||||
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8mb4 */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
|
||||
|
||||
CREATE TABLE `chat_anonymous_users` (
|
||||
`id` varchar(50) NOT NULL,
|
||||
`device_id` varchar(100) NOT NULL,
|
||||
`name` varchar(100) DEFAULT NULL,
|
||||
`email` varchar(100) DEFAULT NULL,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`converted_to_user_id` int(10) unsigned DEFAULT NULL,
|
||||
`metadata` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`metadata`)),
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_device_id` (`device_id`),
|
||||
KEY `idx_converted_user` (`converted_to_user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_attachments` (
|
||||
`id` varchar(50) NOT NULL,
|
||||
`fk_message` varchar(50) NOT NULL,
|
||||
`file_name` varchar(255) NOT NULL,
|
||||
`file_path` varchar(500) NOT NULL,
|
||||
`file_type` varchar(100) NOT NULL,
|
||||
`file_size` int(10) unsigned NOT NULL,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_message` (`fk_message`),
|
||||
CONSTRAINT `fk_chat_attachments_message` FOREIGN KEY (`fk_message`) REFERENCES `chat_messages` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_audience_targets` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_room` varchar(50) NOT NULL,
|
||||
`target_type` enum('role','entity','all','combined') NOT NULL DEFAULT 'all',
|
||||
`target_id` varchar(50) DEFAULT NULL,
|
||||
`role_filter` varchar(20) DEFAULT NULL,
|
||||
`entity_filter` varchar(50) DEFAULT NULL,
|
||||
`date_creation` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_room` (`fk_room`),
|
||||
KEY `idx_type` (`target_type`),
|
||||
CONSTRAINT `fk_chat_audience_targets_room` FOREIGN KEY (`fk_room`) REFERENCES `chat_rooms` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_broadcast_lists` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_room` varchar(50) NOT NULL,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`description` text DEFAULT NULL,
|
||||
`fk_user_creator` int(10) unsigned NOT NULL,
|
||||
`date_creation` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_room` (`fk_room`),
|
||||
KEY `idx_user_creator` (`fk_user_creator`),
|
||||
CONSTRAINT `fk_chat_broadcast_lists_room` FOREIGN KEY (`fk_room`) REFERENCES `chat_rooms` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
|
||||
|
||||
CREATE TABLE `chat_messages` (
|
||||
`id` varchar(50) NOT NULL,
|
||||
`fk_room` varchar(50) NOT NULL,
|
||||
`fk_user` int(10) unsigned DEFAULT NULL,
|
||||
`sender_type` enum('user','anonymous','system') NOT NULL DEFAULT 'user',
|
||||
`content` text DEFAULT NULL,
|
||||
`content_type` enum('text','image','file') NOT NULL DEFAULT 'text',
|
||||
`date_sent` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`date_delivered` timestamp NULL DEFAULT NULL,
|
||||
`date_read` timestamp NULL DEFAULT NULL,
|
||||
`statut` enum('envoye','livre','lu','error') NOT NULL DEFAULT 'envoye',
|
||||
`is_announcement` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_room` (`fk_room`),
|
||||
KEY `idx_user` (`fk_user`),
|
||||
KEY `idx_date` (`date_sent`),
|
||||
KEY `idx_status` (`statut`),
|
||||
KEY `idx_messages_unread` (`fk_room`,`statut`),
|
||||
CONSTRAINT `fk_chat_messages_room` FOREIGN KEY (`fk_room`) REFERENCES `chat_rooms` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_notifications` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_user` int(10) unsigned NOT NULL,
|
||||
`fk_message` varchar(50) DEFAULT NULL,
|
||||
`fk_room` varchar(50) DEFAULT NULL,
|
||||
`type` varchar(50) NOT NULL,
|
||||
`contenu` text DEFAULT NULL,
|
||||
`date_creation` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`date_lecture` timestamp NULL DEFAULT NULL,
|
||||
`statut` enum('non_lue','lue') NOT NULL DEFAULT 'non_lue',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user` (`fk_user`),
|
||||
KEY `idx_message` (`fk_message`),
|
||||
KEY `idx_room` (`fk_room`),
|
||||
KEY `idx_statut` (`statut`),
|
||||
KEY `idx_notifications_unread` (`fk_user`,`statut`),
|
||||
CONSTRAINT `fk_chat_notifications_message` FOREIGN KEY (`fk_message`) REFERENCES `chat_messages` (`id`) ON DELETE SET NULL,
|
||||
CONSTRAINT `fk_chat_notifications_room` FOREIGN KEY (`fk_room`) REFERENCES `chat_rooms` (`id`) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_offline_queue` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(10) unsigned NOT NULL,
|
||||
`operation_type` varchar(50) NOT NULL,
|
||||
`operation_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`operation_data`)),
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`processed_at` timestamp NULL DEFAULT NULL,
|
||||
`status` enum('pending','processing','completed','failed') NOT NULL DEFAULT 'pending',
|
||||
`error_message` text DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_created_at` (`created_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_participants` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`id_room` varchar(50) NOT NULL,
|
||||
`id_user` int(10) unsigned DEFAULT NULL,
|
||||
`anonymous_id` varchar(50) DEFAULT NULL,
|
||||
`role` enum('administrateur','participant','en_lecture_seule') NOT NULL DEFAULT 'participant',
|
||||
`date_ajout` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`notification_activee` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
`last_read_message_id` varchar(50) DEFAULT NULL,
|
||||
`via_target` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`can_reply` tinyint(1) unsigned DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uc_room_user` (`id_room`,`id_user`),
|
||||
KEY `idx_room` (`id_room`),
|
||||
KEY `idx_user` (`id_user`),
|
||||
KEY `idx_anonymous_id` (`anonymous_id`),
|
||||
KEY `idx_participants_active` (`id_room`,`id_user`,`notification_activee`),
|
||||
CONSTRAINT `fk_chat_participants_room` FOREIGN KEY (`id_room`) REFERENCES `chat_rooms` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_read_messages` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_message` varchar(50) NOT NULL,
|
||||
`fk_user` int(10) unsigned NOT NULL,
|
||||
`date_read` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uc_message_user` (`fk_message`,`fk_user`),
|
||||
KEY `idx_message` (`fk_message`),
|
||||
KEY `idx_user` (`fk_user`),
|
||||
CONSTRAINT `fk_chat_read_messages_message` FOREIGN KEY (`fk_message`) REFERENCES `chat_messages` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `chat_rooms` (
|
||||
`id` varchar(50) NOT NULL,
|
||||
`type` enum('privee','groupe','liste_diffusion','broadcast','announcement') NOT NULL,
|
||||
`title` varchar(100) DEFAULT NULL,
|
||||
`date_creation` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`fk_user` int(10) unsigned NOT NULL,
|
||||
`fk_entite` int(10) unsigned DEFAULT NULL,
|
||||
`statut` enum('active','archive') NOT NULL DEFAULT 'active',
|
||||
`description` text DEFAULT NULL,
|
||||
`reply_permission` enum('all','admins_only','sender_only','none') NOT NULL DEFAULT 'all',
|
||||
`is_pinned` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`expiry_date` timestamp NULL DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user` (`fk_user`),
|
||||
KEY `idx_entite` (`fk_entite`),
|
||||
KEY `idx_type` (`type`),
|
||||
KEY `idx_statut` (`statut`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `email_counter` (
|
||||
`id` int(10) unsigned NOT NULL DEFAULT 1,
|
||||
`hour_start` timestamp NULL DEFAULT NULL,
|
||||
`count` int(10) unsigned DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `email_queue` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_pass` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`to_email` varchar(255) DEFAULT NULL,
|
||||
`subject` varchar(255) DEFAULT NULL,
|
||||
`body` text DEFAULT NULL,
|
||||
`headers` text DEFAULT NULL,
|
||||
`created_at` timestamp NULL DEFAULT current_timestamp(),
|
||||
`status` enum('pending','sent','failed') DEFAULT 'pending',
|
||||
`attempts` int(10) unsigned DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `entites` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`encrypted_name` varchar(255) DEFAULT NULL,
|
||||
`adresse1` varchar(45) DEFAULT '',
|
||||
`adresse2` varchar(45) DEFAULT '',
|
||||
`code_postal` varchar(5) DEFAULT '',
|
||||
`ville` varchar(45) DEFAULT '',
|
||||
`fk_region` int(10) unsigned DEFAULT NULL,
|
||||
`fk_type` int(10) unsigned DEFAULT 1,
|
||||
`encrypted_phone` varchar(128) DEFAULT '',
|
||||
`encrypted_mobile` varchar(128) DEFAULT '',
|
||||
`encrypted_email` varchar(255) DEFAULT '',
|
||||
`gps_lat` varchar(20) NOT NULL DEFAULT '',
|
||||
`gps_lng` varchar(20) NOT NULL DEFAULT '',
|
||||
`chk_stripe` tinyint(1) unsigned DEFAULT 0,
|
||||
`encrypted_stripe_id` varchar(255) DEFAULT '',
|
||||
`encrypted_iban` varchar(255) DEFAULT '',
|
||||
`encrypted_bic` varchar(128) DEFAULT '',
|
||||
`chk_demo` tinyint(1) unsigned DEFAULT 1,
|
||||
`chk_mdp_manuel` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT 'Gestion des mots de passe manuelle O/N',
|
||||
`chk_copie_mail_recu` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`chk_accept_sms` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `entites_ibfk_1` (`fk_region`),
|
||||
KEY `entites_ibfk_2` (`fk_type`),
|
||||
CONSTRAINT `entites_ibfk_1` FOREIGN KEY (`fk_region`) REFERENCES `x_regions` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `entites_ibfk_2` FOREIGN KEY (`fk_type`) REFERENCES `x_entites_types` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=1230 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `medias` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`support` varchar(45) NOT NULL DEFAULT '' COMMENT 'Type de support (entite, user, operation, passage)',
|
||||
`support_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'ID de élément associé',
|
||||
`fichier` varchar(250) NOT NULL DEFAULT '' COMMENT 'Nom du fichier stocké',
|
||||
`file_type` varchar(50) DEFAULT NULL COMMENT 'Extension du fichier (pdf, jpg, xlsx, etc.)',
|
||||
`file_category` varchar(50) DEFAULT NULL COMMENT 'export, logo, carte, etc.',
|
||||
`file_size` int(10) unsigned DEFAULT NULL COMMENT 'Taille du fichier en octets',
|
||||
`mime_type` varchar(100) DEFAULT NULL COMMENT 'Type MIME du fichier',
|
||||
`original_name` varchar(255) DEFAULT NULL COMMENT 'Nom original du fichier uploadé',
|
||||
`fk_entite` int(10) unsigned DEFAULT NULL COMMENT 'ID de entité propriétaire',
|
||||
`fk_operation` int(10) unsigned DEFAULT NULL COMMENT 'ID de opération (pour passages)',
|
||||
`file_path` varchar(500) DEFAULT NULL COMMENT 'Chemin complet du fichier',
|
||||
`original_width` int(10) unsigned DEFAULT NULL COMMENT 'Largeur originale de image',
|
||||
`original_height` int(10) unsigned DEFAULT NULL COMMENT 'Hauteur originale de image',
|
||||
`processed_width` int(10) unsigned DEFAULT NULL COMMENT 'Largeur après traitement',
|
||||
`processed_height` int(10) unsigned DEFAULT NULL COMMENT 'Hauteur après traitement',
|
||||
`is_processed` tinyint(1) unsigned DEFAULT 0 COMMENT 'Image redimensionnée (1) ou originale (0)',
|
||||
`description` varchar(100) NOT NULL DEFAULT '' COMMENT 'Description du fichier',
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`fk_user_creat` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp(),
|
||||
`fk_user_modif` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
KEY `idx_entite` (`fk_entite`),
|
||||
KEY `idx_operation` (`fk_operation`),
|
||||
KEY `idx_support_type` (`support`, `support_id`),
|
||||
KEY `idx_file_type` (`file_type`),
|
||||
KEY `idx_file_category` (`file_category`),
|
||||
CONSTRAINT `fk_medias_entite` FOREIGN KEY (`fk_entite`) REFERENCES `entites` (`id`) ON UPDATE CASCADE ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_medias_operation` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE `ope_pass` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_sector` int(10) unsigned DEFAULT 0,
|
||||
`fk_user` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_adresse` varchar(25) DEFAULT '' COMMENT 'adresses.cp??.id',
|
||||
`passed_at` timestamp NULL DEFAULT NULL COMMENT 'Date du passage',
|
||||
`fk_type` int(10) unsigned DEFAULT 0,
|
||||
`numero` varchar(10) NOT NULL DEFAULT '',
|
||||
`rue` varchar(75) NOT NULL DEFAULT '',
|
||||
`rue_bis` varchar(1) NOT NULL DEFAULT '',
|
||||
`ville` varchar(75) NOT NULL DEFAULT '',
|
||||
`fk_habitat` int(10) unsigned DEFAULT 1,
|
||||
`appt` varchar(5) DEFAULT '',
|
||||
`niveau` varchar(5) DEFAULT '',
|
||||
`residence` varchar(75) DEFAULT '',
|
||||
`gps_lat` varchar(20) NOT NULL DEFAULT '',
|
||||
`gps_lng` varchar(20) NOT NULL DEFAULT '',
|
||||
`encrypted_name` varchar(255) NOT NULL DEFAULT '',
|
||||
`montant` decimal(7,2) NOT NULL DEFAULT 0.00,
|
||||
`fk_type_reglement` int(10) unsigned DEFAULT 1,
|
||||
`remarque` text DEFAULT '',
|
||||
`encrypted_email` varchar(255) DEFAULT '',
|
||||
`nom_recu` varchar(50) DEFAULT NULL,
|
||||
`date_recu` timestamp NULL DEFAULT NULL COMMENT 'Date de réception',
|
||||
`date_creat_recu` timestamp NULL DEFAULT NULL COMMENT 'Date de création du reçu',
|
||||
`date_sent_recu` timestamp NULL DEFAULT NULL COMMENT 'Date envoi du reçu',
|
||||
`email_erreur` varchar(30) DEFAULT '',
|
||||
`chk_email_sent` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`encrypted_phone` varchar(128) NOT NULL DEFAULT '',
|
||||
`is_striped` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`docremis` tinyint(1) unsigned DEFAULT 0,
|
||||
`date_repasser` timestamp NULL DEFAULT NULL COMMENT 'Date prévue pour repasser',
|
||||
`nb_passages` int(11) DEFAULT 1 COMMENT 'Nb passages pour les a repasser',
|
||||
`chk_gps_maj` tinyint(1) unsigned DEFAULT 0,
|
||||
`chk_map_create` tinyint(1) unsigned DEFAULT 0,
|
||||
`chk_mobile` tinyint(1) unsigned DEFAULT 0,
|
||||
`chk_synchro` tinyint(1) unsigned DEFAULT 1 COMMENT 'chk synchro entre web et appli',
|
||||
`chk_api_adresse` tinyint(1) unsigned DEFAULT 0,
|
||||
`chk_maj_adresse` tinyint(1) unsigned DEFAULT 0,
|
||||
`anomalie` tinyint(1) unsigned DEFAULT 0,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fk_operation` (`fk_operation`),
|
||||
KEY `fk_sector` (`fk_sector`),
|
||||
KEY `fk_user` (`fk_user`),
|
||||
KEY `fk_type` (`fk_type`),
|
||||
KEY `fk_type_reglement` (`fk_type_reglement`),
|
||||
KEY `email` (`encrypted_email`),
|
||||
CONSTRAINT `ope_pass_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_pass_ibfk_2` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_pass_ibfk_3` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_pass_ibfk_4` FOREIGN KEY (`fk_type_reglement`) REFERENCES `x_types_reglements` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=19499566 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `ope_pass_histo` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_pass` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`date_histo` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date historique',
|
||||
`sujet` varchar(50) DEFAULT NULL,
|
||||
`remarque` varchar(250) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `ope_pass_histo_fk_pass_IDX` (`fk_pass`) USING BTREE,
|
||||
KEY `ope_pass_histo_date_histo_IDX` (`date_histo`) USING BTREE,
|
||||
CONSTRAINT `ope_pass_histo_ibfk_1` FOREIGN KEY (`fk_pass`) REFERENCES `ope_pass` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=6752 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `ope_sectors` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_old_sector` int(10) unsigned DEFAULT NULL,
|
||||
`libelle` varchar(75) NOT NULL DEFAULT '',
|
||||
`sector` text NOT NULL DEFAULT '',
|
||||
`color` varchar(7) NOT NULL DEFAULT '#4B77BE',
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id` (`id`),
|
||||
KEY `fk_operation` (`fk_operation`),
|
||||
CONSTRAINT `ope_sectors_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=27675 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `ope_users` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_user` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
KEY `ope_users_ibfk_1` (`fk_operation`),
|
||||
KEY `ope_users_ibfk_2` (`fk_user`),
|
||||
CONSTRAINT `ope_users_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_users_ibfk_2` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=199006 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `ope_users_sectors` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_user` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_sector` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id` (`id`),
|
||||
KEY `fk_operation` (`fk_operation`),
|
||||
KEY `fk_user` (`fk_user`),
|
||||
KEY `fk_sector` (`fk_sector`),
|
||||
CONSTRAINT `ope_users_sectors_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_users_sectors_ibfk_2` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_users_sectors_ibfk_3` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=48082 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `operations` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_entite` int(10) unsigned NOT NULL DEFAULT 1,
|
||||
`libelle` varchar(75) NOT NULL DEFAULT '',
|
||||
`date_deb` date NOT NULL DEFAULT '0000-00-00',
|
||||
`date_fin` date NOT NULL DEFAULT '0000-00-00',
|
||||
`chk_distinct_sectors` tinyint(1) unsigned NOT NULL DEFAULT 0,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fk_entite` (`fk_entite`),
|
||||
KEY `date_deb` (`date_deb`),
|
||||
CONSTRAINT `operations_ibfk_1` FOREIGN KEY (`fk_entite`) REFERENCES `entites` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3121 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `params` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(35) NOT NULL DEFAULT '',
|
||||
`valeur` varchar(255) NOT NULL DEFAULT '',
|
||||
`aide` varchar(150) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `sectors_adresses` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_adresse` varchar(25) DEFAULT NULL COMMENT 'adresses.cp??.id',
|
||||
`osm_id` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`fk_sector` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`osm_name` varchar(50) NOT NULL DEFAULT '',
|
||||
`numero` varchar(5) NOT NULL DEFAULT '',
|
||||
`rue_bis` varchar(5) NOT NULL DEFAULT '',
|
||||
`rue` varchar(60) NOT NULL DEFAULT '',
|
||||
`cp` varchar(5) NOT NULL DEFAULT '',
|
||||
`ville` varchar(60) NOT NULL DEFAULT '',
|
||||
`gps_lat` varchar(20) NOT NULL DEFAULT '',
|
||||
`gps_lng` varchar(20) NOT NULL DEFAULT '',
|
||||
`osm_date_creat` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `sectors_adresses_fk_sector_index` (`fk_sector`),
|
||||
KEY `sectors_adresses_numero_index` (`numero`),
|
||||
KEY `sectors_adresses_rue_index` (`rue`),
|
||||
KEY `sectors_adresses_ville_index` (`ville`),
|
||||
CONSTRAINT `sectors_adresses_ibfk_1` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=1562946 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `users` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_entite` int(10) unsigned DEFAULT 1,
|
||||
`fk_role` int(10) unsigned DEFAULT 1,
|
||||
`fk_titre` int(10) unsigned DEFAULT 1,
|
||||
`encrypted_name` varchar(255) DEFAULT NULL,
|
||||
`first_name` varchar(45) DEFAULT NULL,
|
||||
`sect_name` varchar(60) DEFAULT '',
|
||||
`encrypted_user_name` varchar(128) DEFAULT '',
|
||||
`user_pass_hash` varchar(60) DEFAULT NULL,
|
||||
`encrypted_phone` varchar(128) DEFAULT NULL,
|
||||
`encrypted_mobile` varchar(128) DEFAULT NULL,
|
||||
`encrypted_email` varchar(255) DEFAULT '',
|
||||
`chk_alert_email` tinyint(1) unsigned DEFAULT 1,
|
||||
`chk_suivi` tinyint(1) unsigned DEFAULT 0,
|
||||
`date_naissance` date DEFAULT NULL,
|
||||
`date_embauche` date DEFAULT NULL,
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Date de création',
|
||||
`fk_user_creat` int(10) unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT 'Date de modification',
|
||||
`fk_user_modif` int(10) unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fk_entite` (`fk_entite`),
|
||||
KEY `username` (`encrypted_user_name`),
|
||||
KEY `users_ibfk_2` (`fk_role`),
|
||||
KEY `users_ibfk_3` (`fk_titre`),
|
||||
CONSTRAINT `users_ibfk_1` FOREIGN KEY (`fk_entite`) REFERENCES `entites` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `users_ibfk_2` FOREIGN KEY (`fk_role`) REFERENCES `x_users_roles` (`id`) ON UPDATE CASCADE,
|
||||
CONSTRAINT `users_ibfk_3` FOREIGN KEY (`fk_titre`) REFERENCES `x_users_titres` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10027748 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_departements` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(3) DEFAULT NULL,
|
||||
`fk_region` int(10) unsigned DEFAULT 1,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
KEY `x_departements_ibfk_1` (`fk_region`),
|
||||
CONSTRAINT `x_departements_ibfk_1` FOREIGN KEY (`fk_region`) REFERENCES `x_regions` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_devises` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(3) DEFAULT NULL,
|
||||
`symbole` varchar(6) DEFAULT NULL,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_entites_types` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_pays` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(3) DEFAULT NULL,
|
||||
`fk_continent` int(10) unsigned DEFAULT NULL,
|
||||
`fk_devise` int(10) unsigned DEFAULT 1,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
KEY `x_pays_ibfk_1` (`fk_devise`),
|
||||
CONSTRAINT `x_pays_ibfk_1` FOREIGN KEY (`fk_devise`) REFERENCES `x_devises` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Table des pays avec leurs codes' `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_regions` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_pays` int(10) unsigned DEFAULT 1,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`libelle_long` varchar(45) DEFAULT NULL,
|
||||
`table_osm` varchar(45) DEFAULT NULL,
|
||||
`departements` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
KEY `x_regions_ibfk_1` (`fk_pays`),
|
||||
CONSTRAINT `x_regions_ibfk_1` FOREIGN KEY (`fk_pays`) REFERENCES `x_pays` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_types_passages` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(10) DEFAULT NULL,
|
||||
`color_button` varchar(15) DEFAULT NULL,
|
||||
`color_mark` varchar(15) DEFAULT NULL,
|
||||
`color_table` varchar(15) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_types_reglements` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_users_roles` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Les différents rôles des utilisateurs' `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_users_titres` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Les différents titres des utilisateurs' `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `x_villes` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_departement` int(10) unsigned DEFAULT 1,
|
||||
`libelle` varchar(65) DEFAULT NULL,
|
||||
`code_postal` varchar(5) DEFAULT NULL,
|
||||
`code_insee` varchar(5) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT 1,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
KEY `x_villes_ibfk_1` (`fk_departement`),
|
||||
CONSTRAINT `x_villes_ibfk_1` FOREIGN KEY (`fk_departement`) REFERENCES `x_departements` (`id`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=38950 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE TABLE `z_sessions` (
|
||||
`sid` text NOT NULL,
|
||||
`fk_user` int(11) NOT NULL,
|
||||
`role` varchar(10) DEFAULT NULL,
|
||||
`date_modified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||
`ip` varchar(50) NOT NULL,
|
||||
`browser` varchar(150) NOT NULL,
|
||||
`data` mediumtext DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci `PAGE_COMPRESSED`='ON';
|
||||
|
||||
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `chat_conversations_unread` AS select `r`.`id` AS `id`,`r`.`type` AS `type`,`r`.`title` AS `title`,`r`.`date_creation` AS `date_creation`,`r`.`fk_user` AS `fk_user`,`r`.`fk_entite` AS `fk_entite`,`r`.`statut` AS `statut`,`r`.`description` AS `description`,`r`.`reply_permission` AS `reply_permission`,`r`.`is_pinned` AS `is_pinned`,`r`.`expiry_date` AS `expiry_date`,`r`.`updated_at` AS `updated_at`,count(distinct `m`.`id`) AS `total_messages`,count(distinct `rm`.`id`) AS `read_messages`,count(distinct `m`.`id`) - count(distinct `rm`.`id`) AS `unread_messages`,(select `geo_app`.`chat_messages`.`date_sent` from `chat_messages` where `geo_app`.`chat_messages`.`fk_room` = `r`.`id` order by `geo_app`.`chat_messages`.`date_sent` desc limit 1) AS `last_message_date` from ((`chat_rooms` `r` left join `chat_messages` `m` on(`r`.`id` = `m`.`fk_room`)) left join `chat_read_messages` `rm` on(`m`.`id` = `rm`.`fk_message`)) group by `r`.`id`;
|
||||
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
Reference in New Issue
Block a user