Ajout du dossier api avec la géolocalisation automatique des casernes de pompiers
This commit is contained in:
11
api/docs/CDC.md
Normal file
11
api/docs/CDC.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Présentation du projet
|
||||
|
||||
Créer un projet d'une API très simple en PHP 8.3 pur sans framework, qui servira en backend d'interface (PDO) avec une base de données MariaDB 10.11 déjà existante. L'API RESTFUL doit recevoir des requêtes de 3 URL différentes.
|
||||
|
||||
Ce projet doit permettre de créer une structure réplicable pour être utilisée sur d'autres projets avec des frontends différents (Flutter, Svelte, Javascript Vanilla, ...).
|
||||
|
||||
## TODO :
|
||||
|
||||
- sur le serveur de DEV : créer le conf NGINX et l'url api.d6soft.com
|
||||
- mettre à jour la config et database
|
||||
- gérer le login et l'inscription sans mot de passe.
|
||||
612
api/docs/README-D6MON.md
Normal file
612
api/docs/README-D6MON.md
Normal file
@@ -0,0 +1,612 @@
|
||||
# API D6MON - Documentation
|
||||
|
||||
## Introduction
|
||||
|
||||
L'API D6MON est une interface RESTful permettant d'interagir avec l'application D6MON. Cette API gère l'authentification des utilisateurs, la gestion des profils utilisateurs et la gestion des entités.
|
||||
|
||||
## Configuration
|
||||
|
||||
### Base URL
|
||||
|
||||
```
|
||||
https://app.d6mon.com/api/mon
|
||||
```
|
||||
|
||||
### En-têtes requis
|
||||
|
||||
Pour toutes les requêtes à l'API, les en-têtes suivants sont requis :
|
||||
|
||||
```
|
||||
Content-Type: application/json
|
||||
X-App-Identifier: app.d6mon.com
|
||||
X-Client-Type: mobile
|
||||
```
|
||||
|
||||
Pour les endpoints protégés (nécessitant une authentification), ajoutez également :
|
||||
|
||||
```
|
||||
Authorization: Bearer {token}
|
||||
```
|
||||
|
||||
Où `{token}` est le jeton d'authentification obtenu lors de la connexion.
|
||||
|
||||
## Authentification
|
||||
|
||||
### Connexion
|
||||
|
||||
**Endpoint :** `POST /login`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "utilisateur@exemple.com",
|
||||
"password": "motdepasse"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"token": "session_token_here",
|
||||
"user": {
|
||||
"id": 123,
|
||||
"email": "utilisateur@exemple.com",
|
||||
"last_name": "Nom",
|
||||
"first_name": "Prénom",
|
||||
"display_name": "Nom d'affichage",
|
||||
"entity_id": 456
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Inscription
|
||||
|
||||
**Endpoint :** `POST /register`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"display_name": "Nom d'affichage",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"entity_id": 456
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Inscription réussie. Un email contenant vos identifiants vous a été envoyé.",
|
||||
"data": {
|
||||
"user": {
|
||||
"id": 123,
|
||||
"email": "utilisateur@exemple.com",
|
||||
"display_name": "Nom d'affichage"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Mot de passe oublié
|
||||
|
||||
**Endpoint :** `POST /lost-password`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"email": "utilisateur@exemple.com"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Un nouveau mot de passe a été envoyé à votre adresse email."
|
||||
}
|
||||
```
|
||||
|
||||
### Déconnexion
|
||||
|
||||
**Endpoint :** `POST /logout`
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Déconnecté avec succès"
|
||||
}
|
||||
```
|
||||
|
||||
## Gestion des utilisateurs
|
||||
|
||||
### Récupérer le profil de l'utilisateur connecté
|
||||
|
||||
**Endpoint :** `GET /user/profile`
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": 123,
|
||||
"entity_id": 456,
|
||||
"display_name": "Nom d'affichage",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"avatar": "url_avatar",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"phone": "+33612345678",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"seat_name": "Siège",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"connected_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true,
|
||||
"entity": {
|
||||
"id": 456,
|
||||
"name": "Nom de l'entité",
|
||||
"email": "entite@exemple.com",
|
||||
"phone": "+33123456789",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Mettre à jour le profil de l'utilisateur connecté
|
||||
|
||||
**Endpoint :** `PUT /user/profile`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"display_name": "Nouveau nom d'affichage",
|
||||
"first_name": "Nouveau prénom",
|
||||
"last_name": "Nouveau nom",
|
||||
"phone": "+33612345678",
|
||||
"address1": "Nouvelle adresse ligne 1",
|
||||
"address2": "Nouvelle adresse ligne 2",
|
||||
"code_postal": "75001",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"seat_name": "Nouveau siège"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
Même format que `GET /user/profile` avec les données mises à jour.
|
||||
|
||||
### Changer le mot de passe
|
||||
|
||||
**Endpoint :** `POST /user/change-password`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"current_password": "ancien_mot_de_passe",
|
||||
"new_password": "nouveau_mot_de_passe"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Mot de passe changé avec succès"
|
||||
}
|
||||
```
|
||||
|
||||
### Récupérer un utilisateur par ID
|
||||
|
||||
**Endpoint :** `GET /user/{id}`
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": 123,
|
||||
"entity_id": 456,
|
||||
"display_name": "Nom d'affichage",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"avatar": "url_avatar",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"phone": "+33612345678",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"seat_name": "Siège",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"connected_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Récupérer la liste des utilisateurs
|
||||
|
||||
**Endpoint :** `GET /users`
|
||||
|
||||
**Paramètres de requête :**
|
||||
|
||||
- `page` (optionnel) : Numéro de page (défaut : 1)
|
||||
- `limit` (optionnel) : Nombre d'éléments par page (défaut : 20)
|
||||
- `entity_id` (optionnel) : Filtrer par ID d'entité
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"users": [
|
||||
{
|
||||
"id": 123,
|
||||
"entity_id": 456,
|
||||
"display_name": "Nom d'affichage",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"avatar": "url_avatar",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"address1": "Adresse ligne 1",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"connected_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"total": 100,
|
||||
"page": 1,
|
||||
"limit": 20,
|
||||
"pages": 5
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Créer un nouvel utilisateur
|
||||
|
||||
**Endpoint :** `POST /user`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"display_name": "Nom d'affichage",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"entity_id": 456,
|
||||
"phone": "+33612345678",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"seat_name": "Siège"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Utilisateur créé avec succès. Un email avec les identifiants a été envoyé.",
|
||||
"data": {
|
||||
"id": 123,
|
||||
"display_name": "Nom d'affichage",
|
||||
"email": "utilisateur@exemple.com"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Désactiver un utilisateur
|
||||
|
||||
**Endpoint :** `DELETE /user/{id}`
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Utilisateur désactivé avec succès"
|
||||
}
|
||||
```
|
||||
|
||||
## Gestion des entités
|
||||
|
||||
### Récupérer toutes les entités
|
||||
|
||||
**Endpoint :** `GET /entities`
|
||||
|
||||
**Paramètres de requête :**
|
||||
|
||||
- `page` (optionnel) : Numéro de page (défaut : 1)
|
||||
- `limit` (optionnel) : Nombre d'éléments par page (défaut : 20)
|
||||
- `search` (optionnel) : Terme de recherche
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"entities": [
|
||||
{
|
||||
"id": 456,
|
||||
"name": "Nom de l'entité",
|
||||
"email": "entite@exemple.com",
|
||||
"phone": "+33123456789",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"total": 50,
|
||||
"page": 1,
|
||||
"limit": 20,
|
||||
"pages": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Récupérer une entité par ID
|
||||
|
||||
**Endpoint :** `GET /entity/{id}`
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": 456,
|
||||
"name": "Nom de l'entité",
|
||||
"email": "entite@exemple.com",
|
||||
"phone": "+33123456789",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true,
|
||||
"users": [
|
||||
{
|
||||
"id": 123,
|
||||
"display_name": "Nom d'affichage",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"avatar": "url_avatar",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Créer une nouvelle entité
|
||||
|
||||
**Endpoint :** `POST /entity`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Nom de l'entité",
|
||||
"email": "entite@exemple.com",
|
||||
"phone": "+33123456789",
|
||||
"address1": "Adresse ligne 1",
|
||||
"address2": "Adresse ligne 2",
|
||||
"code_postal": "75000",
|
||||
"city": "Paris",
|
||||
"country": "France"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Entité créée avec succès",
|
||||
"data": {
|
||||
"id": 456,
|
||||
"name": "Nom de l'entité"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Mettre à jour une entité
|
||||
|
||||
**Endpoint :** `PUT /entity/{id}`
|
||||
|
||||
**Corps de la requête :**
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Nouveau nom de l'entité",
|
||||
"email": "nouvelle-entite@exemple.com",
|
||||
"phone": "+33987654321",
|
||||
"address1": "Nouvelle adresse ligne 1",
|
||||
"address2": "Nouvelle adresse ligne 2",
|
||||
"code_postal": "75001",
|
||||
"city": "Paris",
|
||||
"country": "France"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
Même format que `GET /entity/{id}` avec les données mises à jour.
|
||||
|
||||
### Désactiver une entité
|
||||
|
||||
**Endpoint :** `DELETE /entity/{id}`
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Entité désactivée avec succès"
|
||||
}
|
||||
```
|
||||
|
||||
### Récupérer les utilisateurs d'une entité
|
||||
|
||||
**Endpoint :** `GET /entity/{id}/users`
|
||||
|
||||
**Paramètres de requête :**
|
||||
|
||||
- `page` (optionnel) : Numéro de page (défaut : 1)
|
||||
- `limit` (optionnel) : Nombre d'éléments par page (défaut : 20)
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"users": [
|
||||
{
|
||||
"id": 123,
|
||||
"display_name": "Nom d'affichage",
|
||||
"first_name": "Prénom",
|
||||
"last_name": "Nom",
|
||||
"avatar": "url_avatar",
|
||||
"email": "utilisateur@exemple.com",
|
||||
"phone": "+33612345678",
|
||||
"created_at": "2023-01-01T00:00:00Z",
|
||||
"updated_at": "2023-01-01T00:00:00Z",
|
||||
"connected_at": "2023-01-01T00:00:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"total": 25,
|
||||
"page": 1,
|
||||
"limit": 20,
|
||||
"pages": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Structure des données
|
||||
|
||||
### Table `users`
|
||||
|
||||
```sql
|
||||
CREATE TABLE users (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
entity_id INT,
|
||||
display_name VARCHAR(100) NOT NULL,
|
||||
first_name VARCHAR(100),
|
||||
encrypted_last_name VARCHAR(512),
|
||||
avatar VARCHAR(255),
|
||||
encrypted_email VARCHAR(512),
|
||||
encrypted_phone VARCHAR(255),
|
||||
address1 VARCHAR(255),
|
||||
address2 VARCHAR(255),
|
||||
code_postal VARCHAR(20),
|
||||
city VARCHAR(100),
|
||||
country VARCHAR(100),
|
||||
seat_name VARCHAR(20),
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
connected_at DATETIME,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
FOREIGN KEY (entity_id) REFERENCES entities(id)
|
||||
);
|
||||
```
|
||||
|
||||
### Table `entities`
|
||||
|
||||
```sql
|
||||
CREATE TABLE entities (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
encrypted_name VARCHAR(512) NOT NULL,
|
||||
encrypted_email VARCHAR(512),
|
||||
encrypted_phone VARCHAR(255),
|
||||
address1 VARCHAR(255),
|
||||
address2 VARCHAR(255),
|
||||
code_postal VARCHAR(20),
|
||||
city VARCHAR(100),
|
||||
country VARCHAR(100),
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
is_active BOOLEAN DEFAULT TRUE
|
||||
);
|
||||
```
|
||||
|
||||
## Sécurité
|
||||
|
||||
L'API utilise plusieurs mécanismes pour assurer la sécurité des données :
|
||||
|
||||
1. **Authentification par jeton** : Un jeton d'authentification est requis pour accéder aux endpoints protégés.
|
||||
2. **Chiffrement des données sensibles** : Les données sensibles comme les noms, emails et numéros de téléphone sont chiffrées en base de données.
|
||||
3. **Validation des entrées** : Toutes les entrées utilisateur sont validées avant traitement.
|
||||
4. **Gestion des erreurs** : Les erreurs sont gérées de manière sécurisée sans divulguer d'informations sensibles.
|
||||
|
||||
## Codes d'erreur
|
||||
|
||||
- `400 Bad Request` : Requête invalide ou données manquantes
|
||||
- `401 Unauthorized` : Authentification requise ou échouée
|
||||
- `403 Forbidden` : Accès non autorisé à la ressource
|
||||
- `404 Not Found` : Ressource non trouvée
|
||||
- `409 Conflict` : Conflit avec l'état actuel de la ressource
|
||||
- `500 Internal Server Error` : Erreur serveur
|
||||
|
||||
## Notes d'implémentation
|
||||
|
||||
- Les mots de passe sont hachés avec l'algorithme bcrypt.
|
||||
- Les données sensibles sont chiffrées avec AES-256-CBC.
|
||||
- Les emails sont envoyés pour les opérations importantes (inscription, réinitialisation de mot de passe).
|
||||
- Les sessions sont gérées côté serveur avec un délai d'expiration.
|
||||
300
api/docs/TECHBOOK.md
Normal file
300
api/docs/TECHBOOK.md
Normal file
@@ -0,0 +1,300 @@
|
||||
# Documentation Technique API RESTful PHP 8.3
|
||||
|
||||
## Table des matières
|
||||
|
||||
1. [Structure du projet](#structure-du-projet)
|
||||
2. [Configuration du serveur](#configuration-du-serveur)
|
||||
3. [Flux d'une requête](#flux-dune-requête)
|
||||
4. [Architecture des composants](#architecture-des-composants)
|
||||
5. [Base de données](#base-de-données)
|
||||
6. [Sécurité](#sécurité)
|
||||
7. [Endpoints API](#endpoints-api)
|
||||
|
||||
## Structure du projet
|
||||
|
||||
```plaintext
|
||||
/api/
|
||||
├── docs/
|
||||
│ └── TECHBOOK.md
|
||||
├── src/
|
||||
│ ├── Controllers/
|
||||
│ │ └── UserController.php
|
||||
│ ├── Core/
|
||||
│ │ ├── Router.php
|
||||
│ │ ├── Request.php
|
||||
│ │ ├── Response.php
|
||||
│ │ ├── Session.php
|
||||
│ │ └── Database.php
|
||||
│ └── Config/
|
||||
│ └── config.php
|
||||
├── index.php
|
||||
└── .htaccess
|
||||
```
|
||||
|
||||
## Configuration du serveur
|
||||
|
||||
### Prérequis
|
||||
|
||||
- Debian 12
|
||||
- NGINX
|
||||
- PHP 8.3-FPM
|
||||
- MariaDB 10.11
|
||||
|
||||
### Configuration NGINX
|
||||
|
||||
Le serveur NGINX est configuré pour rediriger toutes les requêtes vers le point d'entrée `index.php` de l'API.
|
||||
|
||||
### Configuration PHP-FPM
|
||||
|
||||
PHP-FPM est configuré pour gérer les processus PHP avec des paramètres optimisés pour une API.
|
||||
|
||||
## Flux d'une requête
|
||||
|
||||
Exemple détaillé du parcours d'une requête POST /api/users :
|
||||
|
||||
1. **Entrée de la requête**
|
||||
|
||||
- La requête arrive sur le serveur NGINX
|
||||
- NGINX redirige vers PHP-FPM via le socket unix
|
||||
- Le fichier .htaccess redirige vers index.php
|
||||
|
||||
2. **Initialisation (index.php)**
|
||||
|
||||
- Chargement des dépendances
|
||||
- Initialisation de la configuration
|
||||
- Démarrage de la session
|
||||
- Configuration des headers CORS
|
||||
- Initialisation du routeur
|
||||
|
||||
3. **Routage**
|
||||
|
||||
- Le Router analyse la méthode HTTP (POST)
|
||||
- Analyse de l'URI (/api/users)
|
||||
- Correspondance avec les routes enregistrées
|
||||
- Instanciation du Controller approprié
|
||||
|
||||
4. **Traitement (UserController)**
|
||||
|
||||
- Vérification de l'authentification
|
||||
- Récupération des données JSON
|
||||
- Validation des données reçues
|
||||
- Traitement métier
|
||||
- Interaction avec la base de données
|
||||
- Préparation de la réponse
|
||||
|
||||
5. **Réponse**
|
||||
- Formatage de la réponse en JSON
|
||||
- Configuration des headers de réponse
|
||||
- Envoi au client
|
||||
|
||||
## Architecture des composants
|
||||
|
||||
### Core Components
|
||||
|
||||
#### Router
|
||||
|
||||
- Gère le routage des requêtes
|
||||
- Associe les URLs aux Controllers
|
||||
- Gère les paramètres d'URL
|
||||
- Dispatch vers les méthodes appropriées
|
||||
|
||||
#### Request
|
||||
|
||||
- Parse les données entrantes
|
||||
- Gère les différents types de contenu
|
||||
- Nettoie et valide les entrées
|
||||
- Fournit une interface unifiée pour accéder aux données
|
||||
|
||||
#### Response
|
||||
|
||||
- Formate les réponses en JSON
|
||||
- Gère les codes HTTP
|
||||
- Configure les headers de réponse
|
||||
- Assure la cohérence des réponses
|
||||
|
||||
#### Session
|
||||
|
||||
- Gère l'état des sessions
|
||||
- Stocke les données d'authentification
|
||||
- Vérifie les permissions
|
||||
- Sécurise les données de session
|
||||
|
||||
#### Database
|
||||
|
||||
- Gère la connexion à MariaDB
|
||||
- Fournit une interface PDO
|
||||
- Gère le pool de connexions
|
||||
- Assure la sécurité des requêtes
|
||||
|
||||
## Sécurité
|
||||
|
||||
### Mesures implémentées
|
||||
|
||||
- Validation stricte des entrées
|
||||
- Protection contre les injections SQL (PDO)
|
||||
- Hachage sécurisé des mots de passe
|
||||
- Headers de sécurité HTTP
|
||||
- Gestion des CORS
|
||||
- Session sécurisée
|
||||
- Authentification requise
|
||||
|
||||
## Endpoints API
|
||||
|
||||
### Routes Publiques vs Privées
|
||||
|
||||
L'API distingue deux types de routes :
|
||||
|
||||
#### Routes Publiques
|
||||
|
||||
- POST /api/login
|
||||
- POST /api/register
|
||||
- GET /api/health
|
||||
|
||||
#### Routes Privées (Nécessitent une session authentifiée)
|
||||
|
||||
- Toutes les autres routes
|
||||
|
||||
### Authentification
|
||||
|
||||
L'authentification utilise le système de session PHP natif.
|
||||
|
||||
#### Login
|
||||
|
||||
```http
|
||||
POST /api/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"email": "user@example.com",
|
||||
"password": "SecurePassword123"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Connecté avec succès",
|
||||
"user": {
|
||||
"id": 123,
|
||||
"email": "user@example.com"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Notes importantes :**
|
||||
|
||||
- Un cookie de session PHP sécurisé est automatiquement créé
|
||||
- Le cookie est httpOnly, secure et SameSite=Strict
|
||||
- L'ID de session est régénéré à chaque login réussi
|
||||
|
||||
#### Logout
|
||||
|
||||
```http
|
||||
POST /api/logout
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Déconnecté avec succès"
|
||||
}
|
||||
```
|
||||
|
||||
### Sécurité des Sessions
|
||||
|
||||
La configuration des sessions inclut :
|
||||
|
||||
- Sessions PHP natives sécurisées
|
||||
- Protection contre la fixation de session
|
||||
- Cookies httpOnly (protection XSS)
|
||||
- Mode strict pour les cookies
|
||||
- Validation côté serveur à chaque requête
|
||||
|
||||
- use_strict_mode = 1
|
||||
- cookie_httponly = 1
|
||||
- cookie_secure = 1
|
||||
- cookie_samesite = Strict
|
||||
- Régénération de l'ID de session après login
|
||||
- Destruction complète de la session au logout
|
||||
|
||||
### Users
|
||||
|
||||
#### Création d'utilisateur
|
||||
|
||||
```http
|
||||
POST /api/users
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"name": "John Doe",
|
||||
"email": "john@example.com",
|
||||
"password": "SecurePassword123"
|
||||
}
|
||||
```
|
||||
|
||||
**Réponse réussie :**
|
||||
|
||||
```json
|
||||
{
|
||||
"message": "Utilisateur créé",
|
||||
"id": "123"
|
||||
}
|
||||
```
|
||||
|
||||
**Codes de statut :**
|
||||
|
||||
- 201: Création réussie
|
||||
- 400: Données invalides
|
||||
- 401: Non authentifié
|
||||
- 500: Erreur serveur
|
||||
|
||||
#### Autres endpoints
|
||||
|
||||
- GET /api/users
|
||||
- GET /api/users/{id}
|
||||
- PUT /api/users/{id}
|
||||
- DELETE /api/users/{id}
|
||||
|
||||
## Intégration Frontend
|
||||
|
||||
### Configuration des Requêtes
|
||||
|
||||
Toutes les requêtes API depuis le frontend doivent inclure :
|
||||
|
||||
```javascript
|
||||
fetch('/api/endpoint', {
|
||||
credentials: 'include', // Important pour les cookies de session
|
||||
// ... autres options
|
||||
});
|
||||
```
|
||||
|
||||
### Gestion des Sessions
|
||||
|
||||
- Les cookies de session sont automatiquement gérés par le navigateur
|
||||
- Pas besoin de stocker ou gérer des tokens manuellement
|
||||
- Redirection vers /login si session expirée (401)
|
||||
|
||||
## Maintenance et Déploiement
|
||||
|
||||
### Logs
|
||||
|
||||
- Logs d'accès NGINX : /var/log/nginx/api-access.log
|
||||
- Logs d'erreur NGINX : /var/log/nginx/api-error.log
|
||||
- Logs PHP : /var/log/php/php-error.log
|
||||
|
||||
### Déploiement
|
||||
|
||||
1. Pull du repository
|
||||
2. Vérification des permissions
|
||||
3. Configuration de l'environnement
|
||||
4. Tests des endpoints
|
||||
5. Redémarrage des services
|
||||
|
||||
### Surveillance
|
||||
|
||||
- Monitoring des processus PHP-FPM
|
||||
- Surveillance de la base de données
|
||||
- Monitoring des performances
|
||||
- Alertes sur erreurs critiques
|
||||
165
api/docs/api-analysis.md
Normal file
165
api/docs/api-analysis.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# Synthèse du Projet API PHP 8.3
|
||||
|
||||
## Introduction
|
||||
|
||||
Ce document présente une synthèse du projet API développé en PHP 8.3 sur Debian 12. Cette API modulaire sert de backend à plusieurs applications frontend, avec une architecture qui permet de traiter différemment les requêtes en fonction de l'application cliente.
|
||||
|
||||
## Architecture globale
|
||||
|
||||
### Caractéristiques principales
|
||||
|
||||
- **Langage** : PHP 8.3
|
||||
- **Système d'exploitation** : Debian 12
|
||||
- **Architecture** : REST API modulaire
|
||||
- **Multi-applications** : Support de différentes applications frontend via un système de routage conditionnel
|
||||
- **Sécurité** : Gestion des sessions, protection CORS, chiffrement des données sensibles
|
||||
|
||||
### Structure du projet
|
||||
|
||||
```
|
||||
/api/
|
||||
├── bootstrap.php # Initialisation de base et autoload
|
||||
├── composer.json # Dépendances et configuration de l'autoload
|
||||
├── index.php # Point d'entrée principal
|
||||
├── routes/ # Définition des routes par application
|
||||
│ ├── default.php
|
||||
│ ├── prokov.php
|
||||
│ └── resalice.php
|
||||
├── src/
|
||||
│ ├── Config/ # Configuration de l'application
|
||||
│ ├── Controllers/ # Contrôleurs pour chaque ressource
|
||||
│ ├── Core/ # Composants fondamentaux (routeur, DB, session)
|
||||
│ └── Services/ # Services partagés
|
||||
├── logs/ # Journaux d'activité
|
||||
└── vendor/ # Dépendances externes
|
||||
```
|
||||
|
||||
## Fonctionnement
|
||||
|
||||
### Système d'identification des applications
|
||||
|
||||
L'API identifie l'application cliente grâce à l'en-tête HTTP `X-App-Identifier`. Chaque application a son propre identifiant :
|
||||
- `prokov.unikoffice.com` - Application Prokov
|
||||
- `app.resalice.com` - Application Resalice
|
||||
|
||||
En fonction de l'identifiant, l'API :
|
||||
1. Charge les routes spécifiques à l'application
|
||||
2. Applique la configuration correspondante (base de données, préfixe API)
|
||||
3. Active uniquement les modules nécessaires
|
||||
|
||||
### Flux de traitement d'une requête
|
||||
|
||||
1. La requête arrive sur `index.php`
|
||||
2. Le système vérifie l'en-tête `X-App-Identifier` et charge la configuration appropriée
|
||||
3. Le routeur analyse l'URI en tenant compte du préfixe API spécifique à l'application
|
||||
4. Pour les routes privées, le système vérifie l'authentification via Session
|
||||
5. Le contrôleur approprié est instancié et sa méthode appelée
|
||||
6. Une réponse JSON est générée et renvoyée au client
|
||||
|
||||
## Composants principaux
|
||||
|
||||
### Classe AppConfig
|
||||
|
||||
Cette classe singleton gère la configuration de l'API, avec des paramètres spécifiques à chaque application :
|
||||
- Connexion à la base de données
|
||||
- Préfixe des routes API
|
||||
- Modules activés
|
||||
- Clés de chiffrement
|
||||
|
||||
### Classe Router
|
||||
|
||||
Le routeur gère :
|
||||
- L'enregistrement des routes avec leur méthode HTTP (GET, POST, PUT, DELETE)
|
||||
- La gestion des paramètres dynamiques dans les URLs
|
||||
- La distinction entre routes publiques et privées
|
||||
- Le dispatch vers les contrôleurs
|
||||
|
||||
### Classe Database
|
||||
|
||||
Gère la connexion à la base de données en utilisant PDO avec des paramètres optimisés pour la sécurité :
|
||||
- Paramètres préparés
|
||||
- Mode d'erreur strict
|
||||
- Connexion unique (pattern Singleton)
|
||||
|
||||
### Classe Session
|
||||
|
||||
Gère l'authentification des utilisateurs et les sessions :
|
||||
- Configuration sécurisée des cookies
|
||||
- Support de l'authentification par Bearer token
|
||||
- Vérification de l'activité et expiration
|
||||
- Protection contre la fixation de session
|
||||
|
||||
### Classe ApiService
|
||||
|
||||
Fournit des fonctionnalités partagées :
|
||||
- Envoi d'emails via PHPMailer
|
||||
- Chiffrement et déchiffrement des données sensibles
|
||||
- Support de deux types de chiffrement (recherchable et non-recherchable)
|
||||
|
||||
### Classe LogService
|
||||
|
||||
Gère la journalisation des événements avec des métadonnées structurées :
|
||||
- Logs au format JSON pour faciliter l'analyse
|
||||
- Rotation hebdomadaire des fichiers de logs
|
||||
- Capture d'informations sur le client et l'environnement
|
||||
|
||||
## Sécurité
|
||||
|
||||
Le projet implémente plusieurs niveaux de sécurité :
|
||||
|
||||
1. **Authentification** : Session PHP sécurisée, support des tokens Bearer
|
||||
2. **Protection des données** :
|
||||
- Chiffrement des données sensibles (AES-256-CBC)
|
||||
- Hachage sécurisé des mots de passe
|
||||
3. **Sécurité HTTP** :
|
||||
- Validation stricte du CORS
|
||||
- En-têtes de sécurité (X-Content-Type-Options, X-Frame-Options, X-XSS-Protection)
|
||||
- Cookies sécurisés (httpOnly, secure, SameSite=Strict)
|
||||
4. **Sécurité des requêtes** :
|
||||
- Validation des entrées
|
||||
- Protection contre les injections SQL avec PDO
|
||||
- Sanitisation des données
|
||||
|
||||
## Applications supportées
|
||||
|
||||
### Prokov (prokov.unikoffice.com)
|
||||
|
||||
Application avec le préfixe d'API `api/pkv`, supportant les modules :
|
||||
- users
|
||||
- logs
|
||||
- admin
|
||||
|
||||
### Resalice (app.resalice.com)
|
||||
|
||||
Application avec le préfixe d'API `api/res`, supportant les modules :
|
||||
- users
|
||||
- logs
|
||||
- site3
|
||||
|
||||
Fonctionnalités spécifiques :
|
||||
- Gestion des profils utilisateurs avec des champs supplémentaires
|
||||
- Gestion des professionnels
|
||||
|
||||
## Points d'extension
|
||||
|
||||
Le système est conçu pour faciliter l'ajout de nouvelles applications et fonctionnalités :
|
||||
|
||||
1. Ajouter une entrée dans la configuration AppConfig
|
||||
2. Créer un fichier de routes spécifique dans le dossier routes/
|
||||
3. Implémenter les contrôleurs spécifiques
|
||||
4. Éventuellement ajouter des services spécifiques à l'application
|
||||
|
||||
## Dépendances externes
|
||||
|
||||
- **phpmailer/phpmailer** : Utilisé pour l'envoi d'emails
|
||||
- **ext-pdo** : Pour la connexion à la base de données
|
||||
- **ext-openssl** : Pour le chiffrement des données
|
||||
- **ext-json** : Pour la manipulation JSON
|
||||
|
||||
## Conclusion
|
||||
|
||||
Cette API RESTful en PHP 8.3 présente une architecture modulaire bien structurée permettant de servir différentes applications frontend avec une base de code commune. Le système d'identification des applications et de routage conditionnel offre une grande flexibilité tout en maintenant une séparation claire des fonctionnalités.
|
||||
|
||||
La sécurité a été prise en compte à plusieurs niveaux, notamment par le chiffrement des données sensibles et une gestion sécurisée des sessions. Le système de logs permet également un suivi efficace de l'activité et facilite le débogage.
|
||||
|
||||
L'architecture modulaire facilite l'extension à de nouvelles applications et l'ajout de nouvelles fonctionnalités, ce qui en fait une solution évolutive à long terme.
|
||||
0
api/docs/db-d6mon.sql
Normal file
0
api/docs/db-d6mon.sql
Normal file
8
api/docs/flowIncus.md
Normal file
8
api/docs/flowIncus.md
Normal file
@@ -0,0 +1,8 @@
|
||||
```mermaid
|
||||
---
|
||||
title: Test
|
||||
---
|
||||
flowchart LR
|
||||
A[ClientDetector] --> B1[(getAppIdentifier())];
|
||||
|
||||
```
|
||||
200
api/docs/geosector-db-diagram.md
Normal file
200
api/docs/geosector-db-diagram.md
Normal file
@@ -0,0 +1,200 @@
|
||||
# Diagramme Relationnel de la Base de Données Geosector
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
%% Tables de référence (x_*)
|
||||
x_devises ||--o{ x_pays : "fk_devise"
|
||||
x_pays ||--o{ x_regions : "fk_pays"
|
||||
x_regions ||--o{ x_departements : "fk_region"
|
||||
x_regions ||--o{ entites : "fk_region"
|
||||
x_entites_types ||--o{ entites : "fk_type"
|
||||
x_departements ||--o{ x_villes : "fk_departement"
|
||||
|
||||
%% Utilisateurs et entités
|
||||
entites ||--o{ users : "fk_entite"
|
||||
entites ||--o{ operations : "fk_entite"
|
||||
x_users_roles ||--o{ users : "fk_role"
|
||||
x_users_titres ||--o{ users : "fk_titre"
|
||||
|
||||
%% Opérations et secteurs
|
||||
operations ||--o{ ope_sectors : "fk_operation"
|
||||
operations ||--o{ ope_users : "fk_operation"
|
||||
operations ||--o{ ope_users_sectors : "fk_operation"
|
||||
operations ||--o{ ope_pass : "fk_operation"
|
||||
|
||||
users ||--o{ ope_users : "fk_user"
|
||||
users ||--o{ ope_users_sectors : "fk_user"
|
||||
users ||--o{ ope_pass : "fk_user"
|
||||
users ||--o{ ope_pass_histo : "fk_user"
|
||||
|
||||
ope_sectors ||--o{ ope_users_sectors : "fk_sector"
|
||||
ope_sectors ||--o{ sectors_adresses : "fk_sector"
|
||||
ope_sectors ||--o{ ope_pass : "fk_sector"
|
||||
|
||||
ope_pass ||--o{ ope_pass_histo : "fk_pass"
|
||||
x_types_reglements ||--o{ ope_pass : "fk_type_reglement"
|
||||
|
||||
%% Système de chat
|
||||
chat_rooms ||--o{ chat_participants : "id_room"
|
||||
chat_rooms ||--o{ chat_messages : "fk_room"
|
||||
chat_rooms ||--o{ chat_listes_diffusion : "fk_room"
|
||||
chat_rooms ||--o{ chat_notifications : "fk_room"
|
||||
|
||||
users ||--o{ chat_rooms : "fk_user"
|
||||
users ||--o{ chat_participants : "id_user"
|
||||
users ||--o{ chat_messages : "fk_user"
|
||||
users ||--o{ chat_listes_diffusion : "fk_user"
|
||||
users ||--o{ chat_read_messages : "fk_user"
|
||||
users ||--o{ chat_notifications : "fk_user"
|
||||
|
||||
chat_messages ||--o{ chat_read_messages : "fk_message"
|
||||
chat_messages ||--o{ chat_notifications : "fk_message"
|
||||
|
||||
%% Définition des entités avec leurs attributs principaux
|
||||
x_devises {
|
||||
int_unsigned id PK
|
||||
string code
|
||||
string symbole
|
||||
string libelle
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
x_pays {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_continent FK
|
||||
int_unsigned fk_devise FK
|
||||
string libelle
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
x_regions {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_pays FK
|
||||
string libelle
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
x_departements {
|
||||
int_unsigned id PK
|
||||
string code
|
||||
int_unsigned fk_region FK
|
||||
string libelle
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
x_villes {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_departement FK
|
||||
string libelle
|
||||
string cp
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
entites {
|
||||
int_unsigned id PK
|
||||
string libelle
|
||||
int_unsigned fk_region FK
|
||||
int_unsigned fk_type FK
|
||||
tinyint_unsigned chk_demo
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
users {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_entite FK
|
||||
int_unsigned fk_role FK
|
||||
int_unsigned fk_titre FK
|
||||
string encrypted_name
|
||||
string encrypt_user_name
|
||||
string encrypt_password
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
operations {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_entite FK
|
||||
string libelle
|
||||
date date_deb
|
||||
date date_fin
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
ope_sectors {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_operation FK
|
||||
string libelle
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
ope_users {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_operation FK
|
||||
int_unsigned fk_user FK
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
ope_users_sectors {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_operation FK
|
||||
int_unsigned fk_user FK
|
||||
int_unsigned fk_sector FK
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
sectors_adresses {
|
||||
int_unsigned id PK
|
||||
string fk_adresse
|
||||
int_unsigned osm_id
|
||||
int_unsigned fk_sector FK
|
||||
string rue
|
||||
string cp
|
||||
string ville
|
||||
}
|
||||
|
||||
ope_pass {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_operation FK
|
||||
int_unsigned fk_sector FK
|
||||
int_unsigned fk_user FK
|
||||
int_unsigned fk_type_reglement FK
|
||||
timestamp passed_at
|
||||
tinyint_unsigned chk_active
|
||||
}
|
||||
|
||||
ope_pass_histo {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_pass FK
|
||||
int_unsigned fk_user FK
|
||||
}
|
||||
|
||||
chat_rooms {
|
||||
int_unsigned id PK
|
||||
string name
|
||||
enum type
|
||||
int_unsigned fk_user FK
|
||||
int_unsigned fk_entite FK
|
||||
}
|
||||
|
||||
chat_messages {
|
||||
int_unsigned id PK
|
||||
int_unsigned fk_room FK
|
||||
int_unsigned fk_user FK
|
||||
text content
|
||||
enum statut
|
||||
}
|
||||
|
||||
chat_read_messages {
|
||||
bigint_unsigned id PK
|
||||
int_unsigned fk_message FK
|
||||
int_unsigned fk_user FK
|
||||
timestamp date_read
|
||||
}
|
||||
|
||||
chat_notifications {
|
||||
bigint_unsigned id PK
|
||||
int_unsigned fk_user FK
|
||||
int_unsigned fk_message FK
|
||||
int_unsigned fk_room FK
|
||||
string type
|
||||
}
|
||||
```
|
||||
619
api/docs/geosector_app.sql
Normal file
619
api/docs/geosector_app.sql
Normal file
@@ -0,0 +1,619 @@
|
||||
-- Création de la base de données geo_app si elle n'existe pas
|
||||
DROP DATABASE IF EXISTS `geo_app`;
|
||||
CREATE DATABASE IF NOT EXISTS `geo_app` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- Création de l'utilisateur et attribution des droits
|
||||
CREATE USER IF NOT EXISTS 'geo_app_user'@'localhost' IDENTIFIED BY 'QO:96df*?k{4W6m';
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON `geo_app`.* TO 'geo_app_user'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
USE geo_app;
|
||||
|
||||
--
|
||||
-- Table structure for table `email_counter`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `email_counter`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `email_counter` (
|
||||
`id` int unsigned NOT NULL DEFAULT '1',
|
||||
`hour_start` timestamp NULL DEFAULT NULL,
|
||||
`count` int unsigned DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `x_devises`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_devises` (
|
||||
`id` int 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;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Table structure for table `x_entites_types`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `x_entites_types`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_entites_types` (
|
||||
`id` int 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;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Table structure for table `x_types_passages`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `x_types_passages`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_types_passages` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`color_button` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`color_mark` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`color_table` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Table structure for table `x_types_reglements`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `x_types_reglements`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_types_reglements` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT '1',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Table structure for table `x_users_roles`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `x_users_roles`;
|
||||
|
||||
CREATE TABLE `x_users_roles` (
|
||||
`id` int 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';
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `x_users_titres`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_users_titres` (
|
||||
`id` int 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';
|
||||
|
||||
DROP TABLE IF EXISTS `x_pays`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_pays` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(3) DEFAULT NULL,
|
||||
`fk_continent` int unsigned DEFAULT NULL,
|
||||
`fk_devise` int unsigned DEFAULT '1',
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT '1',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
CONSTRAINT `x_pays_ibfk_1` FOREIGN KEY (`fk_devise`) REFERENCES `x_devises` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Table des pays avec leurs codes';
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `x_regions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_regions` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_pays` int 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`),
|
||||
CONSTRAINT `x_regions_ibfk_1` FOREIGN KEY (`fk_pays`) REFERENCES `x_pays` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `x_departements`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_departements` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(3) DEFAULT NULL,
|
||||
`fk_region` int unsigned DEFAULT '1',
|
||||
`libelle` varchar(45) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT '1',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
CONSTRAINT `x_departements_ibfk_1` FOREIGN KEY (`fk_region`) REFERENCES `x_regions` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `entites`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `entites` (
|
||||
`id` int 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 unsigned DEFAULT NULL,
|
||||
`fk_type` int 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 '',
|
||||
`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 unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT '1',
|
||||
PRIMARY KEY (`id`),
|
||||
CONSTRAINT `entites_ibfk_1` FOREIGN KEY (`fk_region`) REFERENCES `x_regions` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `entites_ibfk_2` FOREIGN KEY (`fk_type`) REFERENCES `x_entites_types` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `x_villes`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `x_villes` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_departement` int unsigned DEFAULT '1',
|
||||
`libelle` varchar(65) DEFAULT NULL,
|
||||
`cp` varchar(5) DEFAULT NULL,
|
||||
`code_insee` varchar(5) DEFAULT NULL,
|
||||
`departement` varchar(65) DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT '1',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
CONSTRAINT `x_villes_ibfk_1` FOREIGN KEY (`fk_departement`) REFERENCES `x_departements` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `users`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `users` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_entite` int unsigned DEFAULT '1',
|
||||
`fk_role` int unsigned DEFAULT '1',
|
||||
`fk_titre` int 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 unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned DEFAULT '1',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fk_entite` (`fk_entite`),
|
||||
KEY `username` (`encrypted_user_name`),
|
||||
CONSTRAINT `users_ibfk_1` FOREIGN KEY (`fk_entite`) REFERENCES `entites` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `users_ibfk_2` FOREIGN KEY (`fk_role`) REFERENCES `x_users_roles` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `users_ibfk_3` FOREIGN KEY (`fk_titre`) REFERENCES `x_users_titres` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `operations`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `operations` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_entite` int 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 unsigned NOT NULL DEFAULT '0',
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int 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 DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `ope_sectors`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `ope_sectors` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_old_sector` int unsigned NOT NULL DEFAULT '0',
|
||||
`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 unsigned NOT NULL DEFAULT '0',
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int 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 DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `ope_users`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `ope_users` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_user` int unsigned NOT NULL DEFAULT '0',
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
|
||||
`fk_user_creat` int unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int unsigned DEFAULT NULL,
|
||||
`chk_active` tinyint(1) unsigned NOT NULL DEFAULT '1',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`),
|
||||
CONSTRAINT `ope_users_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_users_ibfk_2` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `email_queue`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `email_queue` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_pass` int unsigned NOT NULL DEFAULT '0',
|
||||
`to_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`subject` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
|
||||
`body` text COLLATE utf8mb4_unicode_ci,
|
||||
`headers` text COLLATE utf8mb4_unicode_ci,
|
||||
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`status` enum('pending','sent','failed') COLLATE utf8mb4_unicode_ci DEFAULT 'pending',
|
||||
`attempts` int unsigned DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `ope_users_sectors`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `ope_users_sectors` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_user` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_sector` int unsigned NOT NULL DEFAULT '0',
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
|
||||
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int 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 DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_users_sectors_ibfk_2` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_users_sectors_ibfk_3` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `ope_users_suivis`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `ope_users_suivis` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_user` int unsigned NOT NULL DEFAULT '0',
|
||||
`date_suivi` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date du suivi',
|
||||
`gps_lat` varchar(20) NOT NULL DEFAULT '',
|
||||
`gps_lng` varchar(20) NOT NULL DEFAULT '',
|
||||
`vitesse` varchar(20) NOT NULL DEFAULT '',
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
|
||||
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `sectors_adresses`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `sectors_adresses` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_adresse` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'adresses.cp??.id',
|
||||
`osm_id` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_sector` int unsigned NOT NULL DEFAULT '0',
|
||||
`osm_name` varchar(50) NOT NULL DEFAULT '',
|
||||
`numero` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`rue_bis` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`rue` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`cp` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`ville` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`gps_lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`gps_lng` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci 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 DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS `ope_pass`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `ope_pass` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_operation` int unsigned NOT NULL DEFAULT '0',
|
||||
`fk_sector` int unsigned DEFAULT '0',
|
||||
`fk_user` int 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 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 unsigned DEFAULT '1',
|
||||
`appt` varchar(5) DEFAULT '',
|
||||
`niveau` varchar(5) DEFAULT '',
|
||||
`residence` varchar(75) DEFAULT '',
|
||||
`gps_lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`gps_lng` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
|
||||
`encrypted_name` varchar(255) NOT NULL DEFAULT '',
|
||||
`montant` decimal(7,2) NOT NULL DEFAULT '0.00',
|
||||
`fk_type_reglement` int unsigned DEFAULT '1',
|
||||
`remarque` text DEFAULT '',
|
||||
`encrypted_email` varchar(255) DEFAULT '',
|
||||
`nom_recu` varchar(50) COLLATE utf8mb4_unicode_ci 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 '',
|
||||
`chk_striped` tinyint(1) unsigned DEFAULT '0',
|
||||
`docremis` tinyint(1) unsigned DEFAULT '0',
|
||||
`date_repasser` timestamp NULL DEFAULT NULL COMMENT 'Date prévue pour repasser',
|
||||
`nb_passages` int 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 unsigned DEFAULT NULL,
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Date de modification',
|
||||
`fk_user_modif` int 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` (`email`),
|
||||
CONSTRAINT `ope_pass_ibfk_1` FOREIGN KEY (`fk_operation`) REFERENCES `operations` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_pass_ibfk_2` FOREIGN KEY (`fk_sector`) REFERENCES `ope_sectors` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_pass_ibfk_3` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
CONSTRAINT `ope_pass_ibfk_4` FOREIGN KEY (`fk_type_reglement`) REFERENCES `x_types_reglements` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `ope_pass_histo`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `ope_pass_histo` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`fk_pass` int unsigned NOT NULL DEFAULT '0',
|
||||
`date_histo` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date historique',
|
||||
`sujet` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci 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=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
DROP TABLE IF EXISTS `medias`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `medias` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`support` varchar(45) NOT NULL DEFAULT '',
|
||||
`support_id` int unsigned NOT NULL DEFAULT '0',
|
||||
`fichier` varchar(250) NOT NULL DEFAULT '',
|
||||
`description` varchar(100) NOT NULL DEFAULT '',
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`fk_user_creat` int unsigned NOT NULL DEFAULT '0',
|
||||
`updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`fk_user_modif` int unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `id_UNIQUE` (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
-- Création des tables pour le système de chat
|
||||
DROP TABLE IF EXISTS `chat_rooms`;
|
||||
-- Table des salles de discussion
|
||||
CREATE TABLE chat_rooms (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
type ENUM('privee', 'groupe', 'liste_diffusion') NOT NULL,
|
||||
date_creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
|
||||
fk_user INT UNSIGNED NOT NULL,
|
||||
fk_entite INT UNSIGNED,
|
||||
statut ENUM('active', 'archive') NOT NULL DEFAULT 'active',
|
||||
description TEXT,
|
||||
INDEX idx_user (fk_user),
|
||||
INDEX idx_entite (fk_entite)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `chat_participants`;
|
||||
-- Table des participants aux salles de discussion
|
||||
CREATE TABLE chat_participants (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
id_room INT UNSIGNED NOT NULL,
|
||||
id_user INT UNSIGNED NOT NULL,
|
||||
role ENUM('administrateur', 'participant', 'en_lecture_seule') NOT NULL DEFAULT 'participant',
|
||||
date_ajout timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date ajout',
|
||||
notification_activee BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
INDEX idx_room (id_room),
|
||||
INDEX idx_user (id_user),
|
||||
CONSTRAINT uc_room_user UNIQUE (id_room, id_user),
|
||||
FOREIGN KEY (id_room) REFERENCES chat_rooms(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS `chat_messages`;
|
||||
-- Table des messages
|
||||
CREATE TABLE chat_messages (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
fk_room INT UNSIGNED NOT NULL,
|
||||
fk_user INT UNSIGNED NOT NULL,
|
||||
content TEXT,
|
||||
date_sent timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date envoi',
|
||||
type ENUM('texte', 'media', 'systeme') NOT NULL DEFAULT 'texte',
|
||||
statut ENUM('envoye', 'livre', 'lu') NOT NULL DEFAULT 'envoye',
|
||||
INDEX idx_room (fk_room),
|
||||
INDEX idx_user (fk_user),
|
||||
INDEX idx_date (date_sent),
|
||||
FOREIGN KEY (fk_room) REFERENCES chat_rooms(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS `chat_listes_diffusion`;
|
||||
-- Table des listes de diffusion
|
||||
CREATE TABLE chat_listes_diffusion (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
fk_room INT UNSIGNED NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
fk_user INT UNSIGNED NOT NULL,
|
||||
date_creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
|
||||
INDEX idx_room (fk_room),
|
||||
INDEX idx_user (fk_user),
|
||||
FOREIGN KEY (fk_room) REFERENCES chat_rooms(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS `chat_read_messages`;
|
||||
-- Table pour suivre la lecture des messages
|
||||
CREATE TABLE chat_read_messages (
|
||||
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
fk_message INT UNSIGNED NOT NULL,
|
||||
fk_user INT UNSIGNED NOT NULL,
|
||||
date_read timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de lecture',
|
||||
INDEX idx_message (fk_message),
|
||||
INDEX idx_user (fk_user),
|
||||
CONSTRAINT uc_message_user UNIQUE (fk_message, fk_user),
|
||||
FOREIGN KEY (fk_message) REFERENCES chat_messages(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS `chat_notifications`;
|
||||
-- Table des notifications
|
||||
CREATE TABLE chat_notifications (
|
||||
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
fk_user INT UNSIGNED NOT NULL,
|
||||
fk_message INT UNSIGNED,
|
||||
fk_room INT UNSIGNED,
|
||||
type VARCHAR(50) NOT NULL,
|
||||
contenu TEXT,
|
||||
date_creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de création',
|
||||
date_lecture timestamp NULL DEFAULT NULL COMMENT 'Date de lecture',
|
||||
statut ENUM('non_lue', 'lue') NOT NULL DEFAULT 'non_lue',
|
||||
INDEX idx_user (fk_user),
|
||||
INDEX idx_message (fk_message),
|
||||
INDEX idx_room (fk_room),
|
||||
FOREIGN KEY (fk_message) REFERENCES chat_messages(id) ON DELETE SET NULL,
|
||||
FOREIGN KEY (fk_room) REFERENCES chat_rooms(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
DROP TABLE IF EXISTS `z_params`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `params` (
|
||||
`id` int 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;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `z_sessions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `z_sessions` (
|
||||
`sid` text NOT NULL,
|
||||
`fk_user` int 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
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
Reference in New Issue
Block a user