# Principes des Calculators du simulateur PDF Octave

## Règles à respecter

1. **Chaque fiscalité utilise uniquement ses calculators spécifiques**  
   Les calculators enregistrés dans `PdfPagesConfig` pour une fiscalité (malraux, denormandie, deficit-foncier, residence-principale, monument-historique) doivent être des classes du **namespace de cette fiscalité** (ex. `App\Simulator\Calculators\Malraux\*`). Ils ne doivent pas être des classes d’une autre fiscalité.

2. **Aucune utilisation des calculators d’une autre fiscalité**  
   Un calculator d’une fiscalité ne doit pas `extend` ni `use` une classe calculator d’une autre fiscalité (ex. Malraux ne doit pas utiliser de classe du namespace Denormandie).

3. **Shared = code commun uniquement, de préférence abstrait**  
   Le dossier `Shared` doit contenir :
   - des **classes abstraites** pour la logique commune (ex. `AbstractPageCalculator`, `AbstractMonPlanDeFinancementCalculator`, `AbstractMonLogementALaLoupeCalculator`) ;
   - éventuellement des classes **concrètes** uniquement si elles sont **vraiment communes** à plusieurs fiscalités et **sans nom ni logique spécifique** à une seule fiscalité.  
   Les calculators dont le nom ou la logique sont spécifiques à une fiscalité (ex. Malraux, Denormandie) ne doivent pas être dans Shared ; ils doivent vivre dans le dossier de la fiscalité et, si besoin, étendre une classe abstraite Shared.

4. **Shared ne dépend d’aucune fiscalité**  
   Aucune classe dans `Shared` ne doit importer ou utiliser une classe d’un namespace de fiscalité (`Malraux\*`, `Denormandie\*`, `DeficitFoncier\*`, etc.). La logique commune (frais de notaire, etc.) doit être dans Shared (ex. `FraisNotaireCore`, `TravauxDeductiblesCore`), pas dans un Core d’une fiscalité.

5. **Calculators “neutres” (FraisNotaire, Imposition)**  
   Les calculators hors fiscalité (ex. `FraisNotaireCalculator`, `ImpositionCalculator`) ne doivent pas dépendre d’un Core d’une seule fiscalité ; ils doivent utiliser les classes partagées (ex. `FraisNotaireCore` pour les frais de notaire).

---

## État actuel (violations constatées)

### 1. ~~Shared utilise le namespace Malraux~~ (corrigé)

- **LeDetailDeMesReductionsDImpotsCalculator** : implémentation déplacée dans `Malraux\LeDetailDeMesReductionsDImpotsCalculator`, classe Shared supprimée.
- **DonneesPrisesEnComptePourMaSimulationCalculator** : implémentation Malraux déplacée dans `Malraux\DonneesPrisesEnComptePourMaSimulationCalculator` ; Shared est devenu une classe abstraite ; Denormandie implémente sa propre logique.
- **LeCalculDeMonAvantageFiscalCalculator** : logique Denormandie/Pinel uniquement dans Shared ; logique Malraux déplacée dans `Malraux\LeCalculDeMonAvantageFiscalCalculator` (étend `AbstractPageCalculator`).

### 2. Shared contient des calculators au nom spécifique à une fiscalité

Ces classes sont **concrètes** et **nommées** selon une fiscalité ; elles devraient idéalement vivre dans le dossier de la fiscalité et étendre une classe abstraite Shared :

- `PourquoiInvestirEnMalrauxCalculator`
- `LaSimulationDeMonInvestissementEnMalrauxCalculator`
- `LesConditionsDEligibiliteAuMalrauxCalculator`
- `MonLotEstEligibleAuMalrauxCalculator`
- `LeDetailDeMesReductionsDImpotsCalculator`
- `LesConditionsDEligibiliteEnDenormandieCalculator`
- `PourquoiInvestirEnDenormandieCalculator`
- `LaSimulationDeMonInvestissementEnDenormandieCalculator`
- `LesDonneesDeMaSimulationEnDenormandieCalculator`
- `FiscaliteDenormandieCalculator`
- `LaSimulationDeMaResidencePrincipaleCalculator`

### 3. Malraux utilise un calculator nommé “Denormandie”

- **Fichier :** `Malraux\FiscaliteDenormandieCalculator`  
- **Problème :** La classe est dans le namespace Malraux mais s’appelle `FiscaliteDenormandieCalculator` et étend `Shared\FiscaliteDenormandieCalculator`. Pour Malraux, le nom devrait refléter la fiscalité (ex. logique “fiscalité” Malraux ou classe dédiée Malraux).

### 4. ~~FraisNotaire dépend de Malraux~~ (corrigé)

- **Fichier :** `FraisNotaire\FraisNotaireCalculator`  
- **Correction appliquée :** Utilise désormais `FraisNotaireCore::calculFraisNotaire()` au lieu de `MalrauxCore`.

### 5. Calculator orphelin à la racine de Calculators

- **Fichier :** `Calculators\MonPlanDeFinancementCalculator.php` (à la racine de `Calculators/`, hors fiscalité)  
- **Problème :** Utilise `MalrauxCore` et contient une branche `typeCalcul === 'malraux'`. Chaque fiscalité a déjà son propre `MonPlanDeFinancementCalculator` dans son namespace. Ce fichier pourrait être du code mort ou à déplacer / refactorer pour utiliser `FraisNotaireCore` et éviter la dépendance à Malraux.

---

## Test de conformité

Un test unitaire `CalculatorPrinciplesComplianceTest` vérifie :

- qu’aucune classe dans `Shared` n’utilise un namespace de fiscalité (Malraux, Denormandie, DeficitFoncier, MonumentHistorique, ResidencePrincipale) ;
- qu’aucune classe d’un dossier de fiscalité n’étend une classe d’une **autre** fiscalité (seulement Shared ou même fiscalité).

Les autres points (Shared contenant des concretes à nom de fiscalité, renommage Malraux/FiscaliteDenormandie, etc.) sont documentés ci‑dessus et peuvent être traités par des refactors ciblés.
