# Velora

Application web Laravel de gestion d’épargne personnelle par enveloppes virtuelles. Elle ne détient, ne déplace et ne synchronise aucun argent réel, et ne demande aucun identifiant bancaire.

## Fonctionnalités

- authentification, profil et réinitialisation du mot de passe ;
- supports d’épargne saisis manuellement ;
- enveloppes rattachées à un compte, avec objectif, date, couleur, statut et pourcentage ;
- transactions réparties avec des curseurs en pourcentage, préremplis selon les règles des enveloppes ;
- enveloppe « Économie » automatique recevant la différence entre 100 % et les pourcentages choisis ;
- répartition du solde déjà enregistré sans augmenter artificiellement le compte ;
- retraits protégés contre le découvert, avec dérogation explicite ;
- transferts internes sans variation du total ;
- tableau de bord, détection d’incohérence et historique filtrable ;
- interface française responsive, thème clair/sombre ;
- isolation serveur des données, Policies, Form Requests et transactions SQL.

## Modèle de données

Tous les montants sont des entiers en centimes. `savings_accounts` représente les soldes externes déclarés. Chaque `envelope` appartient à un compte et conserve le montant virtuellement réservé sur ce support. Chaque action crée une `operation`; ses écritures signées dans `movements` donnent une piste d’audit par enveloppe. Les versements, répartitions initiales, retraits et transferts sont atomiques et verrouillent les soldes concernés.

Une enveloppe peut avoir un pourcentage par défaut ou être libre (0 % par défaut). À chaque transaction, tous les curseurs restent modifiables. Leur total peut être inférieur ou égal à 100 %, mais jamais supérieur. L’enveloppe système « Économie » reçoit automatiquement le reliquat jusqu’à 100 %, ainsi que les éventuels centimes d’arrondi. Un transfert virtuel est limité aux enveloppes d’un même compte afin de ne pas simuler un transfert bancaire réel.

Une correction manuelle du solde d’un compte est également atomique : une hausse est versée dans Économie ; une baisse consomme d’abord le solde non affecté puis, seulement si nécessaire, réduit proportionnellement les enveloppes afin que leur total ne dépasse jamais le nouveau solde du compte.

## Installation locale (SQLite)

Prérequis : PHP 8.3+, Composer et les extensions SQLite usuelles.

```bash
composer install
cp .env.example .env
php artisan key:generate
touch database/database.sqlite
php artisan migrate --seed
php artisan serve
```

Ouvrir http://localhost:8000. L’interface CSS est livrée prête à l’emploi : Node n’est pas requis pour démarrer.

## Docker Compose (MySQL)

Créer d’abord une clé avec `php artisan key:generate --show`, puis :

```bash
APP_KEY=base64:VOTRE_CLE docker compose up --build
docker compose exec app php artisan db:seed
```

Sous PowerShell : `$env:APP_KEY='base64:VOTRE_CLE'; docker compose up --build`.

## Compte de démonstration

- E-mail : `demo@epargne-claire.test`
- Mot de passe : `Demo1234!`

Ces identifiants sont réservés au développement et ne doivent jamais être utilisés en production.

## Tests et formatage

```bash
php artisan test
vendor/bin/pint --test
```

La suite couvre l’isolation entre utilisateurs, le rattachement des enveloppes, les pourcentages par défaut et libres, les curseurs personnalisés, le reliquat Économie, le refus d’un total supérieur à 100 %, la répartition du solde existant, les retraits, les transferts et la conservation des totaux.

## Production

Configurer MySQL, `APP_ENV=production`, `APP_DEBUG=false`, une clé unique, HTTPS, un vrai transport d’e-mail et un processus de sauvegarde. Une future synchronisation bancaire devra passer par un prestataire réglementé dans un module d’intégration séparé ; aucune donnée d’accès bancaire ne doit entrer dans ce cœur métier.
