test(Claude context: database structure)
This commit is contained in:
@@ -1,113 +1,344 @@
|
||||
---
|
||||
title: Schéma de Base de Données - Roxane - Le Retzien Libre
|
||||
---
|
||||
erDiagram
|
||||
users ||--o{ members : "a"
|
||||
users ||--o{ memberships : "gère (admin)"
|
||||
users ||--o{ sessions : "a"
|
||||
users ||--o| password_reset_tokens : "peut avoir"
|
||||
# Schema de Base de Donnees - Roxane
|
||||
|
||||
## Diagramme des relations
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
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"
|
||||
|
||||
members }o--|| users : "appartient à"
|
||||
members }o--|| membergroups : "dans le groupe"
|
||||
members ||--o{ memberships : "a des adhésions"
|
||||
|
||||
memberships }o--|| members : "pour"
|
||||
memberships }o--|| packages : "utilise"
|
||||
memberships }o--|| users : "créé par (admin)"
|
||||
|
||||
membergroups ||--o{ members : "contient"
|
||||
|
||||
packages ||--o{ memberships : "inclus dans"
|
||||
|
||||
users {
|
||||
bigint id PK
|
||||
string name
|
||||
string email UK
|
||||
string name "NOT NULL"
|
||||
string email UK "NOT NULL"
|
||||
timestamp email_verified_at "nullable"
|
||||
string password
|
||||
string password "NOT NULL"
|
||||
text two_factor_secret "nullable (Fortify)"
|
||||
text two_factor_recovery_codes "nullable (Fortify)"
|
||||
timestamp two_factor_confirmed_at "nullable (Fortify)"
|
||||
string remember_token "nullable"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
|
||||
password_reset_tokens {
|
||||
string email PK
|
||||
string token
|
||||
string token "NOT NULL"
|
||||
timestamp created_at "nullable"
|
||||
}
|
||||
|
||||
|
||||
sessions {
|
||||
string id PK
|
||||
bigint user_id FK "nullable, indexed"
|
||||
string ip_address "nullable, max 45"
|
||||
text user_agent "nullable"
|
||||
longtext payload
|
||||
longtext payload "NOT NULL"
|
||||
integer last_activity "indexed"
|
||||
}
|
||||
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
members {
|
||||
bigint id PK
|
||||
bigint user_id FK
|
||||
bigint user_id FK "nullable, ON DELETE SET NULL"
|
||||
string dolibarr_id "nullable"
|
||||
string keycloak_id "nullable"
|
||||
string status "valid/pending/expired"
|
||||
string nature "physical/moral"
|
||||
bigint group_id FK
|
||||
string lastname
|
||||
string firstname
|
||||
string email
|
||||
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"
|
||||
string company "nullable"
|
||||
date date_of_birth "nullable"
|
||||
text address "nullable"
|
||||
string address "nullable"
|
||||
string zipcode "nullable"
|
||||
string city "nullable"
|
||||
string country "nullable"
|
||||
string phone1 "nullable"
|
||||
string phone2 "nullable"
|
||||
boolean public_membership "default false"
|
||||
string website_url "nullable"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
timestamp deleted_at "soft delete"
|
||||
}
|
||||
|
||||
membergroups {
|
||||
bigint id PK
|
||||
string identifier UK
|
||||
string name
|
||||
text description "nullable"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
packages {
|
||||
bigint id PK
|
||||
string identifier UK
|
||||
string name
|
||||
text description "nullable"
|
||||
boolean is_active "default true"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
services {
|
||||
bigint id PK
|
||||
string identifier UK
|
||||
string name
|
||||
text description "nullable"
|
||||
string url "nullable"
|
||||
string icon "nullable"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
|
||||
memberships {
|
||||
bigint id PK
|
||||
bigint member_id FK
|
||||
bigint admin_id FK "créateur"
|
||||
bigint package_id FK
|
||||
date start_date
|
||||
date end_date
|
||||
string status "active/expired/cancelled"
|
||||
decimal amount "montant payé"
|
||||
string payment_status "paid/pending/failed"
|
||||
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"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
timestamp deleted_at "soft delete"
|
||||
}
|
||||
|
||||
services_memberships {
|
||||
bigint id PK
|
||||
bigint service_id FK "NOT NULL, ON DELETE CASCADE"
|
||||
bigint membership_id FK "NOT NULL, ON DELETE CASCADE"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
ispconfigs_members {
|
||||
bigint id PK
|
||||
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"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
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 {
|
||||
bigint id PK
|
||||
string name "NOT NULL"
|
||||
string guard_name "NOT NULL"
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
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 |
|
||||
Reference in New Issue
Block a user