02-traitement-factures
<?php
class InvoiceProcessor {
public function process(array $items, string $customerEmail, string $format): void {
$total = 0;
foreach($items as $item) {
$total += $item['price'] * $item['quantity'];
}
$taxRate = 0.20;
$tax = $total * $taxRate;
$finalTotal = $total + $tax;
if($format === 'pdf') {
$content = "FACTURE\n\nTotal HT: $total EUR\nTVA: $tax EUR\nTotal TTC: $finalTotal EUR";
file_put_contents("/tmp/invoice.pdf", $content);
} elseif($format === 'html') {
$content = "<h1>FACTURE</h1><p>Total: $finalTotal EUR</p>";
file_put_contents("/tmp/invoice.html", $content);
}
$db = new PDO('mysql:host=localhost;dbname=invoices','root','');
$stmt = $db->prepare('INSERT INTO invoices (total,tax,customer_email) VALUES (?,?,?)');
$stmt->execute([$total, $tax, $customerEmail]);
mail($customerEmail, "Votre facture", "Votre facture est prête.");
}
public function applyDiscount(float $total, string $customerType): float {
if($customerType === 'vip') {
return $total * 0.90;
} elseif($customerType === 'regular') {
return $total * 0.95;
}
return $total;
}
}
/*
=== USER STORIES ===
US1: En tant que comptable, je veux pouvoir générer des factures au format Excel
en plus de PDF et HTML.
US2: En tant que développeur, je veux écrire des tests unitaires pour le calcul
des taxes sans dépendre de la base de données.
US3: En tant que product owner, je veux ajouter un nouveau type de client "entreprise"
avec 10% de réduction.
US4: En tant que développeur, je veux remplacer l'envoi par email par un système
de notification (email, SMS ou push) selon les préférences du client.
US5: En tant que comptable, je veux appliquer des taux de TVA différents selon
le type de produit (alimentaire 5.5%, autres 20%).
*/