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);