1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-19 05:09:38 +02:00
Maybe/app/models/transaction_import.rb

70 lines
1.7 KiB
Ruby
Raw Normal View History

class TransactionImport < Import
def import!
transaction do
mappings.each(&:create_mappable!)
transactions = rows.map do |row|
mapped_account = if account
account
else
mappings.accounts.mappable_for(row.account)
end
category = mappings.categories.mappable_for(row.category)
tags = row.tags_list.map { |tag| mappings.tags.mappable_for(tag) }.compact
Transaction.new(
category: category,
tags: tags,
entry: Entry.new(
account: mapped_account,
date: row.date_iso,
amount: row.signed_amount,
name: row.name,
currency: row.currency,
notes: row.notes,
import: self
)
)
end
Transaction.import!(transactions, recursive: true)
end
end
def required_column_keys
%i[date amount]
end
def column_keys
base = %i[date amount name currency category tags notes]
base.unshift(:account) if account.nil?
base
end
def mapping_steps
base = [ Import::CategoryMapping, Import::TagMapping ]
base << Import::AccountMapping if account.nil?
base
end
def selectable_amount_type_values
return [] if entity_type_col_label.nil?
csv_rows.map { |row| row[entity_type_col_label] }.uniq
end
def csv_template
template = <<-CSV
date*,amount*,name,currency,category,tags,account,notes
05/15/2024,-45.99,Grocery Store,USD,Food,groceries|essentials,Checking Account,Monthly grocery run
05/16/2024,1500.00,Salary,,Income,,Main Account,
05/17/2024,-12.50,Coffee Shop,,,coffee,,
CSV
csv = CSV.parse(template, headers: true)
csv.delete("account") if account.present?
csv
end
end