2026-02-09 18:46:38 +01:00
|
|
|
# Schema de Base de Donnees - Roxane
|
|
|
|
|
|
|
|
|
|
## Diagramme des relations
|
|
|
|
|
|
|
|
|
|
```mermaid
|
2025-10-22 17:09:48 +02:00
|
|
|
erDiagram
|
2026-02-09 18:46:38 +01:00
|
|
|
users ||--o{ members : "a des membres"
|
|
|
|
|
users ||--o{ memberships : "cree (admin)"
|
|
|
|
|
users ||--o{ sessions : "a des sessions"
|
|
|
|
|
|
|
|
|
|
members }o--o| users : "lie a"
|
|
|
|
|
members }o--o| member_groups : "dans le groupe"
|
|
|
|
|
members ||--o{ memberships : "a des adhesions"
|
|
|
|
|
members ||--o{ ispconfigs_members : "comptes ISPConfig"
|
|
|
|
|
members ||--o{ nextclouds_members : "comptes Nextcloud"
|
|
|
|
|
|
|
|
|
|
memberships }o--|| members : "pour le membre"
|
|
|
|
|
memberships }o--|| packages : "formule choisie"
|
|
|
|
|
memberships }o--o| users : "cree par (admin)"
|
|
|
|
|
memberships ||--o{ services_memberships : "services inclus"
|
|
|
|
|
|
|
|
|
|
services ||--o{ services_memberships : "utilise dans"
|
|
|
|
|
|
|
|
|
|
member_groups ||--o{ members : "contient"
|
|
|
|
|
packages ||--o{ memberships : "souscrite via"
|
|
|
|
|
|
|
|
|
|
roles ||--o{ role_has_permissions : "a des permissions"
|
|
|
|
|
permissions ||--o{ role_has_permissions : "attribuee a"
|
|
|
|
|
roles ||--o{ model_has_roles : "attribue a"
|
|
|
|
|
permissions ||--o{ model_has_permissions : "attribuee a"
|
|
|
|
|
|
2025-10-22 17:09:48 +02:00
|
|
|
users {
|
|
|
|
|
bigint id PK
|
2026-02-09 18:46:38 +01:00
|
|
|
string name "NOT NULL"
|
|
|
|
|
string email UK "NOT NULL"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp email_verified_at "nullable"
|
2026-02-09 18:46:38 +01:00
|
|
|
string password "NOT NULL"
|
|
|
|
|
text two_factor_secret "nullable (Fortify)"
|
|
|
|
|
text two_factor_recovery_codes "nullable (Fortify)"
|
|
|
|
|
timestamp two_factor_confirmed_at "nullable (Fortify)"
|
2025-10-22 17:09:48 +02:00
|
|
|
string remember_token "nullable"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
2025-10-22 17:09:48 +02:00
|
|
|
password_reset_tokens {
|
|
|
|
|
string email PK
|
2026-02-09 18:46:38 +01:00
|
|
|
string token "NOT NULL"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp created_at "nullable"
|
|
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
2025-10-22 17:09:48 +02:00
|
|
|
sessions {
|
|
|
|
|
string id PK
|
|
|
|
|
bigint user_id FK "nullable, indexed"
|
|
|
|
|
string ip_address "nullable, max 45"
|
|
|
|
|
text user_agent "nullable"
|
2026-02-09 18:46:38 +01:00
|
|
|
longtext payload "NOT NULL"
|
2025-10-22 17:09:48 +02:00
|
|
|
integer last_activity "indexed"
|
|
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
|
|
|
|
contacts {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string lastname "nullable"
|
|
|
|
|
string firstname "nullable"
|
|
|
|
|
string email "nullable"
|
|
|
|
|
string address "nullable"
|
|
|
|
|
string subject "nullable"
|
|
|
|
|
text message "nullable"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
member_groups {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string identifier UK "NOT NULL"
|
|
|
|
|
string name "NOT NULL"
|
|
|
|
|
string description "nullable"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
timestamp deleted_at "soft delete"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
member_types {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string identifier UK "NOT NULL"
|
|
|
|
|
string name "NOT NULL"
|
|
|
|
|
string description "nullable"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
timestamp deleted_at "soft delete"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
packages {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string identifier UK "NOT NULL"
|
|
|
|
|
string name "NOT NULL"
|
|
|
|
|
string description "nullable"
|
|
|
|
|
decimal price "precision 10, default 0"
|
|
|
|
|
boolean is_active "default true"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
timestamp deleted_at "soft delete"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
services {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string identifier UK "NOT NULL"
|
|
|
|
|
string name "NOT NULL"
|
|
|
|
|
string description "nullable"
|
|
|
|
|
string url "NOT NULL"
|
|
|
|
|
string icon "nullable"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
timestamp deleted_at "soft delete"
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-22 17:09:48 +02:00
|
|
|
members {
|
|
|
|
|
bigint id PK
|
2026-02-09 18:46:38 +01:00
|
|
|
bigint user_id FK "nullable, ON DELETE SET NULL"
|
|
|
|
|
string dolibarr_id "nullable"
|
2025-10-22 17:09:48 +02:00
|
|
|
string keycloak_id "nullable"
|
2026-02-09 18:46:38 +01:00
|
|
|
enum status "draft|valid|pending|cancelled|excluded, default draft"
|
|
|
|
|
enum nature "physical|legal, default physical"
|
|
|
|
|
bigint type_id "nullable"
|
|
|
|
|
bigint group_id "nullable"
|
|
|
|
|
string lastname "nullable"
|
|
|
|
|
string firstname "nullable"
|
|
|
|
|
string email "NOT NULL"
|
|
|
|
|
string retzien_email "nullable"
|
2025-10-22 17:09:48 +02:00
|
|
|
string company "nullable"
|
|
|
|
|
date date_of_birth "nullable"
|
2026-02-09 18:46:38 +01:00
|
|
|
string address "nullable"
|
2025-10-22 17:09:48 +02:00
|
|
|
string zipcode "nullable"
|
|
|
|
|
string city "nullable"
|
|
|
|
|
string country "nullable"
|
|
|
|
|
string phone1 "nullable"
|
|
|
|
|
string phone2 "nullable"
|
|
|
|
|
boolean public_membership "default false"
|
2026-02-09 18:46:38 +01:00
|
|
|
string website_url "nullable"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
2026-02-09 18:46:38 +01:00
|
|
|
timestamp deleted_at "soft delete"
|
2025-10-22 17:09:48 +02:00
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
|
|
|
|
memberships {
|
2025-10-22 17:09:48 +02:00
|
|
|
bigint id PK
|
2026-02-09 18:46:38 +01:00
|
|
|
bigint member_id FK "NOT NULL, ON DELETE CASCADE"
|
|
|
|
|
bigint admin_id FK "nullable, ON DELETE SET NULL"
|
|
|
|
|
bigint package_id FK "NOT NULL, ON DELETE CASCADE"
|
|
|
|
|
date start_date "nullable"
|
|
|
|
|
date end_date "nullable"
|
|
|
|
|
enum status "active|expired|pending, default pending"
|
|
|
|
|
date validation_date "nullable"
|
|
|
|
|
string payment_method "nullable"
|
|
|
|
|
decimal amount "precision 10-2, default 0"
|
|
|
|
|
enum payment_status "paid|unpaid|partial, default unpaid"
|
|
|
|
|
longtext note_public "nullable"
|
|
|
|
|
longtext note_private "nullable"
|
|
|
|
|
string dolibarr_id "nullable"
|
|
|
|
|
string dolibarr_user_id "nullable"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
2026-02-09 18:46:38 +01:00
|
|
|
timestamp deleted_at "soft delete"
|
2025-10-22 17:09:48 +02:00
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
|
|
|
|
services_memberships {
|
2025-10-22 17:09:48 +02:00
|
|
|
bigint id PK
|
2026-02-09 18:46:38 +01:00
|
|
|
bigint service_id FK "NOT NULL, ON DELETE CASCADE"
|
|
|
|
|
bigint membership_id FK "NOT NULL, ON DELETE CASCADE"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
|
|
|
|
ispconfigs_members {
|
2025-10-22 17:09:48 +02:00
|
|
|
bigint id PK
|
2026-02-09 18:46:38 +01:00
|
|
|
bigint member_id FK "NOT NULL, ON DELETE NO ACTION"
|
|
|
|
|
string ispconfig_client_id "nullable"
|
|
|
|
|
string ispconfig_service_user_id "nullable"
|
|
|
|
|
string email "nullable"
|
|
|
|
|
enum type "mail|web|other, NOT NULL"
|
|
|
|
|
json data "nullable"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
|
|
|
|
nextclouds_members {
|
|
|
|
|
bigint id PK
|
|
|
|
|
bigint member_id FK "NOT NULL, ON DELETE NO ACTION"
|
|
|
|
|
string nextcloud_user_id "nullable"
|
|
|
|
|
json data "nullable"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
webdomains_members {
|
|
|
|
|
bigint id PK
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
permissions {
|
2025-10-22 17:09:48 +02:00
|
|
|
bigint id PK
|
2026-02-09 18:46:38 +01:00
|
|
|
string name "NOT NULL"
|
|
|
|
|
string guard_name "NOT NULL"
|
2025-10-22 17:09:48 +02:00
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
2026-02-09 18:46:38 +01:00
|
|
|
|
|
|
|
|
roles {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string name "NOT NULL"
|
|
|
|
|
string guard_name "NOT NULL"
|
|
|
|
|
timestamp created_at
|
|
|
|
|
timestamp updated_at
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
model_has_permissions {
|
|
|
|
|
bigint permission_id FK "NOT NULL"
|
|
|
|
|
string model_type "NOT NULL"
|
|
|
|
|
bigint model_id "NOT NULL"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
model_has_roles {
|
|
|
|
|
bigint role_id FK "NOT NULL"
|
|
|
|
|
string model_type "NOT NULL"
|
|
|
|
|
bigint model_id "NOT NULL"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
role_has_permissions {
|
|
|
|
|
bigint permission_id FK "NOT NULL"
|
|
|
|
|
bigint role_id FK "NOT NULL"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cache {
|
|
|
|
|
string key PK
|
|
|
|
|
mediumtext value "NOT NULL"
|
|
|
|
|
integer expiration "NOT NULL"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cache_locks {
|
|
|
|
|
string key PK
|
|
|
|
|
string owner "NOT NULL"
|
|
|
|
|
integer expiration "NOT NULL"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jobs {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string queue "indexed"
|
|
|
|
|
longtext payload "NOT NULL"
|
|
|
|
|
tinyint attempts "NOT NULL"
|
|
|
|
|
integer reserved_at "nullable"
|
|
|
|
|
integer available_at "NOT NULL"
|
|
|
|
|
integer created_at "NOT NULL"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
job_batches {
|
|
|
|
|
string id PK
|
|
|
|
|
string name "NOT NULL"
|
|
|
|
|
integer total_jobs "NOT NULL"
|
|
|
|
|
integer pending_jobs "NOT NULL"
|
|
|
|
|
integer failed_jobs "NOT NULL"
|
|
|
|
|
longtext failed_job_ids "NOT NULL"
|
|
|
|
|
mediumtext options "nullable"
|
|
|
|
|
integer cancelled_at "nullable"
|
|
|
|
|
integer created_at "NOT NULL"
|
|
|
|
|
integer finished_at "nullable"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
failed_jobs {
|
|
|
|
|
bigint id PK
|
|
|
|
|
string uuid UK "NOT NULL"
|
|
|
|
|
text connection "NOT NULL"
|
|
|
|
|
text queue "NOT NULL"
|
|
|
|
|
longtext payload "NOT NULL"
|
|
|
|
|
longtext exception "NOT NULL"
|
|
|
|
|
timestamp failed_at "default CURRENT_TIMESTAMP"
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Detail des tables
|
|
|
|
|
|
|
|
|
|
### Tables metier
|
|
|
|
|
|
|
|
|
|
| Table | Description | Soft Delete | FK |
|
|
|
|
|
|-------|-------------|:-----------:|-----|
|
|
|
|
|
| `members` | Adherents de l'association | oui | `user_id` → users, `group_id` → member_groups |
|
|
|
|
|
| `memberships` | Cotisations / periodes d'adhesion | oui | `member_id` → members, `admin_id` → users, `package_id` → packages |
|
|
|
|
|
| `services_memberships` | Pivot services <-> cotisations | non | `service_id` → services, `membership_id` → memberships |
|
|
|
|
|
| `packages` | Formules d'adhesion (custom, 1 an, 2 ans) | oui | - |
|
|
|
|
|
| `services` | Services numeriques (mail, nextcloud, etc.) | oui | - |
|
|
|
|
|
| `member_groups` | Groupes de membres (admin, website) | oui | - |
|
|
|
|
|
| `member_types` | Types de membres | oui | - |
|
|
|
|
|
| `contacts` | Soumissions du formulaire de contact | non | - |
|
|
|
|
|
|
|
|
|
|
### Tables d'integration externe
|
|
|
|
|
|
|
|
|
|
| Table | Service externe | Description |
|
|
|
|
|
|-------|----------------|-------------|
|
|
|
|
|
| `ispconfigs_members` | ISPConfig | Lie un membre a ses comptes mail/web ISPConfig |
|
|
|
|
|
| `nextclouds_members` | Nextcloud | Lie un membre a son compte Nextcloud |
|
|
|
|
|
| `webdomains_members` | ISPConfig Web | Table preparee (vide) |
|
|
|
|
|
|
|
|
|
|
### Tables systeme
|
|
|
|
|
|
|
|
|
|
| Table | Origine | Description |
|
|
|
|
|
|-------|---------|-------------|
|
|
|
|
|
| `users` | Laravel + Fortify | Comptes utilisateurs avec 2FA |
|
|
|
|
|
| `password_reset_tokens` | Laravel | Tokens de reinitialisation de mot de passe |
|
|
|
|
|
| `sessions` | Laravel | Sessions utilisateur |
|
|
|
|
|
| `cache` / `cache_locks` | Laravel | Cache applicatif |
|
|
|
|
|
| `jobs` / `job_batches` / `failed_jobs` | Laravel | File d'attente de jobs |
|
|
|
|
|
| `permissions` | Spatie | Permissions individuelles |
|
|
|
|
|
| `roles` | Spatie | Roles (super_admin, panel_user) |
|
|
|
|
|
| `model_has_permissions` | Spatie | Pivot polymorphe modele <-> permissions |
|
|
|
|
|
| `model_has_roles` | Spatie | Pivot polymorphe modele <-> roles |
|
|
|
|
|
| `role_has_permissions` | Spatie | Pivot roles <-> permissions |
|
|
|
|
|
|
|
|
|
|
### Enums en base
|
|
|
|
|
|
|
|
|
|
| Table | Colonne | Valeurs |
|
|
|
|
|
|-------|---------|---------|
|
|
|
|
|
| `members` | `status` | `draft`, `valid`, `pending`, `cancelled`, `excluded` |
|
|
|
|
|
| `members` | `nature` | `physical`, `legal` |
|
|
|
|
|
| `memberships` | `status` | `active`, `expired`, `pending` |
|
|
|
|
|
| `memberships` | `payment_status` | `paid`, `unpaid`, `partial` |
|
|
|
|
|
| `ispconfigs_members` | `type` | `mail`, `web`, `other` |
|
|
|
|
|
|
|
|
|
|
### Cles etrangeres
|
|
|
|
|
|
|
|
|
|
| Table source | Colonne | Table cible | ON DELETE |
|
|
|
|
|
|-------------|---------|-------------|-----------|
|
|
|
|
|
| `members` | `user_id` | `users` | SET NULL |
|
|
|
|
|
| `memberships` | `member_id` | `members` | CASCADE |
|
|
|
|
|
| `memberships` | `admin_id` | `users` | SET NULL |
|
|
|
|
|
| `memberships` | `package_id` | `packages` | CASCADE |
|
|
|
|
|
| `services_memberships` | `service_id` | `services` | CASCADE |
|
|
|
|
|
| `services_memberships` | `membership_id` | `memberships` | CASCADE |
|
|
|
|
|
| `ispconfigs_members` | `member_id` | `members` | NO ACTION |
|
|
|
|
|
| `nextclouds_members` | `member_id` | `members` | NO ACTION |
|
|
|
|
|
| `sessions` | `user_id` | `users` | - |
|
|
|
|
|
| `model_has_permissions` | `permission_id` | `permissions` | CASCADE |
|
|
|
|
|
| `model_has_roles` | `role_id` | `roles` | CASCADE |
|
|
|
|
|
| `role_has_permissions` | `permission_id` | `permissions` | CASCADE |
|
|
|
|
|
| `role_has_permissions` | `role_id` | `roles` | CASCADE |
|