diff --git a/modules/budget/includes/api/save-budget.php b/modules/budget/includes/api/save-budget.php index c5854f5..4c58629 100644 --- a/modules/budget/includes/api/save-budget.php +++ b/modules/budget/includes/api/save-budget.php @@ -199,8 +199,22 @@ if ($action === 'validate_transfers') { $stmtAcc = $pdo->query("SELECT a.name as acc_name, p.name as owner_name FROM pf_bank_accounts a LEFT JOIN pf_people p ON a.owner_person_id = p.id"); $bankAccountsMap = []; + + // Fallback intelligent : on récupère tous les prénoms de la famille + $familyNames = $pdo->query("SELECT name FROM pf_people")->fetchAll(PDO::FETCH_COLUMN); + while ($row = $stmtAcc->fetch(PDO::FETCH_ASSOC)) { - $bankAccountsMap['vers ' . $row['acc_name']] = $row['owner_name']; + $owner = $row['owner_name']; + if (!$owner) { + // Si pas de propriétaire explicite, on cherche un prénom dans le nom du compte (ex: "Livret A Alex") + foreach ($familyNames as $pName) { + if (stripos($row['acc_name'], $pName) !== false) { + $owner = $pName; + break; + } + } + } + $bankAccountsMap['vers ' . $row['acc_name']] = $owner; } $stmt = $pdo->prepare(" diff --git a/modules/budget/includes/api/settings.php b/modules/budget/includes/api/settings.php index cd75844..6def90d 100644 --- a/modules/budget/includes/api/settings.php +++ b/modules/budget/includes/api/settings.php @@ -45,6 +45,9 @@ try { $currencySetting = $foyerData['currency'] ?? '€'; $csvMapping = !empty($foyerData['csv_mapping']) ? json_decode($foyerData['csv_mapping'], true) : null; + // 6. Liste des membres (pour assigner un compte bancaire) + $people = $pdo->query("SELECT id, name FROM pf_people WHERE is_active = 1 ORDER BY name ASC")->fetchAll(PDO::FETCH_ASSOC); + echo json_encode([ 'success' => true, 'data' => [ @@ -52,6 +55,7 @@ try { 'categories' => $categories, 'rules' => $rules, 'salaries' => $salaries, + 'people' => $people, 'year' => $currentYear, 'currency' => $currencySetting, 'csv_mapping' => $csvMapping @@ -64,9 +68,10 @@ try { if ($action === 'add_account') { $name = trim($_POST['name'] ?? ''); $type = $_POST['type'] ?? 'checking'; + $owner_id = !empty($_POST['owner_person_id']) ? (int)$_POST['owner_person_id'] : null; if (empty($name)) throw new Exception("Le nom du compte est obligatoire."); - $stmt = $pdo->prepare("INSERT INTO pf_bank_accounts (name, account_type, is_default) VALUES (?, ?, 0)"); - $stmt->execute([$name, $type]); + $stmt = $pdo->prepare("INSERT INTO pf_bank_accounts (name, account_type, is_default, owner_person_id) VALUES (?, ?, 0, ?)"); + $stmt->execute([$name, $type, $owner_id]); echo json_encode(['success' => true]); exit; } diff --git a/modules/budget/views/settings_modal.php b/modules/budget/views/settings_modal.php index c1d8491..61c6a6a 100644 --- a/modules/budget/views/settings_modal.php +++ b/modules/budget/views/settings_modal.php @@ -80,6 +80,9 @@ if (!defined('CURRENCY')) { + @@ -250,11 +253,21 @@ function switchBsTab(tabId, btnEl) { } async function loadBudgetSettingsData() { - try { - const response = await pachaFetch('/modules/budget/includes/api/settings.php?action=get_all', { method: 'GET' }); - if (!response.success) throw new Error(response.error || tr('error_occured')); - renderAccounts(response.data.accounts); - renderCategories(response.data.categories); + try { + const response = await pachaFetch('/modules/budget/includes/api/settings.php?action=get_all', { method: 'GET' }); + if (!response.success) throw new Error(response.error || tr('error_occured')); + + // Alimenter la liste des propriétaires pour les comptes + const ownerSelect = document.getElementById('select-account-owner'); + if (ownerSelect && response.data.people) { + ownerSelect.innerHTML = ''; + response.data.people.forEach(p => { + ownerSelect.innerHTML += ``; + }); + } + + renderAccounts(response.data.accounts); + renderCategories(response.data.categories); populateRuleCategories(response.data.categories); renderRules(response.data.rules); renderSalaries(response.data.salaries, response.data.year);