diff --git a/modules/budget/views/suivi.php b/modules/budget/views/suivi.php index 6f611b6..03bf5cf 100644 --- a/modules/budget/views/suivi.php +++ b/modules/budget/views/suivi.php @@ -181,12 +181,15 @@ $solde_actuel = $snapshot['amount']; $solde_theorique = $solde_actuel; // On part du solde actuel $today_day = (int)date('j'); +// CALCUL DU THEORIQUE PARTIE 1 : Appliquer les mouvements saisis après la date du relevé if (!empty($snapshot['date'])) { try { $stmtCalc = $pdo->prepare("SELECT SUM(amount) as total_diff FROM pf_expenses WHERE date_exp > ?"); $stmtCalc->execute([$snapshot['date']]); $resDiff = $stmtCalc->fetch(PDO::FETCH_ASSOC); if ($resDiff && $resDiff['total_diff'] !== null) { + // total_diff est positif pour les dépenses, négatif pour les revenus. + // On le soustrait donc au solde théorique. $solde_theorique -= (float)$resDiff['total_diff']; } } catch (Exception $e) {} @@ -230,6 +233,7 @@ while ($item = $stmt->fetch(PDO::FETCH_ASSOC)) { if (!$isPaid) { $reste_a_venir += $rawAmount; + // CALCUL DU THEORIQUE PARTIE 2 : Déduire les charges qui auraient dû passer if ($pDay > 0 && $pDay <= $today_day) { $solde_theorique -= $rawAmount; } @@ -325,39 +329,57 @@ $allExpenses = $stmt->fetchAll(PDO::FETCH_ASSOC); $totals = array_fill_keys(array_keys($categoriesConfig), 0); $expensesByCategory = array_fill_keys(array_keys($categoriesConfig), []); +// Préparation de la capacité max +$capacite_max = 0; + foreach ($allExpenses as $exp) { $cat = $exp['category']; if (!isset($totals[$cat])) $cat = 'Autres'; - // Le Vase d'Expansion fonctionne ici : + $val = (float)$exp['amount']; + + // Remplissage des totaux des cartes if ($cat === 'Income') { - $totals[$cat] += abs($exp['amount']); + $totals[$cat] += abs($val); } else { - if ($exp['amount'] < 0) { - $categoriesConfig[$cat]['budget'] += abs($exp['amount']); + if ($val < 0) { + $categoriesConfig[$cat]['budget'] += abs($val); } else { - $totals[$cat] += $exp['amount']; + $totals[$cat] += $val; } } $expensesByCategory[$cat][] = $exp; + + // Calcul de la Capacité Max de la jauge + if ($cat === 'Income') { + // Règle 1 : Somme des virements Revenus (val est négatif en base) + $capacite_max -= $val; + } else { + // Règle 2 : Tout autre virement positif (val est négatif) non charge fixe + if ($val < 0 && $cat !== 'Frais') { + $capacite_max += abs($val); + } + } } -// --- Calculs pour la Barre de Déchargement --- +// Sécurité : Si 0 injection ce mois-ci, on se base sur le prévisionnel pour avoir une jauge visuelle +if ($capacite_max <= 0) { + $capacite_max = $budget_income_prevu > 0 ? $budget_income_prevu : 1; +} + +// --- Calculs finaux pour la Barre de Déchargement --- $solde_actuel = max(0, $snapshot['amount']); $charges_a_venir = max(0, $reste_a_venir); $solde_net = max(0, $solde_actuel - $charges_a_venir); -$charges_visibles = min($solde_actuel, $charges_a_venir); // On ne peut pas afficher plus de charges que ce qu'il reste sur le compte +$charges_visibles = min($solde_actuel, $charges_a_venir); -// L'échelle max (100% de la barre) s'adapte à ton solde max ou ton budget prévu -$max_scale = max($solde_actuel, $solde_theorique, $budget_income_prevu, 1); +// Echelle Max (+10% pour l'esthétique) +$max_scale = max($solde_actuel, $solde_theorique, $capacite_max, 1) * 1.1; -// Pourcentages (largeurs) -$pct_net = ($solde_net / $max_scale) * 100; -$pct_charges = ($charges_visibles / $max_scale) * 100; - -// Placements des repères (bloqués entre 0 et 100%) -$pct_theorique = min(100, max(0, ($solde_theorique / $max_scale) * 100)); +$pct_net = min(100, max(0, ($solde_net / $max_scale) * 100)); +$pct_charges = min(100 - $pct_net, max(0, ($charges_visibles / $max_scale) * 100)); $pct_actuel = min(100, max(0, ($solde_actuel / $max_scale) * 100)); +$pct_theorique = min(100, max(0, ($solde_theorique / $max_scale) * 100)); function getDisplayLogic($spent, $bg, $type) { if ($type === 'credit') { @@ -393,7 +415,6 @@ $monthName = $moisFr[(int)$currentMonth] . ' ' . $currentYear;