test(Claude context: database structure)

This commit is contained in:
2026-02-09 18:46:38 +01:00
parent d8500a251d
commit 45920c083e

View File

@@ -1,113 +1,344 @@
--- # Schema de Base de Donnees - Roxane
title: Schéma de Base de Données - Roxane - Le Retzien Libre
--- ## Diagramme des relations
erDiagram
users ||--o{ members : "a" ```mermaid
users ||--o{ memberships : "gère (admin)" erDiagram
users ||--o{ sessions : "a" users ||--o{ members : "a des membres"
users ||--o| password_reset_tokens : "peut avoir" 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 { users {
bigint id PK bigint id PK
string name string name "NOT NULL"
string email UK string email UK "NOT NULL"
timestamp email_verified_at "nullable" 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" string remember_token "nullable"
timestamp created_at timestamp created_at
timestamp updated_at timestamp updated_at
} }
password_reset_tokens { password_reset_tokens {
string email PK string email PK
string token string token "NOT NULL"
timestamp created_at "nullable" timestamp created_at "nullable"
} }
sessions { sessions {
string id PK string id PK
bigint user_id FK "nullable, indexed" bigint user_id FK "nullable, indexed"
string ip_address "nullable, max 45" string ip_address "nullable, max 45"
text user_agent "nullable" text user_agent "nullable"
longtext payload longtext payload "NOT NULL"
integer last_activity "indexed" 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 { members {
bigint id PK 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 keycloak_id "nullable"
string status "valid/pending/expired" enum status "draft|valid|pending|cancelled|excluded, default draft"
string nature "physical/moral" enum nature "physical|legal, default physical"
bigint group_id FK bigint type_id "nullable"
string lastname bigint group_id "nullable"
string firstname string lastname "nullable"
string email string firstname "nullable"
string email "NOT NULL"
string retzien_email "nullable"
string company "nullable" string company "nullable"
date date_of_birth "nullable" date date_of_birth "nullable"
text address "nullable" string address "nullable"
string zipcode "nullable" string zipcode "nullable"
string city "nullable" string city "nullable"
string country "nullable" string country "nullable"
string phone1 "nullable" string phone1 "nullable"
string phone2 "nullable" string phone2 "nullable"
boolean public_membership "default false" boolean public_membership "default false"
string website_url "nullable"
timestamp created_at timestamp created_at
timestamp updated_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 { memberships {
bigint id PK bigint id PK
bigint member_id FK bigint member_id FK "NOT NULL, ON DELETE CASCADE"
bigint admin_id FK "créateur" bigint admin_id FK "nullable, ON DELETE SET NULL"
bigint package_id FK bigint package_id FK "NOT NULL, ON DELETE CASCADE"
date start_date date start_date "nullable"
date end_date date end_date "nullable"
string status "active/expired/cancelled" enum status "active|expired|pending, default pending"
decimal amount "montant payé" date validation_date "nullable"
string payment_status "paid/pending/failed" 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 created_at
timestamp updated_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 |