Référence pour reproduire les calculs du fichier Simulateur (export CSV) dans le service CalculateOfferFromRequestService.
| Donnée | Valeur CSV (€) | En centimes (code) |
|---|---|---|
| Déplacement HT | 35,00 | 3500 |
| Déplacement TTC | 38,50 | 3850 |
| Tarif MO / h | 73,88 | 7388 |
| Heures MO | 2 | - |
| Coef MO (équipement) | 1,00 | 1.0 |
| Total MO HT | 147,76 | 14776 |
| Total MO TTC | 155,89 | 15589 |
| Fournitures HT | 31,29 | 3129 |
| Fournitures TTC | 33,01 | 3301 |
Formules (colonnes) : Entretien Ponctuel, ECO, ESSENTIEL, CONFORT, SERENITE.
| Formule | Durée (mois) | Visites | Coef majoration | Remise fidélité |
|---|---|---|---|---|
| Entretien Ponctuel | - | 1 | 1,15 | 0% |
| ECO | 24 | 1 | 1,15 | 0% |
| ESSENTIEL | 12 | 1 | 1,2 | 3% |
| CONFORT | 12 | 1 | 1,2 | 3% |
| SERENITE | 12 | 2 | 1,7 | 5% |
Résultats CSV (ex. ECO, sans remise) :
| Élément | Simulateur CSV | Code (CalculateOfferFromRequestService) |
|---|---|---|
| Unité | Euros (affichage) | Centimes (stockage Price, DTOs en centimes) |
| Déplacement | Prix zone × coef × visites | PostalCode.price (centimes) × punctual_shift_coefficient × getSubscriptionVisit() × punctual_coefficient si ponctuel |
| MO | Tarif h × heures × coef MO × coef formule | hourlyPrice × hourRequire × coefficientRate × maintenanceOffer.getCoefficient() (+ punctual_coefficient si ponctuel) |
| Fournitures | Prix fourniture × coef formule | supplyPrice × maintenanceOffer.getCoefficient() |
| Mensualité | Total TTC / durée | totalTtc / duration (en centimes), arrondi Math::roundAwayFromZero |
| TVA particulier | 5,5 % (155,89/147,76 ≈ 1,055) | Paramètre individual_vat : 0,1 (10 %) par défaut |
individual_vat = 0,1).individual_vat à 0,055 (ou valeur paramétrée).PostalCode.price en centimes (ex. 3500 pour 35 €).price = 3500 (ou 35.0 si le champ est en euros selon le modèle).punctual_shift_coefficient (ex. 1,2) × punctual_coefficient (ex. 1,0).MaintenanceOffer avec les bons coefficient, subscriptionDuration, subscriptionVisit (et type ponctuel/récurrent).Math::roundAwayFromZero (mode “away from zero”).Conclusion : le simulateur peut utiliser deux TVA (déplacement 10 %, MO/fournitures 5,5 %). Le code actuel utilise une seule TVA par client (pro/particulier). Pour reproduire le CSV, il faudrait soit :
individual_vat, pro_vat, punctual_shift_coefficient, punctual_coefficient, et prix/zone (Gradignan = 3500 centimes si prix en cts).testCalculatePriceMatchesSimulatorEco) avec les données du CSV en centimes, mêmes coefficients et durée, et assertions sur totaux HT/TTC et mensualité une fois la règle TVA fixée.Le test testCalculatePriceVsSimulatorCsvEco dans CalculateOfferFromRequestServiceTest reproduit le scénario ECO du CSV (Particulier, 1 PAC, Gradignan 35€, coef 1,15, 24 mois, 1 visite) et :
Pour lancer uniquement ce test :
docker compose exec api env APP_ENV=test php bin/phpunit tests/Service/CalculateOfferFromRequestServiceTest.php --filter testCalculatePriceVsSimulatorCsvEco
Une fois la TVA (ou d’autres paramètres) alignée avec le simulateur, on pourra remplacer l’assertNotEquals sur le TTC par une égalité stricte sur les totaux et la mensualité.