From b3137e63b289e213b670b0ef488de63bc3647774 Mon Sep 17 00:00:00 2001 From: Anuj Rajput Date: Wed, 22 Oct 2025 16:15:45 +0530 Subject: [PATCH 1/3] Fixes https://github.com/BearTS/actual-budget-app/issues/7 Creates a credit transfer transaction in the credit account when another account is selected when creating a transfer --- .../Features/Transactions/TransactionEditor.swift | 15 ++++++++++++--- .../Features/Transactions/TransactionsView.swift | 2 +- iOSApp/UI/TransactionRow.swift | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/iOSApp/Features/Transactions/TransactionEditor.swift b/iOSApp/Features/Transactions/TransactionEditor.swift index 0241a21..c1ede31 100644 --- a/iOSApp/Features/Transactions/TransactionEditor.swift +++ b/iOSApp/Features/Transactions/TransactionEditor.swift @@ -19,6 +19,7 @@ struct TransactionEditor: View { @State private var amountString: String @State private var isNegative: Bool @State private var selectedPayeeId: String + @State private var selectedTransferId: String? @State private var customPayee: String @State private var payeeMode: PayeeInputMode @State private var notes: String @@ -40,6 +41,7 @@ struct TransactionEditor: View { _selectedPayeeId = State(initialValue: payeeId) _payeeMode = State(initialValue: .picker) _customPayee = State(initialValue: "") + _selectedTransferId = State(initialValue: t.transfer_id) } else if let payeeName = t.payee_name, !payeeName.isEmpty { _customPayee = State(initialValue: payeeName) _payeeMode = State(initialValue: .custom) @@ -64,6 +66,7 @@ struct TransactionEditor: View { _notes = State(initialValue: "") _categoryId = State(initialValue: nil) _selectedAccountId = State(initialValue: initialAccountId ?? "") + _selectedTransferId = State(initialValue: nil) } } @@ -131,6 +134,9 @@ struct TransactionEditor: View { Text(payee.name).tag(payee.id) } } + .onChange(of: selectedPayeeId) { oldValue, newValue in + selectedTransferId = payees.first(where: { $0.id == newValue })?.transfer_acct + } } else { TextField("Payee Name", text: $customPayee) } @@ -154,6 +160,7 @@ struct TransactionEditor: View { let signed = isNegative ? -abs(units) : abs(units) let payeeId: String? = payeeMode == .picker ? (selectedPayeeId.isEmpty ? nil : selectedPayeeId) : nil + let transferId: String? = selectedTransferId let payeeName: String? = payeeMode == .custom ? (customPayee.isEmpty ? nil : customPayee) : nil return Transaction( @@ -166,7 +173,9 @@ struct TransactionEditor: View { imported_payee: nil, category: categoryId, notes: notes.isEmpty ? nil : notes, - imported_id: nil, transfer_id: nil, cleared: false, subtransactions: nil + imported_id: nil, + transfer_id: transferId, + cleared: false, subtransactions: nil ) } @@ -177,7 +186,7 @@ struct TransactionEditor: View { if let id = built.id { try await client().updateTransaction(transactionId: id, transaction: built) } else { - try await client().createTransaction(accountId: built.account, transaction: built) + try await client().createTransaction(accountId: built.account, transaction: built, runTransfers: (built.transfer_id != nil)) } onSave(built) dismiss() @@ -229,4 +238,4 @@ struct TransactionEditor: View { private func parseAmountFromDisplay(_ display: String) -> Int { Int((Double(display.replacingOccurrences(of: ",", with: ".")) ?? 0.0) * 100) } -} \ No newline at end of file +} diff --git a/iOSApp/Features/Transactions/TransactionsView.swift b/iOSApp/Features/Transactions/TransactionsView.swift index 7242875..6bb5cc8 100644 --- a/iOSApp/Features/Transactions/TransactionsView.swift +++ b/iOSApp/Features/Transactions/TransactionsView.swift @@ -178,7 +178,7 @@ struct TransactionsView: View { private func payeeText(_ tx: Transaction) -> String { if let account = transferDestinationAccount(tx) { - return "Transfer to: \(account.name)" + return "Transfer \((tx.amount ?? 0) < 0 ? "to" : "from"): \(account.name)" } if let payeeId = tx.payee, let p = payeesById[payeeId] { return p.name } if let n = tx.payee_name, !n.isEmpty { return n } diff --git a/iOSApp/UI/TransactionRow.swift b/iOSApp/UI/TransactionRow.swift index b12a656..f4aed9f 100644 --- a/iOSApp/UI/TransactionRow.swift +++ b/iOSApp/UI/TransactionRow.swift @@ -52,7 +52,7 @@ struct TransactionRow: View { private func primaryText() -> String { if let account = transferDestinationAccount(transaction) { - return "Transfer to: \(account.name)" + return "Transfer \((transaction.amount ?? 0) < 0 ? "to" : "from"): \(account.name)" } if let payeeId = transaction.payee, let p = payeesById[payeeId] { return p.name } if let n = transaction.payee_name, !n.isEmpty { return n } From b213364e800bf39ae9e2b26ea5e8d6f0e3321721 Mon Sep 17 00:00:00 2001 From: Anuj Rajput Date: Thu, 23 Oct 2025 09:43:48 +0530 Subject: [PATCH 2/3] Moved out setting selectedTransferId --- iOSApp/Features/Transactions/TransactionEditor.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOSApp/Features/Transactions/TransactionEditor.swift b/iOSApp/Features/Transactions/TransactionEditor.swift index c1ede31..06186aa 100644 --- a/iOSApp/Features/Transactions/TransactionEditor.swift +++ b/iOSApp/Features/Transactions/TransactionEditor.swift @@ -41,7 +41,6 @@ struct TransactionEditor: View { _selectedPayeeId = State(initialValue: payeeId) _payeeMode = State(initialValue: .picker) _customPayee = State(initialValue: "") - _selectedTransferId = State(initialValue: t.transfer_id) } else if let payeeName = t.payee_name, !payeeName.isEmpty { _customPayee = State(initialValue: payeeName) _payeeMode = State(initialValue: .custom) @@ -55,6 +54,7 @@ struct TransactionEditor: View { _notes = State(initialValue: t.notes ?? "") _categoryId = State(initialValue: t.category) _selectedAccountId = State(initialValue: t.account) + _selectedTransferId = State(initialValue: t.transfer_id) } else { // Creating a new transaction: Initialize with default values _date = State(initialValue: Date()) From 9ac69a16aac37d59f7ed9a766dd417329fae357b Mon Sep 17 00:00:00 2001 From: Anuj Rajput Date: Thu, 23 Oct 2025 09:47:34 +0530 Subject: [PATCH 3/3] Cleaning up --- iOSApp/Features/Transactions/TransactionEditor.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/iOSApp/Features/Transactions/TransactionEditor.swift b/iOSApp/Features/Transactions/TransactionEditor.swift index 06186aa..3e022e2 100644 --- a/iOSApp/Features/Transactions/TransactionEditor.swift +++ b/iOSApp/Features/Transactions/TransactionEditor.swift @@ -160,7 +160,6 @@ struct TransactionEditor: View { let signed = isNegative ? -abs(units) : abs(units) let payeeId: String? = payeeMode == .picker ? (selectedPayeeId.isEmpty ? nil : selectedPayeeId) : nil - let transferId: String? = selectedTransferId let payeeName: String? = payeeMode == .custom ? (customPayee.isEmpty ? nil : customPayee) : nil return Transaction( @@ -174,7 +173,7 @@ struct TransactionEditor: View { category: categoryId, notes: notes.isEmpty ? nil : notes, imported_id: nil, - transfer_id: transferId, + transfer_id: selectedTransferId, cleared: false, subtransactions: nil ) }