# Système de Calculators pour les Pages PDF

## Architecture

Ce système permet d'isoler la logique de calcul de chaque page PDF dans des classes dédiées, rendant le code plus maintenable et testable.

## Structure

### PageDTO
Classe DTO (Data Transfer Object) qui représente une page PDF avec :
- `$number` : Numéro de la page
- `$data` : Données à passer au template
- `$templatePath` : Chemin du fichier Blade

### PageCalculatorInterface
Interface que tous les calculators doivent implémenter :
```php
public function calculate(object $contexte, ?object $calcul = null, ?object $program = null, ?object $lot = null): array
```

### PageBuilder
Service qui :
1. Construit les `PageDTO` à partir des slugs de templates
2. Utilise les calculators pour calculer les données spécifiques
3. Rend les pages en HTML

## Créer un nouveau Calculator

### 1. Créer la classe Calculator

Exemple : `LaSimulationDeMonInvestissementEnDenormandieCalculator.php`

```php
<?php

namespace App\Simulator\Calculators;

class LaSimulationDeMonInvestissementEnDenormandieCalculator implements PageCalculatorInterface
{
    public function calculate(object $contexte, ?object $calcul = null, ?object $program = null, ?object $lot = null): array
    {
        // Calculer uniquement les données spécifiques à cette page
        // Les données communes (calcul, contexte, program, lot) sont déjà passées par PageBuilder

        return [
            'ma_donnee_specifique' => $valeur,
            // ...
        ];
    }
}
```

### 2. Enregistrer le Calculator dans PageBuilder

Dans `PageBuilder::getCalculatorForTemplate()`, ajouter le mapping :

```php
$calculatorMap = [
    'la-simulation-de-mon-investissement-en-denormandie' =>
        \App\Simulator\Calculators\LaSimulationDeMonInvestissementEnDenormandieCalculator::class,
    'mon-nouveau-template' =>
        \App\Simulator\Calculators\MonNouveauTemplateCalculator::class,
    // ...
];
```

### 3. Utiliser dans le template

Le template reçoit automatiquement :
- `$pageNumber` : Numéro de la page (remplace `{{ $contexte->pageNumber }}`)
- `$calcul` : Objet calcul
- `$contexte` : Contexte global
- `$program` : Programme (peut être null)
- `$lot` : Lot (peut être null)
- `$pdfGenerator` : Instance de PdfGenerator pour les helpers
- Toutes les données retournées par `calculate()`

## Avantages

1. **Isolation** : Chaque page a sa propre logique de calcul isolée
2. **Testabilité** : Les calculators peuvent être testés unitairement
3. **Maintenabilité** : Code plus petit et plus facile à comprendre
4. **Réutilisabilité** : Les calculators peuvent être réutilisés si nécessaire
5. **Type Safety** : Interface claire avec types définis

## Exemple complet

Voir `LaSimulationDeMonInvestissementEnDenormandieCalculator.php` pour un exemple d'implémentation.

