# Base de données ALDANA

Schéma MySQL pour le site Aurane Aldana — vitrine, booking, paiement, espace membre, admin.

## Structure

12 tables métier + 1 table de tracking des migrations.

| Table | Rôle | Domaine |
|---|---|---|
| `t_users` | Utilisateurs + rôles (29 admin, 11 prof, 10 client) | Auth |
| `t_practices` | Yoga, Power Yoga, ... | Catalogue |
| `t_subscription_plans` | Unitaire / carnets / abos | Catalogue |
| `t_events` | Week-Ends Bien-Être | Catalogue |
| `t_classes` | Cours collectifs planifiés (FK `t_practices`) | Planning |
| `t_subscriptions` | Forfaits actifs par membre (FK `t_users`, `t_subscription_plans`) | Engagement |
| `t_payments` | Historique Stripe (FK `t_users`, `t_subscriptions`, self-FK refund) | Engagement |
| `t_bookings` | Résa cours collectif (FK `t_classes`, `t_users`, `t_subscriptions`) | Booking |
| `t_event_bookings` | Résa event (FK `t_events`, `t_users`, `t_payments`) | Booking |
| `t_private_requests` | Demandes cours 1-1 (FK `t_users` nullable) | Support |
| `t_processed_webhooks` | Idempotence webhooks Stripe | Infra |
| `t_site_settings` | CMS léger clé/valeur (citation, infos lieu, ...) | Infra |
| `t_migrations` | Tracking des migrations appliquées (créée auto par migrate.php) | Infra |

## Migrations

Pattern BookConnect : fichiers numérotés `database/migrations/001_*.sql` à `013_*.sql`, exécutés dans l'ordre alphanumérique par un runner PHP.

### Lancer les migrations

```powershell
# Joue celles en attente
C:\wamp64\bin\php\php8.4.0\php.exe database/migrate.php

# Affiche l'état (joué/en attente)
C:\wamp64\bin\php\php8.4.0\php.exe database/migrate.php --status

# Force replay de la dernière migration (debug)
C:\wamp64\bin\php\php8.4.0\php.exe database/migrate.php --redo
```

Le runner trace dans `t_migrations` ce qui est déjà appliqué — idempotent par défaut. Les CREATE utilisent `IF NOT EXISTS`, les INSERT du seed utilisent `ON DUPLICATE KEY UPDATE`.

### Convention pour ajouter une migration

1. Nommer `NNN_<verbe>_<table_ou_feature>.sql` (NNN = nombre 3 chiffres incrémenté, ex: `014_add_birthdate_to_users.sql`)
2. Toujours idempotent (`IF NOT EXISTS`, `IF EXISTS`, ou helper procédure pour ALTER conditionnels)
3. Une seule responsabilité par migration
4. Tester en local : `mysql DROP/CREATE` + `migrate.php` from scratch doit aboutir à l'état attendu

## Seeds

Le fichier `013_seed_initial_data.sql` insère les données indispensables au fonctionnement :
- 1 utilisateur Aurane (role admin)
- 2 pratiques (Yoga, Power Yoga)
- 3 formules (Unitaire 25 €, Carnet 10 séances 180 €, Abo mensuel illimité 110 €/mois)
- 10 settings (citation, infos lieu, fenêtre annulation, etc.)

⚠ **Tous les chiffres sont des hypothèses à valider avec Aurane** (cf spec §10). Le `password_hash` d'Aurane dans le seed est un **placeholder non fonctionnel** ; à réinitialiser via script CLI ou lien de reset email avant production.

## Conventions

- Moteur : **InnoDB** (transactions + FK)
- Charset : **utf8mb4_unicode_ci** partout
- PK : `*_ID` en `INT UNSIGNED AUTO_INCREMENT`
- FK : `ON DELETE RESTRICT` par défaut (jamais cascade silencieuse), `SET NULL` pour les soft refs
- Timestamps : `created_at` partout, `updated_at` quand pertinent
- Indexes systématiques sur FK et colonnes de filtrage temporel
- Pas de soft delete V1 (sauf users via `status='deleted'` en P3)

## Reset complet (dev only)

```powershell
# Adapter le nom selon votre .env (DB_NAME)
C:\wamp64\bin\mysql\mysql9.1.0\bin\mysql.exe -u root -e "DROP DATABASE IF EXISTS aldanadb; CREATE DATABASE aldanadb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
C:\wamp64\bin\php\php8.4.0\php.exe database/migrate.php
```

⚠ Jamais sur prod sans backup.

## FK circulaire t_payments ↔ t_event_bookings

Pour casser la circularité :
- `t_event_bookings.payment_ID → t_payments.payment_ID` est déclarée (FK normale)
- `t_payments.event_booking_ID` existe comme colonne mais **sans FK déclarée**
- La cohérence applicative sera assurée en P5 par la création groupée dans une même transaction PHP

## Note locale `.env`

Par défaut le `.env.example` propose `DB_NAME=aldana`. Le `.env` local actuel utilise `DB_NAME=aldanadb` (suffixe `db` distinctif). Les deux sont valides ; le code utilise systématiquement la valeur du `.env` via le singleton `App\Helpers\Database`.
