prepare(" SELECT title, amount, expected_date FROM pf_expected_expenses WHERE is_paid = 0 AND YEAR(expected_date) = ? AND MONTH(expected_date) = ? ORDER BY expected_date ASC "); $stmtExpenses->execute([$current_year, $current_month]); $expenses = $stmtExpenses->fetchAll(PDO::FETCH_ASSOC); $q1_expenses_total = 0; $q2_expenses_total = 0; $detail_html = ''; $total_expenses = $q1_expenses_total + $q2_expenses_total; // 2. Récupération des dettes $stmtDebts = $pdo->query("SELECT payer, SUM(amount) as total_debt FROM pf_advances WHERE is_resolved = 0 GROUP BY payer"); $debts = $stmtDebts->fetchAll(PDO::FETCH_KEY_PAIR); // 3. NOUVELLE LOGIQUE : Clearing intelligent (Compensation partielle ou totale) $total_base_inputs = array_sum(array_map('floatval', $savings_inputs)); $surplus_for_clearing = $total_base_inputs - $total_expenses; $monthly_savings = 0; // Le vrai total qui sera viré après déduction des dettes $contributions_html = ''; $contributions_html .= '

Total net atterrissant sur les comptes : ' . number_format($monthly_savings, 2, ',', ' ') . ' €

'; if(empty($expenses)) { $detail_html = '

🎉 Aucune grosse dépense enregistrée sur ce mois.

'; } // --- MOTEUR DE RÈGLES DES QUINZAINES (Remplacement des ** par ) --- $instructions = []; $remaining_to_allocate = $monthly_savings; // Règle 1 : Première quinzaine if ($q1_expenses_total > 0) { if ($remaining_to_allocate >= $q1_expenses_total) { $remaining_to_allocate -= $q1_expenses_total; $instructions[] = "💼 Dès le 1er : Laissez " . number_format($q1_expenses_total, 2, ',', ' ') . " € sur le compte commun pour honorer les dépenses de la 1ère quinzaine."; } else { $deficit = $q1_expenses_total - $remaining_to_allocate; $remaining_to_allocate = 0; $instructions[] = "💼 Dès le 1er : Gardez l'intégralité des apports sur le compte commun."; $instructions[] = "⚠️ Retrait requis : Retirez " . number_format($deficit, 2, ',', ' ') . " € depuis le Livret A vers le commun pour couvrir la 1ère quinzaine."; } } // Règle 2 : Deuxième quinzaine if ($q2_expenses_total > 0) { if ($remaining_to_allocate >= $q2_expenses_total) { $remaining_to_allocate -= $q2_expenses_total; $instructions[] = "📈 Dès le 1er : Placez " . number_format($q2_expenses_total, 2, ',', ' ') . " € sur le Livret A pour générer des intérêts sur la 1ère quinzaine."; $instructions[] = "🔄 Le 16 du mois : Transférez ces " . number_format($q2_expenses_total, 2, ',', ' ') . " € sur le compte commun pour payer la dépense."; } else { if ($remaining_to_allocate > 0) { $instructions[] = "📈 Dès le 1er : Placez le reste des apports (" . number_format($remaining_to_allocate, 2, ',', ' ') . " €) sur le Livret A."; $instructions[] = "🔄 Le 16 du mois : Retirez " . number_format($q2_expenses_total, 2, ',', ' ') . " € global du Livret A pour payer la fin de mois."; $remaining_to_allocate = 0; } else { $instructions[] = "🔄 Le 16 du mois : Retirez " . number_format($q2_expenses_total, 2, ',', ' ') . " € du Livret A vers le commun. Ne le faites pas avant le 16 !"; } } } // Solde résiduel long terme if ($remaining_to_allocate > 0) { $instructions[] = "💰 Épargne stable : Placez les " . number_format($remaining_to_allocate, 2, ',', ' ') . " € restants sur votre Livret A dès le 1er."; } // --- CONSTITUTION DU RENDU HTML FINAL --- $html = '
'; // Titre de l'état du Clearing simplifié et clair $html .= '

🤝 Résumé des apports et remboursements internes :

'; $html .= '
'; $html .= $contributions_html; $html .= '
'; $html .= '

Analyse des dépenses du mois :

'; $html .= $detail_html; $html .= '
'; $html .= '

📋 Plan d\'action recommandé :

'; foreach ($instructions as $ins) { $html .= '

' . $ins . '

'; } $html .= '
'; echo json_encode(['success' => true, 'html' => $html]); } catch (PDOException $e) { echo json_encode(['success' => false, 'message' => 'Calcul impossible : ' . $e->getMessage()]); }