1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-24 23:59:40 +02:00

Add RejectedTransfer model, simplify auto matching (#1690)
Some checks are pending
Publish Docker image / ci (push) Waiting to run
Publish Docker image / Build docker image (push) Blocked by required conditions

* Allow transfers to match when inflow is after outflow

* Simplify transfer auto matching with RejectedTransfer model

* Validations

* Reset migrations
This commit is contained in:
Zach Gollwitzer 2025-01-27 16:56:46 -05:00 committed by GitHub
parent 0b4e314f58
commit de90b29201
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 221 additions and 79 deletions

View file

@ -1,7 +1,7 @@
require "test_helper"
class AccountTest < ActiveSupport::TestCase
include SyncableInterfaceTest
include SyncableInterfaceTest, Account::EntriesTestHelper
setup do
@account = @syncable = accounts(:depository)
@ -65,4 +65,38 @@ class AccountTest < ActiveSupport::TestCase
assert_equal 0, @account.series(currency: "NZD").values.count
end
end
test "auto-matches transfers" do
outflow_entry = create_transaction(date: 1.day.ago.to_date, account: @account, amount: 500)
inflow_entry = create_transaction(date: Date.current, account: accounts(:credit_card), amount: -500)
assert_difference -> { Transfer.count } => 1 do
@account.auto_match_transfers!
end
end
# In this scenario, our matching logic should find 4 potential matches. These matches should be ranked based on
# days apart, then de-duplicated so that we aren't auto-matching the same transaction across multiple transfers.
test "when 2 options exist, only auto-match one at a time, ranked by days apart" do
yesterday_outflow = create_transaction(date: 1.day.ago.to_date, account: @account, amount: 500)
yesterday_inflow = create_transaction(date: 1.day.ago.to_date, account: accounts(:credit_card), amount: -500)
today_outflow = create_transaction(date: Date.current, account: @account, amount: 500)
today_inflow = create_transaction(date: Date.current, account: accounts(:credit_card), amount: -500)
assert_difference -> { Transfer.count } => 2 do
@account.auto_match_transfers!
end
end
test "does not auto-match any transfers that have been rejected by user already" do
outflow = create_transaction(date: Date.current, account: @account, amount: 500)
inflow = create_transaction(date: Date.current, account: accounts(:credit_card), amount: -500)
RejectedTransfer.create!(inflow_transaction_id: inflow.entryable_id, outflow_transaction_id: outflow.entryable_id)
assert_no_difference -> { Transfer.count } do
@account.auto_match_transfers!
end
end
end