mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-23 23:29:39 +02:00
Fix duplicate category creation on import (#791)
* Repro * Fix * Update signage
This commit is contained in:
parent
77f166a5f8
commit
41c991384a
4 changed files with 24 additions and 12 deletions
|
@ -110,9 +110,13 @@ class Import < ApplicationRecord
|
||||||
|
|
||||||
def generate_transactions
|
def generate_transactions
|
||||||
transactions = []
|
transactions = []
|
||||||
|
category_cache = {}
|
||||||
|
|
||||||
csv.table.each do |row|
|
csv.table.each do |row|
|
||||||
category = account.family.transaction_categories.find_or_initialize_by(name: row["category"]) if row["category"].present?
|
category_name = row["category"]
|
||||||
|
|
||||||
|
category = category_cache[category_name] ||= account.family.transaction_categories.find_or_initialize_by(name: category_name) if row["category"].present?
|
||||||
|
|
||||||
txn = account.transactions.build \
|
txn = account.transactions.build \
|
||||||
name: row["name"].presence || FALLBACK_TRANSACTION_NAME,
|
name: row["name"].presence || FALLBACK_TRANSACTION_NAME,
|
||||||
date: Date.iso8601(row["date"]),
|
date: Date.iso8601(row["date"]),
|
||||||
|
|
16
test/fixtures/imports.yml
vendored
16
test/fixtures/imports.yml
vendored
|
@ -6,12 +6,16 @@ loaded_import:
|
||||||
account: checking
|
account: checking
|
||||||
raw_csv_str: |
|
raw_csv_str: |
|
||||||
date,name,category,amount
|
date,name,category,amount
|
||||||
2024-01-01,Starbucks drink,Food,20
|
2024-01-01,Starbucks drink,Food & Drink,-8.55
|
||||||
2024-01-02,Amazon stuff,Shopping,200
|
2024-01-01,Etsy,Shopping,-80.98
|
||||||
|
2024-01-02,Amazon stuff,Shopping,-200
|
||||||
|
2024-01-03,Paycheck,Income,1000
|
||||||
normalized_csv_str: |
|
normalized_csv_str: |
|
||||||
date,name,category,amount
|
date,name,category,amount
|
||||||
2024-01-01,Starbucks drink,Food,20
|
2024-01-01,Starbucks drink,Food & Drink,-8.55
|
||||||
2024-01-02,Amazon stuff,Shopping,200
|
2024-01-01,Etsy,Shopping,-80.98
|
||||||
|
2024-01-02,Amazon stuff,Shopping,-200
|
||||||
|
2024-01-03,Paycheck,Income,1000
|
||||||
created_at: <%= 2.days.ago %>
|
created_at: <%= 2.days.ago %>
|
||||||
|
|
||||||
completed_import:
|
completed_import:
|
||||||
|
@ -23,10 +27,10 @@ completed_import:
|
||||||
amount: amount
|
amount: amount
|
||||||
raw_csv_str: |
|
raw_csv_str: |
|
||||||
date,name,category,amount
|
date,name,category,amount
|
||||||
2024-01-01,Starbucks drink,Food,20
|
2024-01-01,Starbucks drink,Food & Drink,-20
|
||||||
normalized_csv_str: |
|
normalized_csv_str: |
|
||||||
date,name,category,amount
|
date,name,category,amount
|
||||||
2024-01-01,Starbucks drink,Food,20
|
2024-01-01,Starbucks drink,Food & Drink,-20
|
||||||
created_at: <%= 2.days.ago %>
|
created_at: <%= 2.days.ago %>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,10 @@ class ImportTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test "publishes a valid import" do
|
test "publishes a valid import" do
|
||||||
assert_difference -> { Transaction::Category.count } => 2, -> { Transaction.count } => 2 do
|
# Import has 3 unique categories: "Food & Drink", "Income", and "Shopping" (x2)
|
||||||
|
# Fixtures already define "Food & Drink" and "Income", so these should not be created
|
||||||
|
# "Shopping" is a new category, but should only be created 1x during import
|
||||||
|
assert_difference -> { Transaction.count } => 4, -> { Transaction::Category.count } => 1 do
|
||||||
@loaded_import.publish
|
@loaded_import.publish
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,9 @@ module ImportTestHelper
|
||||||
def valid_csv_str
|
def valid_csv_str
|
||||||
<<-ROWS
|
<<-ROWS
|
||||||
date,name,category,amount
|
date,name,category,amount
|
||||||
2024-01-01,Starbucks drink,Food,20
|
2024-01-01,Starbucks drink,Food,-20
|
||||||
2024-01-02,Amazon stuff,Shopping,200
|
2024-01-02,Amazon stuff,Shopping,-200
|
||||||
|
2024-01-03,Paycheck,Income,1000
|
||||||
ROWS
|
ROWS
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -17,8 +18,8 @@ module ImportTestHelper
|
||||||
def valid_csv_with_missing_data
|
def valid_csv_with_missing_data
|
||||||
<<-ROWS
|
<<-ROWS
|
||||||
date,name,category,"optional id",amount
|
date,name,category,"optional id",amount
|
||||||
2024-01-01,Drink,Food,1234,200
|
2024-01-01,Drink,Food,1234,-200
|
||||||
2024-01-02,,,,100
|
2024-01-02,,,,-100
|
||||||
ROWS
|
ROWS
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue