# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project

MVP SaaS de gestion de contrats. Stack TALL : **Laravel 13**, **Livewire**, **Alpine.js**, **Tailwind CSS v4**. Base de données SQLite locale (`database/database.sqlite`).

## Commands

```bash
# Setup initial (une seule fois)
composer setup

# Développement (démarre PHP, queue, logs Pail et Vite en parallèle)
composer dev

# Build assets production
npm run build

# Tests (vide le cache de config puis lance PHPUnit)
composer test

# Test unitaire / feature isolé
php artisan test --filter NomDuTest
php artisan test tests/Feature/ContractTest.php

# Linting PHP (Laravel Pint)
./vendor/bin/pint

# Migrations + seed
php artisan migrate:fresh --seed
```

## Architecture

### Routing & Controllers (`routes/web.php`)
- `GET /` → Dashboard KPI (vue Blade simple, pas de Livewire)
- `GET /contracts` → Composant Livewire `ContractList` (liste paginée, filtres)
- `GET /contracts/{contract}` → Vue Blade avec Route Model Binding sur `Contract`

### Modèle principal : `App\Models\Contract`
Champs : `id`, `name`, `client_name`, `status` (enum : "En cours" | "En attente" | "Terminé" | "Annulé"), `start_date`, `end_date`, `pdf_contract_path` (nullable), `pdf_quote_path` (nullable), `notes` (nullable), `timestamps`.

### Composants Livewire (`app/Livewire/`)
Les composants Livewire gèrent leur propre état réactif (recherche, filtres, pagination). Pas de contrôleur dédié — Livewire joue ce rôle pour les pages dynamiques.

### Layout (`resources/views/components/layouts/app.blade.php`)
Layout principal avec sidebar (liens Accueil/Contrats) et header. Toutes les pages en héritent via `<x-layouts.app>`.

### Assets
Tailwind CSS v4 injecté via plugin Vite (`@tailwindcss/vite`) — pas de fichier `tailwind.config.js`, la config se fait dans `resources/css/app.css`.

### Tests
PHPUnit avec SQLite `:memory:` (configuré dans `phpunit.xml`). Feature tests dans `tests/Feature/`, unit tests dans `tests/Unit/`.

### Fichiers PDF
Stockés dans `storage/app/private/contracts/` via `Storage::disk('local')`. Les chemins relatifs sont sauvegardés dans `pdf_contract_path` et `pdf_quote_path`.
