# CRM E-Cosplay

CRM de gestion clients, facturation, devis et services numeriques pour l'Association E-Cosplay.

## Stack technique

- **Backend** : Symfony 7 / PHP 8.4 / Doctrine ORM / PostgreSQL
- **Frontend** : Twig + Tailwind CSS (neo-brutalist) + Vanilla JS
- **PDF** : FPDF/FPDI + Dompdf (CGV)
- **Paiement** : Stripe (CB, SEPA, PayPal, Klarna) + Stripe Connect
- **Signature** : DocuSeal
- **Recherche** : Meilisearch
- **Auth** : Keycloak SSO + 2FA (email/TOTP)
- **Infra** : Docker + Caddy + PgBouncer

## Tests

```bash
make run_test          # PHP + JS
make test_coverage     # PHP avec couverture HTML
make run_test_coverage_js  # JS avec couverture
```

## Qualite

```bash
make sonar             # PHPStan + ESLint + Coverage + SonarQube
```

## SonarQube - Exclusions et ignores

### Exclusions d'analyse (`sonar.exclusions`)

| Fichier/Pattern | Raison |
|---|---|
| `vendor/**`, `var/**`, `node_modules/**` | Dependances tierces |
| `migrations/**` | Code genere par Doctrine |
| `src/Repository/**` | Repositories Doctrine auto-generes, pas de logique metier |
| `templates/email/**`, `templates/emails/**` | Templates email HTML (pas de logique testable) |
| `src/Service/AwsSesService.php` | Wrapper AWS SES (appels SDK externes) |
| `src/Service/CloudflareService.php` | Wrapper Cloudflare API (appels SDK externes) |
| `src/Service/DnsCheckService.php` | Appels systeme DNS (dig, whois) |
| `src/Service/DnsInfraHelper.php` | Helper DNS infra (appels systeme) |
| `src/Service/StripePriceService.php` | Wrapper Stripe Price API |
| `src/Service/StripeWebhookService.php` | Gestion secrets webhook Stripe |
| `src/Service/MailcowService.php` | Wrapper Mailcow API (service mail externe) |
| `src/Controller/WebhookDocuSealController.php` | Webhook DocuSeal (interactions externes) |
| `src/Controller/DnsReportController.php` | Rapport DNS (appels systeme) |
| `src/Command/CheckDnsCommand.php` | Commande DNS (appels systeme) |
| `src/Command/CloudflareDnsCleanCommand.php` | Commande Cloudflare (API externe) |

### Exclusions de duplication CPD (`sonar.cpd.exclusions`)

| Fichier/Pattern | Raison |
|---|---|
| `src/Entity/**` | Entites Doctrine : getters/setters repetitifs par nature |
| `src/Repository/**` | Repositories : structure identique (ServiceEntityRepository) |
| `src/Service/Pdf/**` | Services PDF FPDF : Header/Footer/Body patterns similaires entre AdvertPdf, FacturePdf, DevisPdf |
| `src/Service/TarificationService.php` | Config prix avec structures repetitives |
| `src/Service/AdvertService.php`, `FactureService.php`, `DevisService.php` | Pattern TVA/totaux commun (isTvaEnabled, getTvaRate, computeTotals) |
| `src/Service/MeilisearchService.php` | DAL CRUD repetitif pour 9 index (index/remove/search x 9 entites) |
| `templates/admin/clients/show.html.twig` | Badges de statut HTML repetitifs (24 badges similaires pour differents etats) |

### Ignores de regles (`sonar.issue.ignore.multicriteria`)

| Regle | Fichier | Raison |
|---|---|---|
| `php:S4144` (methodes identiques) | `**/*.php` | Faux positifs sur methodes avec meme structure mais contexte different |
| `php:S107` (trop de parametres) | `MailerService.php` | `sendEmail()` necessite 8 params (to, subject, content, from, replyTo, unsubscribe, attachments, priority) - tous utiles |
| `php:S1200` (couplage classe) | `MeilisearchService.php` | Service DAL centralise qui depend de 9 entites par design |
| `php:S1820` (trop de methodes) | `MeilisearchService.php` | 44 methodes = 3 generiques + (index/remove/search) x 9 entites + setup/purge/stats + serializers. Splitter ajouterait de la complexite sans valeur |
